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.
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");
ntuple->Fill();
auto modelUpdater = ntuple->CreateModelUpdater();
modelUpdater->BeginUpdate();
std::array<double, 2> fieldArray;
modelUpdater->AddField<std::array<double, 2>>("array", &fieldArray);
modelUpdater->CommitUpdate();
// After this point, entries will have a new field of type `std::array<double, 2>`
ntuple->Fill();
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()
.
RNTupleWriteOptions options;
options.SetHasSmallClusters(true);
auto 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();
model->AddProjectedField(std::move(aliasVec), [](const std::string &fieldName) {
if (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:
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:
RooArgSet normSet{x}; // normalization set
// Old way 1: create a RooGenFunction:
RooGenFunction func1{pdf, x, {}, normSet};
// Old way 2: use `RooAbsReal::iGenFunction()`:
std::unique_ptr<ROOT::Math::IGenFunction> func2{
pdf.iGenFunction(x, normSet)
};
// How to do it now:
RooFunctor functor{pdf, x, {}, normSet};
ROOT::Math::Functor1D func3{functor};
// 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
:
RooFunctor functor{pdf, observables, {}, normSet};
ROOT::Math::Functor func4{functor, static_cast<unsigned int>(functor.nObs())};
// 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:
RooMomentMorphFuncND func{<constructor args you previously passed to RooMomentMorphFunc>};
func.setPdfMode(); // change behavior to be exactly like the former RooMomentMorphND
// Pass the selfNormalized=true` flag to the wrapper because the
RooMomentMorphFuncND already normalizes itself in pdf mode.
RooWrapperPdf pdf{"pdf_name", "pdf_name", func, /*selfNormalized=*/true};
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.:
RooProduct scaledFunc{"scaled_func", "", func, scaleFactor};
RooRealBinding scaleBind(scaledFunc, x) ;
instead of:
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.RooFormula
class, which was not meant as a user-facing class, but as a shared implementation detail of RooFormulaVar
and RooGenericPdf
.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.