ROOT version 6.24/00 was released on April 14, 2022.
For more information, see:
The following people have contributed to this new version:
Guilherme Amadio, CERN/SFT,
Bertrand Bellenot, CERN/SFT,
Josh Bendavid, CERN/CMS,
Jakob Blomer, CERN/SFT,
Rene Brun, CERN/SFT,
Philippe Canal, FNAL,
Olivier Couet, CERN/SFT,
Anirudh Dagar, CERN-SFT/GSOC,
Hans Dembinski, TU Dortmund/LHCb,
Massimiliano Galli, CERN/SFT,
Andrei Gheata, CERN/SFT,
Hadrien Grasland, IJCLab/LAL,
Enrico Guiraud, CERN/SFT,
Claire Guyot, CERN/SFT,
Jonas Hahnfeld, CERN/SFT,
Emmanouil Michalainas, CERN/SFT,
Stephan Hageboeck, CERN/SFT,
Sergey Linev, GSI,
Javier Lopez-Gomez, CERN/SFT,
Pere Mato, CERN/SFT,
Lorenzo Moneta, CERN/SFT,
Alja Mrak-Tadel, UCSD/CMS,
Axel Naumann, CERN/SFT,
Vincenzo Eduardo Padulano, CERN/SFT and UPV,
Danilo Piparo, CERN/SFT,
Fons Rademakers, CERN/SFT,
Jonas Rembser, CERN/SFT,
Andrea Sciandra, SCIPP-UCSC/Atlas,
Oksana Shadura, UNL/CMS,
Enric Tejedor Saavedra, CERN/SFT,
Christian Tacke, GSI,
Matevz Tadel, UCSD/CMS,
Vassil Vassilev, Princeton/CMS,
Wouter Verkerke, NIKHEF/Atlas,
Stefan Wunsch, CERN/SFT
RooAbsReal::evaluateBatch()
has been removed in favour of the faster evaluateSpan(). See section “RooFit Libraries” for instructions on how to use RooAbsReal::evaluateSpan()
.TTreeProcessorMT::SetMaxTasksPerFilePerWorker
has been deprecated in favour of TTreeProcessorMT::SetTasksPerWorkerHint
.As always, ROOT tries to reduce the amount of code exposed through its headers. To that end, #include
s were replaced by forward declarations in several headers. This might cause compilation errors (“missing definition of type…”) in your code, if that code was relying on indirect includes, instead of including the required headers itself. Please correct that simply by including the required header directly.
Due to internal changes required to comply with the deprecation of Intel TBB’s task_scheduler_init
and related interfaces in recent TBB versions, as of v6.24 ROOT will not honor a maximum concurrency level set with tbb::task_scheduler_init
but will require instead the usage of tbb::global_control
:
//tbb::task_scheduler_init init(2); // does not affect the number of threads ROOT will use anymore
tbb::global_control c(tbb::global_control::max_allowed_parallelism, 2);
ROOT::TThreadExecutor p1; // will use 2 threads
ROOT::TThreadExecutor p2(/*nThreads=*/8); // will still use 2 threads
Note that the preferred way to steer ROOT’s concurrency level is still through ROOT::EnableImplicitMT
or by passing the appropriate parameter to executors’ constructors, as in TThreadExecutor::TThreadExecutor
.
See the discussion at ROOT-11014 for more context.
ROOT_LIBRARY_PATH
A new way to set ROOT’s “Dynamic Path” was added: the environment variable ROOT_LIBRARY_PATH
. On Unix it should contain a colon separated list of paths, on Windows a semicolon separated list. It is intended to be cross platform and to be specific to ROOT (and thus not interfere with the system’s shared linker). The final “Dynamic Path” is now composed of these sources in order:
ROOT_LIBRARY_PATH
environment variableLD_LIBRARY_PATH
, LIBPATH
, or PATH
.TTree
now supports the inclusion of leaves of types long
and unsigned long
(and therefore also std::size_t
on most systems) also for branches in “leaflist mode”. The corresponding leaflist letters are ‘G’ and ‘g’.TTree
with a friend with a larger number of entries, TTreeReader
now ends the event loop when the entries in the main TTree
are exhausted, consistently with other interfaces. See #6518 for more details.TTreeProcessorMT::SetMaxTasksPerFilePerWorker
is now deprecated in favor of the more flexible and newly introduced TTreeProcessorMT::SetTasksPerWorkerHint
. See the relevant entries in our reference guide for more information.ROOT::RDF::RunGraphs
, which allows to compute the results of multiple RDataFrame
s (or better, multiple independent computation graphs) concurrently while sharing the same thread pool. The computation may be more efficient than running the RDataFrame
s sequentially if an analysis consists of several computation graphs that individually do not fully utilize the available resources. See e.g. this tutorial for an example usage.RDataFrame
now supports reading friend TTree
s with a TTreeIndex
, aka “indexed friends”. More details at ROOT-9559.RDataFrame
. To activate logging, define the following variable before creating the RDataFrame
object: auto verbosity = ROOT::Experimental::RLogScopedVerbosity(ROOT::Detail::RDF::RDFLogChannel(), ROOT::Experimental::ELogLevel.kInfo);
.RDataFrame
can now read and write certain branches containing unsplit objects, i.e. TBranchObjects
. More information is available at ROOT-10022.RDataFrame
results produced by the same action in different computation graphs can now be merged thanks to the new interface provided by ROOT::Detail::RDF::RMergeableValue
, introduced in #5552. A feature originally requested with ROOT-9869, it helps streamline RDataFrame
workflows in a distributed environment. Currently only a subset of RDataFrame
actions have their corresponding mergeable class, but in the future it will be possible to extend it to any action through the creation of a new RMergeableValue
derived class.Snapshot
now respects the basket size and split level of the original branch when copying branches to a new TTree
.Snapshot
now writes branches coming from friend TTree
s even if they have the same name as branches in the main tree (friendname_
is prepended to the name of the output branches). More details at #7181.Filter
and Define
now generates functions that take fundamental types by const value (rather than by non-const reference as before). This will break code that was assigning to column values in string expressions: this is an intended side effect as we want to prevent non-expert users from performing assignments (=
) rather than comparisons (==
). Expert users can resort to compiled callables if they absolutely have to assign to column values (not recommended). See ROOT-11009 for further discussion.TTrees
, RDataFrame::GetColumnNames
might now 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.ROOT::Detail
and ROOT::Internal
namespaces have been renamed, most notably RCustomColumn
is now RDefine
. This does not impact code that only makes use of entities in the public ROOT namespace, and should not impact downstream code unless it was patching or reusing internal RDataFrame
types.TChain
contained more than one TTree
coming from the same input file. More details are available at #7143.Filter
s and Define
s) has been greatly reduced. See the corresponding pull request for more details.The full list of bug fixes for this release is available below.
ROOT 6.24 introduces ROOT.RDF.Experimental.Distributed
, an experimental python package that enhances RDataFrame with distributed computing capabilities. The new package allows distributing RDataFrame applications through one of the supported distributed backends. The package was designed so that different backends can be easily plugged in. Currently the Apache Spark backend is supported and support for Dask is coming soon. The backend submodules of this package expose their own RDataFrame
objects. The only needed change in user code is to substitute ROOT.RDataFrame
calls with such backend-specific RDataFrame
s. For example:
import ROOT
# Point RDataFrame calls to the Spark specific RDataFrame
RDataFrame = ROOT.RDF.Experimental.Distributed.Spark.RDataFrame
# It still accepts the same constructor arguments as traditional RDataFrame
df = RDataFrame("mytree","myfile.root")
# Continue the application with the traditional RDataFrame API
The main goal of this package is to support running any RDataFrame application distributedly. Nonetheless, not all RDataFrame operations currently work with this package. The subset that is currently available is:
with support for more operations coming in the future.
Any distributed RDataFrame backend inherits the dependencies of the underlying software needed to distribute the applications. The Spark backend for example has the following runtime dependencies (ROOT will build just fine without, but the feature will be unavailable without these packages):
Tests for the Spark backend can be turned ON/OFF with the new build option test_distrdf_pyspark
(OFF by default).
THistRange
class for defining a generic bin range and iteration in a 1d and multi-dimensional histogramTF1::Copy
and TFormula::Copy
TKDE
class using kernel estimation for estimating a density from data.TF1::GetRandom
, TH1::GetRandom
and TH1::FillRandom
(and same for TF2,TF3, TH2 and TH3 functions) to pass optionally a random number generator instance. This allows to use these function with a user provided random number generator instead of using the default gRandom
.TMath::HUncertainty()
, TMath::KUncertainty()
, TMath::QeUncertainty()
and TMath::NaUncertainty()
all return a 0.0
value.RVec
, the layout of RVec
objects will change in a backward-incompatible way between v6.24 and v6.26. Because of this, we now print a warning if an application is reading or writing a ROOT::RVec
object from/to a ROOT file. We assume this is an exceedingly rare case, as the ROOT interface typically used to manipulate RVec
s is RDataFrame
, and RDataFrame
performs an on-the-fly RVec <-> std::vector
conversion rather than writing RVec
s to disk. Note that, currently, RVecs
written e.g. in a TTree
cannot be read back using certain ROOT interfaces (e.g. TTreeReaderArray
, RDataFrame
and the experimental RNTuple
). All these limitations will be lifted in v6.26.TRandom3::GetSeed
to return the current state element in the contained seed vector of TRandom3. The return value will now change after every call of TRandom3::Rndm
(when generating a random number). Before the function was returning the first element of the state, which was changing only after 624 calls to Rndm()
.ROOT::Fit::BinData
copy constructorROOT::Fit::FitResult
.TPrincipal::AddRow
that is heavily used by CMS.tf.keras=True
.RooBinSamplingPdf
RooAddPdf
is evaluated without passing a normalization set and the class has not a normalization set defined. Without a normalization set the RooAddPdf
is not properly defined and its shape will be different depending on which normalization range is used.BatchMode
on CPUs with vector extensionsRooFit’s BatchMode
has been around since ROOT 6.20, but to fully use vector extensions of modern CPUs, a manual compilation of ROOT was necessary, setting the required compiler flags.
Now, RooFit comes with dedicated computation libraries, each compiled for a specific CPU architecture. When RooFit is loaded for the first time, ROOT inspects the CPU capabilities, and loads the fastest supported version of this computation library. This means that RooFit can now use vector extensions such as AVX2 without being recompiled, which enables a speed up of up to 4x for certain computations. Combined with better data access patterns (~3x speed up, ROOT 6.20), computations with optimised PDFs speed up between 4x and 16x.
The fast BatchMode
now also works in combination with multi processing (NumCPU
) and with binned data (RooDataHist
).
See Demo notebook in SWAN, EPJ Web Conf. 245 (2020) 06007, arxiv:2012.02746.
The library that contains the optimised computation functions is called RooBatchCompute
. The PDFs contained in this library are highly optimized, and there is currently work in progress for further optimization using CUDA and multi-threaded computations. If you use PDFs that are not part of the official RooFit, you are very well invited to add them to RooFit by submitting a ticket or a pull request.
evaluateSpan()
For PDFs that are not part of RooFit, it is possible to benefit from batch computations without vector extensions. To do so, consult the RooBatchCompute readme.
evaluateBatch()
In case you have created a custom PDF which overrides evaluateBatch()
, please follow these steps to update your code to the newest version:
- RooSpan<double> RooGaussian::evaluateBatch(std::size_t begin, std::size_t batchSize) const
+ RooSpan<double> evaluateSpan(RooBatchCompute::RunContext& evalData, const RooArgSet* normSet) const
RunContext.h
and BracketAdapter.h
.getValues()
instead of getValBatch()
to retrieve a RooSpan for the data of every value.RunContext::makeBatch()
- auto output = _batchData.makeWritableBatchUnInit(begin, batchSize);
+ auto output = evalData.makeBatch(this, nEvents);
RooSpan::isBatch()
and RooSpan::empty()
methods! Instead, distinguish between scalar (RooSpan of size 1) and vector (RooSpan of size>1) parameters as shown below.RooBatchCompute::
to the classes that have been moved to the RooBatchCompute Library: RooSpan
,BracketAdapterWithMask
, BracketAdapter
, RunContext
. Alternatively, you can write_rf_fast_<function>
with RooBatchCompute::fast_<function>
and include RooVDTHeaders.h
(if applicable).- output[i] = _rf_fast_exp(arg*arg * halfBySigmaSq);
+ output[i] = RooBatchCompute::fast_exp(arg*arg * halfBySigmaSq);
When RooFit performs binned fits, it takes the probability density at the bin centre as a proxy for the probability in the bin. This can lead to a bias. To alleviate this, the new class RooBinSamplingPdf has been added to RooFit. Also see arxiv:2012.02746.
When making residual or pull distributions with RooPlot::residHist
or RooPlot::pullHist
, the histogram is now compared with the curve’s average values within a given bin by default, ensuring that residual and pull distributions are valid for strongly curved distributions. The old default behaviour was to interpolate the curve at the bin centres, which can still be enabled by setting the useAverage
parameter of RooPlot::residHist
or RooPlot::pullHist
to false
.
When a function in RooFit is undefined (Poisson with negative mean, PDF with negative values, etc), RooFit can now pass information about the “badness” of the violation to the minimiser. The minimiser can use this to compute a gradient to find its way out of the undefined region. This can drastically improve its ability to recover when unstable fit models are used, for example RooPolynomial.
For details, see the RooFit tutorial rf612_recoverFromInvalidParameters.C and arxiv:2012.02746.
RooDataHist was partially modernised to improve const-correctness, to reduce side effects as well as its memory footprint, and to make it ready for RooFit’s faster batch evaluations. Derived classes that directly access protected members might need to be updated. This holds especially for direct accesses to _curWeight
, _curWeightErrLo
, etc, which have been removed. (It doesn’t make sense to write to these members from const functions when the same information can be retrieved using an index access operator of an array.) All similar accesses in derived classes should be replaced by the getters get_curWeight()
or better get_wgt(i)
, which were also supported in ROOT <v6.24. More details on what happened:
get(i)
, i.e., loading the new weight into _curWeight
is not guaranteed to happen before weight()
is called:With the modernised interface, one would use:
To modernise old code, one should replace patterns like h.get(i); h.func()
by h.func(i);
. One may #define R__SUGGEST_NEW_INTERFACE
to switch on deprecation warnings for the functions in question. Similarly, the bin content can now be set using an index, making prior loading of a certain coordinate unnecessary:
for (int i=0 ; i<hist->numEntries() ; i++) {
- hist->get(i) ;
- hist->set(hist->weight() / sum);
+ hist->set(i, hist->weight(i) / sum, 0.);
}
calcTreeIndex()
doesn’t rely on side effects, any more. Instead of overwriting the internal coordinates with new values: // In a RooDataHist subclass:
_vars = externalCoordinates;
auto index = calcTreeIndex();
// Or from the outside:
auto index = dataHist.getIndex(externalCoordinates); // Side effect: Active bin is now `index`.
coordinates are now passed into calcTreeIndex without side effects:
// In a subclass:
auto index = calcTreeIndex(externalCoordinates, fast=<true/false>); // No side effect
// From the outside:
auto index = dataHist.getIndex(externalCoordinates); // No side effect
This will allow for marking more functions const, or for lying less about const correctness.
BatchMode()
.RooDataHist::sum()
The public member function RooDataHist::sum()
has three overloads. Two of these overloads accept a sumSet
parameter to not sum over all variables. These two overloads previously behaved inconsistently when the correctForBinSize
or inverseBinCor
flags were set. If you use the RooDataHist::sum()
function in you own classes, please check that it can still be used with its new logic. The new and corrected bin correction behaviour is:
correctForBinSize
: multiply counts in each bin by the bin volume corresponding to the variables in sumSet
inverseBinCor
: divide counts in each bin by the bin volume corresponding to the variables not in sumSet
So far, the Crystal Ball distribution has been represented in RooFit only by the RooCBShape
class, which has a Gaussian core and a single power-law tail on one side. This release introduces RooCrystalBall
, which implements some common generalizations of the Crystal Ball shape:
The new RooCrystalBall
class can substitute the RooDSCBShape
and RooSDSCBShape
, which were passed around in the community.
AddPoint
to TGraph(x,y)
and TGraph2D(x,y,z)
, equivalent to SetPoint(g->GetN(),x,y)
and SetPoint(g->GetN(),x,y,z)
E0
draws error bars and markers are drawn for bins with 0 contents. Now, combined with options E1 and E2, it avoids error bars clipping.TAxis::ChangeLabel
for vertical axes and 3D plotsNow when THttpServer creates FastCGI engine, 10 worker threads used to process requests received via FastCGI channel. This significantly increase a performance, especially when several clients are connected.
If THttpServer created for use with webgui widgets (RBrowser, RCanvas, REve), it only will provide access to the widgets via websocket connection - any other kind of requests like root.json or exe.json will be refused completely. Combined with connection tokens and https protocol, this makes usage of webgui components in public networks more secure.
Bearer tokens are part of WLCG capability-based infrastructure with capability-based scheme which uses an infrastructure that describes what the bearer is allowed to do as opposed to who that bearer is. Token discovery procedure are developed according to the WLCG Bearer Token Discovery specification document. Short overview:
BEARER_TOKEN
environment variable is set, then the value is taken to be the token contents.BEARER_TOKEN_FILE
environment variable is set, then its value is interpreted as a filename. The contents of the specified file are taken to be the token contents.XDG_RUNTIME_DIR
environment variable is set, then take the token from the contents of $XDG_RUNTIME_DIR/bt_u$ID
(this additional location is intended to provide improved security for shared login environments as $XDG_RUNTIME_DIR
is defined to be user-specific as opposed to a system-wide directory.)./tmp/bt_u$ID
.ROOT can now be built with Xrootd 5 client libraries.
d3.js
, three.js
, MathJax.js
, openui5JSRoot.core.js
JSROOT.require
, supporting 4 different loading enginesOne can now select a class’s documentation for a specific version. If a class does not exist in a given version, that version is grayed out, see for instance the documentation for ROOT::Experimental::RNTupleReader
.
CMAKE_INSTALL_PYTHONDIR
, has been added: it allows customization of the installation directory of ROOT’s python modulesasserts
is introduced to enable/disable asserts via the NDEBUG
C/CXX flag. Asserts are always enabled for CMAKE_BUILD_TYPE=Debug
and dev=ON
. The previous behavior of the builds set via the CMAKE_BUILD_TYPE
variable has not changed.CMAKE_CXX_STANDARD
, i.e. the C++ standard ROOT is built with, now defaults to the compiler default (or C++11 if the compiler default is older than that) rather than always defaulting to C++11. In turn this means that v6.24 is the first ROOT release for which ROOT’s pre-compiled binaries are not compiled with C++11 but with the default standard in use by the default system compiler. On Ubuntu 20.04, for example, the v6.24 pre-compiled binaries are now compiled with C++14 rather than C++11 as it happened for previous ROOT versions. Also see ROOT-10692.The following builtins have been updated:
TTree.AsMatrix
in this release and mark for removal in v6.26. Please use instead RDataFrame.AsNumpy
.RooTreeDataStore
not Cloning the tree properly (and const correctness)RooAbsPdf::getLogVal()
returns log((double)0)
(==inf !)RooProdPDF
and RooFFTConvPdf
GetEntries
reports warning when friend chain with indexTSocket::SendProcessIDs
gSystem->cd
has negative effect on TFile
with relative pathTMVAMultiClassGui
when showing “Classifier Output Distributions”RooProdPdf
hadd
bug for TProfile
with alphanumeric bin labelsTGraph::GetHistogram
needlessly removes identically named objects from directoryTROOT::ProcessLine
: TString::Replace
out of rangeRooStreamParser
not working for float number with negative exponentMultiply(const Double_t *vin, Double_t* vout, Double_t w)
in TEveTrans
of Eve packageRooCBShape
with conditional PDFRooFFTConvPdf
long
, unsigned long
, std::size_t
types$HOME
is not automatically extended in TCling
libNew.so
crashcout
both from jitted and compiled codeTMVAGui::mvaeffs
crashes when compiled stand-aloneTCling::Calc()
must not abortTF1::Random
TVector3
pointersSaveGraph
produces an empty graphTBranchObject
RDataFrame
can’t Snapshot an std::array
TROOT::ProcessLine("cout ...")
crashes when called from compiled codeTF2::Moment2
, TF2::CentralMoment2
, and similar for TF3
work only for Formula based objectSnapshot
output filesTCling
fails to catch compiled exception on Mac OSTFractionFitter
destructorTChain
+TEntryList
TThreadedExecutors
is racyHistFactory
models that are written to a file, then retrieved with updated histograms find only old histogramsstdexcept
Snapshot
into a directory also creates a spurious TTree
outside of itSnapshot
of TClonesArrays
read via TTreeReaderArray
is brokenTClass::GetListOfAllPublicMethods()
lists deleted copy constructor of std::unique_ptr
clang::Sema::LookupSpecialMember
TFormula
expression using pre-defined functions in function namesRVec
s of non-split branches can read from invalid addressesTTreeIndex
results in wrong entries silently read, or an infinite event loopstressRooStats
hadd
crashes when slow merging file with multiple array with same indexTHashTable
RooArgSet
IsOnHeap
result incorrectTPython
documentation is gone-Druntime_cxxmodules:BOOL=ON
Display
actionTMath::Gcgs()
problemDisplay
of char*
branches is brokenTPythia8
brings program to haltSnapshot
segfault when TTree
switches over multiple filescppyy_backend
cannot be importedRooCategory
doesn’t update its label when its state is dirty.RooDataSet::read()
no longer accepts RooCategory
numbersTH2
sum with x-labels onlyRooMomentMorphND
RDataFrame
operations exit root prompt.TLeaf::GetName
and TLeaf::GetFullName
disagree on leaf nameREADME/INSTALL
should point to webnlohmann/json
TFormula::DoEval
and DoEvalVec
have a thread safety issueTFormula::TFormula()
constructorrootcling
fails for Gaudi classesTChain
on ROOT fileTCanvas
with gDebug=1
Filter
expressionsTGenCollectionProxy.cxx
when using rootcling
vector<string>
behaviour in loops in PyROOT 6.20 vs 6.22TH1::GetCumulative
account for underflows and overflowsTBranchObjects
(e.g. branches containing TH2F
)RooRealVar
not allowing to use hash table on RooLinkedList
memberRooDataSet
causes SegFaultRooWorkspace::import
TMVAGui
functions crash in batch modeMethodPyKeras
for tensorflow.kerasTProfile
,TProfile2D::LabelsOption
TTree::ChangeFile
and a TFile
on the stackRDataSource
does not early-quit event loops when all Ranges are exhaustedMin
method breaks with RVec
columnsTEnv::SetValue(const char *name, double value)
implementationDisplay
doesn’t work with non-top-level TTree
branchesNDEBUG
for PR buildsTClass::GetListOfFunctions()
fails to enumerate using decls.PyROOT
cannot call templated ctors on Windowsstatic bool llvm::isa_impl_cl<To, const From*>::doit(const From*) [with To = clang::UsingDecl; From = clang::Decl]
: Assertion Val && "isa<> used on a null pointer"
failed.TTree
are written, they are not compressed.TPad::Close
TPad
(part 3)TGMainFrame
constructor not taken into accountTH3
missing labelsTCanvas
TPad
THStack
behaviour is not aligned with behaviour of other objects when drawing - TopMargin is non-zeroTPad
TPaveLabel
classRDataFrame.Histo1D
broken for vector<bool>
typesTClass::GetListOfDataMembers
returns an empty list even-though the information is available.TEnum
’s underlying typeTStreamerInfo::GenerateInfoForPair
generates the wrong offset if an enum type is first.TClass::InheritsFrom()
depending on linking ordernlohmann/json.hpp
is not forwarded as dependency or should be linked PRIVATE?TBufferMerger
cannot handle TTree
spanning over multiple filesTApplication
is not present and tree->StartViewer()
is calledTClass
for pair sometimes have the wrong offset/sizebuild/unix/compiledata.sh
assumes macOS will always have major version 10TCling::UpdateListOfLoadedSharedLibraries()
Linux thread safetyTGClient
in a standalone applicationTRandom
: signature mismatch between getter and setterthisroot.bat
SaveGraph
can be confused by shared upstream Defines
ipyparallel
GetLeaf
ignores the branchname arg if friend trees are presentRDataFrame
misidentifies vector<XYZTVector>
type of a friend tree with identical branch name to another friend treeTProfile
.TTree
is read without its friendsSnapshot
of a TChain
when no entry passes upstream Filters
TTree
with a friend with a larger number of entries, the loop spans all entries in the friendTTreeProcessorMT
: Fails when iterating over different treenames within same ROOT fileTExecutor
: handling of non-IMT/… caseroottest-python-regression-regression
requires OpenGL but still run when it is disableTThreadExecutor::Map
should be able to accept const std::vector
argumentsROOT::GetThreadPoolSize
does not reflect tbb::global_control settingsmake install
when built against LLVM 9RooAbsArg::graphVizTree
produces invalid dot files for graph titles including spacesregex_error
when selecting pdf components to plotTGSpeedo
mean value calculationStrDup
-DVDT=OFF
TGCommandLinePlugin
Up-Down Arrows and Tab KeysRDataFrame
Snapshot
of friend treesRVec
RooParamHistFunc
Snapshot
$CWD
causes TCanvas
to hang on macOShadd
reverses order of object cyclesusing namespace std
in generated dictionary filesshort
libafterimage
_STAT_VER
was not declaredRooSimPdfBuilder.cxx
TLeaf::GetLeafCounter
TH3::GetCovariance
for diagonal elementsbuiltin_cling=OFF
for LLVM 9RooFFTConvPdf
doesn’t work with RooProdPdf
RNTuple
, parallel unzip tear down race conditionROOT.RDF.MakeNumpyDataFrame
TGraph
copy constructor errorTMathText
does not display with high value coordinatesTHStack
TEnum::GetEnum
roottest-python-cmdLineUtils
failuresTFile
object is opened and closed on different threads.TMessageHandler
Published on June 28, 2021
TClassEdit
MemPoolForRooSets
Snapshot
in sub-directoryRooSimultaneous
in 6.24.00 ?TChain::AddClone
failing for sub-branches of branch of type with ClassDefTChain::CopyAddresses
:0 warning in RDataFrame
Snapshot
of TChain
with multiple files with objectsForeach
StreamerElement
retrieved from file has incorrect element name for (some) arrays.sqrt
without std::
in Math/GenVector/PxPyPzE4D.h
TUnuranContDist
ctor clones the dpdf but does not use the clone causing a segfault later onRooAbsPdf::extendedTerm
when expected events is negative<boost/shared_ptr.hpp>
at runtime on macOSPublished on August 26, 2021
RooStats::HypoTestInverterResult::FindIndex
fails if xvalue == 1
TNetXNGFile
object.root
extension with IMT onTTreeCache
is turned off when fAutoFlush == 0
Published on September 1, 2021
TDirectory::RegisterGDirectory
is MT unsafeRooAbsPdf::extendedTerm
when expected events is negativePublished on September 29, 2022
CMAKE_INSTALL_PYTHONDIR
on macOS creates broken symlinksoperator=
in code generated by MakeProjectTTree
incorrectly run I/O customization rules on “new” data members.TFileMerger
modificationTTree
with a friendTTree
and its friend on TFile::Close()
TClassEdit
(StdLen)? [6.24.06]runtime_cxxmodules
fails to build with GCC12Float16
_t branchTTreeReaderArray
does not support Double32_t
These changes will be part of a future 6.24/10.