ROOT version 6.30/00 was released on November 6, 2023.
For more information, see:
The following people have contributed to this new version:
Daniel Álvarez Conde, CERN/EP-SFT,
Guilherme Amadio, CERN/IT,
Bertrand Bellenot, CERN/EP-SFT,
Jakob Blomer, CERN/EP-SFT,
Patrick Bos, Netherlands eScience Center,
Rene Brun,
Carsten Burgard, TU Dortmund,
Will Buttinger, Rutherford Appleton Lab,
Philippe Canal, FNAL,
Olivier Couet, CERN/EP-SFT,
Marta Czurylo, CERN/EP-SFT,
Mattias Ellert, Uppsala Uni,
Edward Finkelstein, JGU Mainz,
Gerri Ganis, CERN/EP-SFT,
Paul Gessinger, CERN/EP-SFT,
Florine de Geus, CERN/ATLAS,
Andrei Gheata, CERN/EP-SFT,
Enrico Guiraud, CERN/EP-SFT and Princeton,
Ahmat Hamdan, CERN/EP-SFT,
Stephan Hageboeck, CERN/IT,
Jonas Hahnfeld, CERN/EP-SFT,
Fernando Hueso González, CSIC/UV,
Attila Krasznahorkay, CERN/ATLAS,
Baidyanath Kundu, CERN/EP-SFT and Princeton,
Giovanna Lazzari Miotto, CERN/EP-SFT,
Sergey Linev, GSI,
Jerry Ling, Harvard Uni,
Javier Lopez-Gomez, CERN/EP-SFT,
Pere Mato, CERN/EP-SFT,
Lorenzo Moneta, CERN/EP-SFT,
Ole Morud, CERN/EP-SFT,
Alja Mrak Tadel, UCSD/CMS,
Axel Naumann, CERN/EP-SFT,
Dante Niewenhuis, UvA and CERN/EP-SFT,
Vincenzo Eduardo Padulano, CERN/EP-SFT,
Ioanna Maria Panagou, CERN/EP-SFT,
Danilo Piparo, CERN/EP-SFT,
QuillPusher, Compiler Research
Group,
Fons Rademakers, CERN/IT,
Jonas Rembser, CERN/EP-SFT,
Jakob Schneekloth, CERN/EP-SFT,
Sanjiban Sengupta, CERN/EP-SFT,
Neel Shah, GSoC,
Garima Singh, CERN/EP-SFT and Princeton,
Yash Solanki, GSoC,
Uri Stern, CERN/EP-SFT,
Silia Taider, CPE Lyon and CERN EP-SFT,
Enric Tejedor Saavedra, CERN/IT,
Matevz Tadel, UCSD/CMS,
Vassil Vassilev, Princeton/CMS,
Wouter Verkerke, NIKHEF/ATLAS,
Daniel Werner, CERN/EP-SFT,
Zef Wolffs, NIKHEF/ATLAS
The following previously deprecated build options have been removed:
The following build options have now been deprecated and will be removed in the future v6.32:
Please let us know at rootdev@cern.ch if their planned removal would cause problems for you!
ROOT::RDF::RResultHandle::GetResultPtr
has been
deprecated. Please use RResultPtr
directly instead and only
cast to RResultHandle
in order to call
ROOT::RDF::RunGraphs
.MakeCsvDataFrame
,
MakeArrowDataFrame
, MakeNTupleDataFrame
and
MakeSqliteDataFrame
that were deprecated in v6.28 have been
removed. Use FromCSV
, FromArrow
,
FromRNTuple
or FromSqlite
instead.TStorage::ReAlloc(void *ovp, size_t size
) and heap related
routines (TStorage::AddToHeap
,
TStorage::IsOnHeap
, TStorage::GetHeapBegin
,
TStorage::GetHeapEnd
) that were deprecated in v6.02/00 have
been removed.Format(const char* option, int sigDigits)
option for
RooAbsPdf::paramOn()
was removed. Please use the
Format(const char* option, ...)
overload that takes command
arguments.RooAbsPdf::paramOn()
overload that
directly takes a formatting string was removed. Please take the overload
that uses command arguments.RooCatType
class was deprecated in ROOT 6.22 and
its original RooCatType.h
header is now removed. If you
still need access to this class, please include
RooFitLegacy/RooCatTypeLegacy.h
.RooAbsString
that was only an alias for
RooStringVar
got removed.RooDataWeightedAverage
is now deprecated and will
be removed in 6.32. It was only supposed to be an implementation detail
of RooFits plotting that is now not necessary anymore.RooSpan
class was removed and its place in the
implementation details of RooFit is now taken by
std::span
.RooAbsArg::isCloneOf()
and
RooAbsArg::getCloningAncestors()
member functions were
removed because they didn’t work (always returned false
and
an empty list respectively)ROOT::Math::KelvinFunctions
had an incompatible license
and needed to be removed without deprecation.ROOT_GIT_BRANCH
and
ROOT_GIT_COMMIT
have been deprecated in favor of parsing
etc/gitinfo.txt
. This later file is now generated as part
of the build of ROOT; RGitCommit.h
(defining
ROOT_GIT_BRANCH
and ROOT_GIT_COMMIT
) is not
updated anymore. This simplifies ROOT’s build and release
procedure.std::thread
s.ROOT_MAX_THREADS
.TChain::Add
. Now
it supports the case of globbing files while also using the
?#
token to specify the tree name.Instead of returning nothing, ROOT::RDF::RunGraphs
now returns the number of separate computation graphs that have been
run.
Introduce ProgressBar
feature that can be added to any RDataFrame program.
The RDatasetSpec
class and its users now employ the
concept of ‘sample’ rather than the original naming ‘group’ for groups
of files with associated metadata.
df106_HiggsToFourLeptons
tutorials (both python and
C++) now showcase the ProgressBar
. They now use
FromSpec
to define multiple samples and Vary
for systematic variations.
Vastly improve runtime performance when using an RDataFrame with
simulated dataset, i.e. RDataFrame(nentries)
, by removing
usage of Range
operation to define the per-task entry
range.
Explicitly error out when trying to process a TTree with a TTreeIndex in distributed mode. The feature is currently not supported.
JITting the RDataFrame computation graph now only happens once per worker process, not once per task. This greatly reduces memory usage and runtime overhead at of each task.
Many bug fixes, improvements for multi-threaded usage, and optimizations.
ROOT’s experimental successor of TTree has seen a large number of updates during the last few months. Specifically, v6.30 includes the following changes:
Support for custom ROOT I/O rules that target transient members of a user-defined class (see PR #11944). If a rule only targets transient members and it was working in TTree, it should work unmodified in RNTuple.
Improved support for user-defined classes that behave as a
collection. Specifically, RNTuple now relies on the iterator interface
defined in TVirtualCollectionProxy
(see PR #12380 for
details). Note that associative collections are not yet
supported.
Support for new field types: std::bitset<N>
,
std::unique_ptr<T>
, std::set<T>
,
Double32_t
, scoped and unscoped enums with
dictionary.
Full support for late model extension, which allows the RNTuple
model to be extended after a RNTupleWriter
has been created
from the initial model (see PR #12376). New
top-level fields can be created at any time during the writing process.
On read-back, zero-initialized values are read for entries before the
field was first seen. The example below illustrates the use of this
feature.
auto model = RNTupleModel::Create();
auto fieldPt = model->MakeField<float>("pt", 42.0);
auto ntuple = RNTupleWriter::Recreate(std::move(model), "myNTuple", "out.ntuple");
->Fill();
ntuple
auto modelUpdater = ntuple->CreateModelUpdater();
->BeginUpdate();
modelUpdaterstd::array<double, 2> fieldArray;
->AddField<std::array<double, 2>>("array", &fieldArray);
modelUpdater->CommitUpdate();
modelUpdater
// After this point, entries will have a new field of type `std::array<double, 2>`
->Fill(); ntuple
Support for alternative column representations (Split / Zigzag
encoding). These encodings allow for better compression and are used by
default if compression is enabled. Alternatively, users can pick a
different column representation for a field by calling
RFieldBase::SetColumnRepresentative()
.
RNTuple now defaults to 64bit offset columns, which allow for representing large collections. RNTuple can still use 32bit offset columns, e.g.
;
RNTupleWriteOptions options.SetHasSmallClusters(true);
optionsauto writer = RNTupleWriter::Recreate(std::move(model), "myNTuple", "out.ntuple");
auto model = RNTupleModel::Create();
auto fvec = model->MakeField<std::vector<float>>("vec");
auto aliasVec = RFieldBase::Create("aliasVec", "std::vector<float>").Unwrap();
->AddProjectedField(std::move(aliasVec), [](const std::string &fieldName) {
modelif (fieldName == "aliasVec") return "vec";
else return "vec._0";
});
Projected fields are stored as part of the metadata.
Improvements on the internal RField
value API. The
RFieldValue
class has been deprecated in favor of
RField::Value
and the related interfaces have changed
accordingly (see #13219 and #13264). If
you were not using RField::(Read|Append)
directly, this
change should not impact you.
The new RNTupleImporter
class provides automatic
conversion of TTree to RNTuple. Note that not all of the C++ types
supported in TTree are currently supported in RNTuple.
Many bug fixes and performance improvements
Please, report any issues regarding the above mentioned features should you encounter them. RNTuple is still experimental and is scheduled to become production grade by end of 2024. Thus, we appreciate feedback and suggestions for improvement.
2D Scatter plots are a very popular way to represent scientific data. Many scientific plotting packages have this functionality. For many years ROOT itself as offered this kind of visualization dedicated drawing options for TGraph or TTree. But there was no simple way to produced 4D scatter plots from data stored in simple vectors. To fulfil these requirements the new class, TScatter, has been implemented. It is able to draw a four variables scatter plot on a single plot. A detailed description was given on the website as a blog-post.
Many ROOT-based frameworks and users employ Minuit2 as the minimizer of choice for a long time already. Therefore, Minuit2 is now the default minimizer used by ROOT. This affects also RooFit, which inherits the default minimizer from ROOT Math.
The default can be changed back to the old Minuit implementation as follows:
::Math::MinimizerOptions::SetDefaultMinimizer("Minuit"); ROOT
Alternatively, you can add this line to your ~/.rootrc
file:
Root.Fitter: Minuit
TMath::AreEqualAbs()
The TMath::AreEqualAbs()
compares two numbers for
equality within a certain absolute range. So far, it would tell you that
inf != inf
if you define inf
as
std::numeric_limits<double>::infinity()
, which is
inconsistent with the regular ==
operator.
This is unexpected, because one would expect that if two numbers are
considered exactly equal, they would also be considered equal within any
range. Therefore, the behavior of TMath::AreEqualAbs()
was
changed to return always true
if the ==
comparison would return true
.
The TFormula-based RooFit classes RooFormulaVar
and
RooGenericPdf
change a bit their behavior to be more
consistent:
dependents()
method of RooFormulaVar and
RooGenericPdf will only return the list of actual value servers.The RooGenFunction
was only a lightweight adaptor that
exports a RooAbsReal as a ROOT::Math::IGenFunction
. The
same can be easily achieved with the generic
ROOT::Math::Functor1D
, so in the spirit of not duplicating
interfaces, the RooGenFunction
is removed in this
release.
Here is an example that shows how to replace it in the unlikely case you were using it:
{x}; // normalization set
RooArgSet normSet
// Old way 1: create a RooGenFunction:
{pdf, x, {}, normSet};
RooGenFunction func1
// Old way 2: use `RooAbsReal::iGenFunction()`:
std::unique_ptr<ROOT::Math::IGenFunction> func2{
.iGenFunction(x, normSet)
pdf};
// How to do it now:
{pdf, x, {}, normSet};
RooFunctor functor::Math::Functor1D func3{functor};
ROOT// Functor1D takes by reference, so the RooFunctor also needs to stay alive.
For the same reason, the RooMultiGenFunction
class that
implements a multidimensional ROOT::Math::IMultiGenFunction
is removed too. It can easily be replaced by a
ROOT::Math::Functor
:
{pdf, observables, {}, normSet};
RooFunctor functor::Math::Functor func4{functor, static_cast<unsigned int>(functor.nObs())};
ROOT// Functor takes by reference, so the RooFunctor also needs to stay alive.
std::numeric_limits<double>::infinity()
RooFit has its internal representation of infinity in
RooNumber::infinity()
, which was 1e30
before.
Now, it is defined as
std::numeric_limits<double>::infinity()
, to be
consistent with the C++ standard library and other code.
This change also affects the RooNumber::isInfinite()
function.
add(row, weight, weightError)
from RooAbsData
interfaceIt was not good to have this signature in RooAbsData, because the implementations in the two derived classes RooDataHist and RooDataSet were inconsistent.
The RooDataSet indeed took the weight error as the third argument, but the RooDataHist version instead took the sum of weights squared, which is equivalent to the squared weight error.
Therefore, the virtual
RooAbsData::add(row, weight, weightError)
function was
removed.
RooMomentMorphND
classThe RooMomentMorphND
and
RooMomentMorphFuncND
were almost exactly the same, only
that one inherited from RooAbsPdf
and the other from
RooAbsReal
.
Thanks to the RooWrapperPdf
, this code duplication in
the RooFit implementation can now be avoided. Instead of using the
removed RooMomentMorphND
(which is the pdf), you now need
to use the RooMomentMorphFuncND
, change its behavior to
exactly match the former RooMomentMorphND
, and then wrap it
into a pdf object:
{<constructor args you previously passed to RooMomentMorphFunc>};
RooMomentMorphFuncND func
.setPdfMode(); // change behavior to be exactly like the former RooMomentMorphND
func
// Pass the selfNormalized=true` flag to the wrapper because the
.
RooMomentMorphFuncND already normalizes itself in pdf mode{"pdf_name", "pdf_name", func, /*selfNormalized=*/true}; RooWrapperPdf pdf
Several RooFit classes of which the headers are publicly exposed in the interface were only meant as implementation details of other RooFit classes. Some of these classes are now removed from the public interface:
RooGenProdProj
, which was an implementation detail
of the RooProdPdf
RooScaledFunc
, which was an implementation detail of
the plotting in RooFit In the supposedly very rare case where you used
this class in your own implementations, just multiply the underlying
RooAbsReal function with the scale factor and create a RooRealBinding,
e.g.:
{"scaled_func", "", func, scaleFactor};
RooProduct scaledFunc(scaledFunc, x) ; RooRealBinding scaleBind
instead of:
(func, x) ;
RooRealBinding binding(binding, scaleFactor); RooScaledFunc scaledBinding
The RooAbsRootFinder
, which was the base class of
RooBrentRootFinder
. The RooAbsRootFinder
was
only used as the base class of RooBrentRootFinder
, which is
an implementation detail of several RooFit/RooStats functions. However,
polymorphism never not relevant for root finding, so the
RooAbsRootFinder
is removed. In the rare case where you
might have used it, please ROOT’s other functionalities: RooFit is not
for root finding.
The RooFormula
class, which was not meant as a
user-facing class, but as a shared implementation detail of
RooFormulaVar
and RooGenericPdf
.
The RooIntegratorBinding
, which was an
implementation detail of the RooIntegrator2D
and
RooSegmentedIntegrator2D
classes.
The RooRealAnalytic
, which was an implementation
detail of the RooRealIntegral
class.
Extended()
command in RooAbsPdf::fitTo() and
RooAbsPdf::chi2FitTo()If no RooFit::Extended()
command argument is passed,
RooAbsPdf::chi2FitTo()
method now does an extended fit by
default if the pdf is extendible. This makes the behavior consistent
with RooAbsPdf::fitTo()
. Same applies to
RooAbsPdf::createChi2()
.
TMVA SOFIE now supports parsing and further inference of Graph Neural
Networks based on DeepMind’s graph_nets. The
list of all operators supported in the RModel
class is the
one provided below for the ONNX parser.
import graph_nets as gn
from graph_nets import utils_tf
GraphModule = gn.modules.GraphNetwork(
edge_model_fn=lambda: snt.nets.MLP([2,2], activate_final=True),
node_model_fn=lambda: snt.nets.MLP([2,2], activate_final=True),
global_model_fn=lambda: snt.nets.MLP([2,2], activate_final=True))
GraphData = get_graph_data_dict(2,1,2,2,2)
model = ROOT.TMVA.Experimental.SOFIE.RModel_GNN.ParseFromMemory(GraphModule, GraphData)
model.Generate()
model.OutputGenerated()
A complete tutorial for the SOFIE-GNN implementation can be found here
The ONNX parser supports now several new ONNX operators. The list of the current supported ONNX operator is the following: - Gemm - Conv (in 1D,2D and 3D) - RNN, GRU, LSTM - Relu, Selu, Sigmoid, Softmax, Tanh, LeakyRelu - BatchNormalization - MaxPool, AveragePool, GlobalAverage - ConvTranspose - Gather - Expand, Reduce - Neg, Exp, Sqrt, Reciprocal - Add, Sum, Mul, Div - Reshape, Flatten, Transpose - Squeeze, Unsqueeze, Slice - Concat, Reduce - Identity - Shape - Custom - Error - Log
Introduce TAxis::ChangeLabelByValue
to set custom
label defined by axis value. It works also when axis zooming changes and
position and index of correspondent axis label changes as well.
TAxis::ChangeLabel
method to change axis label by index
works as before.
Introduce TCanvas::SaveAll
method. Allows to store
several pads at once into different image file formats. File name can
include printf qualifier to code pad number. Also allows to store all
pads in single PDF or single ROOT file. Significantly improves
performance when creating many image files using web graphics.
Introduce TCanvas::UpdateAsync
method. In case of
web-based canvas triggers update of the canvas on the client side, but
does not wait that real update is completed. Avoids blocking of caller
thread. Have to be used if called from other web-based widget to avoid
logical dead-locks. In case of normal canvas just canvas->Update() is
performed.
RBatchGenerator
class and can be seamlessly
integrated in user code, for example:
python # Returns two generators that return training and validation batches as PyTorch tensors. gen_train, gen_validation = ROOT.TMVA.Experimental.CreatePyTorchGenerators( tree_name, file_name, batch_size, chunk_size, target=target, validation_split=0.3)
The functionality is also available for TensorFlow datasets and Python
generators of numpy arrays. See more in the
RBatchGenerator*
tutorials under the TMVA folder.tutorials/pyroot/pyroot004_NumbaDeclare.py
.dataframe/df106_HiggsToFourLeptons.C
now demonstrates
Vary()
, RDatasetSpec
(FromSpec()
), and AddProgressBar()
.RBatchGenerator
:
tutorials/tmva/RBatchGenerator_PyTorch.py
,
tutorials/tmva/RBatchGenerator_NumPy.py
,
tutorials/tmva/RBatchGenerator_TensorFlow.py
,
tutorials/tmva/RBatchGenerator_filters_vectors.py
.TScatter
class in
tutorials/graphs/scatter.C
.SOFIE
for fast inference in
tutorials/tmva/TMVA_SOFIE_RSofieReader.C
.root-config
(and many other versioning interfaces) now
reports 6.30.00
instead of 6.30/00
. This
allows many tools to understand ROOT’s version number, better than
before.
If -Droottest=ON
is specified, the ROOT build system
used to clone a matching branch of the roottest
repository.
This logic has been improved and is now as follows:
master
or v6-28-00-patches
, use the matching branch upstream;HEAD
’s parent commit;TH1::GetCumulative
doesn’t set the bin error for the
generated histogram, but change that of the original hist insteadRNTupleReader::Show()
produces empty output if
user does not impose a modelgDirectory
not properly updated when another
delete the file its point to.TClass::GetMethodWithPrototype
RooDataSets
into oneRooKeysPdf
fails if using protodata?#
syntax in
TChain::Add
RootMacros.cmake
on macOS 12.2.1, root version v6-26ROOT::Math::Minimizer
ignores error level if set
after the function in the case of analytical gradientRVec<T>
is broken for
non-trivially-constructible T
sRooProdPdf
test failure on s390xTTime
class is not splitableRDF::FromCSV
gives wrong output with colTypes
specifiedTH2::SetShowProjectionXY
RooDataSet
and
RooDataHist
with weight errors__cast_cpp__
to implicitly convert
python objects to proxiesRVec<bool>
shows wrong valuesRNTuple
: 32 bit specificroot_generate_dictionary
does not properly handle “all”
include directory properties from its dependencies.gDirectory
macro should include global-namespace
qualificationRooWorkspace
messes up proxiesRooMomentMorphND
to workspace in
RooFitGetClass(<typedef>)
works only at the second tryTTreeReader
does not support enum type as parameterRooSimultaneous
ignore
ProjWData
[[nodiscard]]
functionsRoofit/Histfactory/HistoToWorkspaceFactoryFast
RooLinearVar
not used in plot projection
integralsTF1
fWritePage[fWritePageIdx].IsEmpty()
violated at line 87 of RColumn.hxx
root --help
HistFactory
model file twice gives strange
results since ROOT 6.26.02TTreeCache
scale (very) poorly with number of
baskets/clusters.TClass
object managed in case of multi-threaded
‘rapid’ set of dlopen/dlclose on same library.EnableImplicitMT()
with a python
for loopGraph()
title: x vs yargparse2help
with Python 3.12HistFactory
workspaces incompatible between versions
6.26 and 6.28TF2::Integral
documentationNumba.Declare
TGraph2D
’s Interpolate()
returns 0TThread
related tests failTTree::fChainOffset
is never setTEve
broken with giflib 5rootssh
FromSpec
: parsing of the JSON file is done according
to the alphabetical ordering of the main keystmva/tmva/src/DataLoader.cxx
UnsealPage()
should be a no-op for the page
zeroRooAbsL
EventSections tests/bin/bash
does not work on all
platformsTDirectoryFile::ls
TFile::ls
hangs in infinite loop when slash in keyerror: function definition is not allowed here
when
trying to overload operator<=
TRootBrowser: Histogramming
leafs which are
functions failsTChain
with
RNTupleImporter
runtime_cxxmodules
ClingConfig.cmake.tmp
to the
external LLVM library directory, causing configuration failurebuiltin_llvm=OFF
due to unintend libbsd
linkingstd::set
builtin_llvm=OFF
: CommandLine Error:
Option ‘W’ registered more than once!Form
usage in TMVAcore/clib/inc/strlcpy.h
incompatible with
latest glibcRPageSourceDaos
should be able to populate zero
pages from kTypePageZero
locatorsstd::unique_ptr
RooAbsReal::getPropagatedError
ROOT::TestSupport
library not working as intendedTFile
with very large number of
directories.Error while building module 'std' imported from input_line_1:1:...
dataframe/test/datasource_arrow.cxx
fails on
standard linux distribution${GENERATE_REFLEX_TEST}
variable do not
work in roottestTNetXNGFile::Close()
leads to a
segfaultTInterpreter::ReadRootmapFile
warningsTPython::ExecScript
for Python3bins_per_hyperplane
is being used without
being initialized.#include
for
ROOT::Math::PtEtaPhiMVector
etcTDatabasePDG::GetParticle(...)
not being thread safeTGraph2D
with “tri1” draw optionLLVM_ENABLE_SPHINX=ON
TGraph(Asymm,Bent)Errors
getters segfault in PyROOTRooDataSet.from_numpy
gives wrong result when the
input arrays are not c-contiguousGraph
and GraphAsymmErrors
Action Helpers not
deallocating memory when event loop is interruptedLiveVisualize
does not update canvas on Jupyter
notebookOffset("bin")
featureRCanvas
and
TCanvas
TGraph::Sort
with large number of
entriesTProfile3D
cannot display the model under
'% jsroot on'
.SetFillStyle
using
TCanvas
and WebCanvasstd::map<const std::string>
to
std::map<std::string>
can cause unexpected
cling-related crashes in Python on macOSTCanvas
/ TWebCanvas
TComplex
arithmetic operators don’t work with
integral typesRDataFrame
’s FromNumpy
silently loads
wrong values if input arrays have a strideTDirectoryFile
destructor segfault in compiled C++
programTROOT::EndOfProcessCleanups
fails when using
TCMalloc
on different destructorsDefinePerSample
with multiple
executions/usr/lib
sometimes take priority)operator()
gSystem.Load()
libraries compiled
with ACLiC on macOS 14fit/fit2dHist.C
crashed when running with global
combined fitTMatrixTSparse
rootcling --genreflex
ignores
<field... transient="true"/>
in selection XML[TF1,TF2,TF3]::Save
works incorrectly when called with
default arguments (all 0)TTree:Draw
/fEstimate
is erratic and poorly
documentedRooGamma
random number samplingRooStats::ModelConfig::Set*(const char*)
Published on November 27, 2023
This release addresses a security issue. More details will follow.
TH2::Fill(const char *namex, const char *namey, Double_t w)
doesn’t update fTsumwxy
gitinfo.txt
not updated in incremental buildPublished on January 31, 2024
This release addresses many items, thanks to an effort made during
the break at the end of the year. Not only problems were removed, but
runtime performance was greatly improved, especially the one of the
interpreters. The memory footprint of the plugin manager has been
reduced. Moreover, the mechanism by which symbols are looked up by the
interpreter was improved, avoiding to open and close a large number of
libraries at startup, which improves considerably the user experience as
well as cpu efficiency on batch jobs. More verbose output is now
provided if wrong settings are used for the web-based widgets, the usage
of the loopback device is enforced and only one connection is allowed to
RBrowser
.
ROOT::RDF::RNode
TDecompBase::DiagProd
TAxis::GetTicks
and TAxis::SetTicks
are
inconsistent. Significantly so.Published on April 3, 2024
This release offers a few minor bug fixes. On macOS, it also adapts ROOT for the new C++ modules structures that comes with XCode 15.3.
Published on June 19, 2024
Issues addressed in this patch
The RooPower
and RooExpPoly
classes are
removed from this release branch. It is an unfortunate but unavoidable
change: different classes with the same name were used in the CMS
collaboration since at least the Higgs discovery. This name collision
caused massive problems in backwards compatibility and was blocking CMS
from picking up ROOT 6.30 for statistical analysis. These classes were
only introduced with ROOT 6.28.00 and were not widely advertised, so you
should not be affected by this removal. If you were using one of these
classes, please copy the sources from a previous ROOT tag in your
analysis as a temporary solution, and report this unsupported usecase by
opening a GitHub issue.