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, #includes 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 threadsNote 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_PATHA 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 RDataFrames (or better, multiple
independent computation graphs) concurrently while sharing the same
thread pool. The computation may be more efficient than running the
RDataFrames 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
TTrees 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
TTrees 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.Filters and Defines) 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
RDataFrames. 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 APIThe 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::CopyTKDE 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 RVecs is RDataFrame, and
RDataFrame performs an on-the-fly
RVec <-> std::vector conversion rather than writing
RVecs 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.RooBinSamplingPdfRooAddPdf 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) constRunContext.h and
BracketAdapter.h.getValues() instead of getValBatch()
to retrieve a RooSpan for the data of every value.- auto xData = x.getValBatch(begin, batchSize);
+ auto xData = x->getValues(evalData,normSet); size_t nEvents=0;
for (auto& i:{xData,meanData,sigmaData})
nEvents = std::max(nEvents,i.size());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.- const bool batchX = !xData.empty();
+ const bool batchX = xData.size()>1;RooBatchCompute:: to the classes that have been
moved to the RooBatchCompute Library:
RooSpan,BracketAdapterWithMask,
BracketAdapter, RunContext. Alternatively, you
can writeusing namespace RooBatchCompute;_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: processEvent(dataHist.get(i), dataHist.weight()); // Dangerous! Order of evaluation is not guaranteed.With the modernised interface, one would use:
processEvent(dataHist.get(i), dataHist.weight(i));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 effectThis 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 sumSetinverseBinCor: divide counts in each bin by the bin
volume corresponding to the variables not in
sumSetSo 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.
AddPointto 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.jsJSROOT.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
RooFFTConvPdfGetEntries reports warning when friend chain with
indexTSocket::SendProcessIDsgSystem->cd has negative effect on TFile
with relative pathTMVAMultiClassGui when showing
“Classifier Output Distributions”RooProdPdfhadd 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 PDFRooFFTConvPdflong, unsigned long,
std::size_t types$HOME is not automatically extended in
TClinglibNew.so crashcout both from jitted and
compiled codeTMVAGui::mvaeffs crashes when compiled stand-aloneTCling::Calc() must not abortTF1::RandomTVector3 pointersSaveGraph produces an empty graphTBranchObjectRDataFrame can’t Snapshot an std::arrayTROOT::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+TEntryListTThreadedExecutors is racyHistFactory models that are written to a file, then
retrieved with updated histograms find only old histogramsstdexceptSnapshot 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_ptrclang::Sema::LookupSpecialMemberTFormula expression using pre-defined
functions in function namesRVecs of non-split branches can read from invalid
addressesTTreeIndex results in wrong entries silently read, or an
infinite event loopstressRooStatshadd crashes when slow merging file with multiple array
with same indexTHashTableRooArgSet IsOnHeap result incorrectTPython documentation is gone-Druntime_cxxmodules:BOOL=ONDisplay
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 onlyRooMomentMorphNDRDataFrame operations exit root
prompt.TLeaf::GetName and TLeaf::GetFullName
disagree on leaf nameREADME/INSTALL should point to webnlohmann/jsonTFormula::DoEval and DoEvalVec have a thread
safety issueTFormula::TFormula() constructorrootcling fails for Gaudi classesTChain on ROOT fileTCanvas with
gDebug=1Filter expressionsTGenCollectionProxy.cxx when
using rootclingvector<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::importTMVAGui functions crash in batch
modeMethodPyKeras for
tensorflow.kerasTProfile,TProfile2D::LabelsOptionTTree::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::CloseTPad (part 3)TGMainFrame constructor not taken into
accountTH3 missing labelsTCanvasTPadTHStack behaviour is not aligned with behaviour of other
objects when drawing - TopMargin is non-zeroTPadTPaveLabel 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.batSaveGraph can be confused by shared upstream
DefinesipyparallelGetLeaf 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
FiltersTTree 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=OFFTGCommandLinePlugin Up-Down Arrows and Tab KeysRDataFrame Snapshot of friend treesRVecRooParamHistFuncSnapshot$CWD causes TCanvas to hang on
macOShadd reverses order of object cyclesusing namespace std in generated dictionary
filesshortlibafterimage_STAT_VER was not
declaredRooSimPdfBuilder.cxxTLeaf::GetLeafCounterTH3::GetCovariance for diagonal
elementsbuiltin_cling=OFF for LLVM 9RooFFTConvPdf doesn’t work with
RooProdPdfRNTuple, parallel unzip tear down race conditionROOT.RDF.MakeNumpyDataFrameTGraph copy constructor errorTMathText does not display with high value coordinatesTHStackTEnum::GetEnumroottest-python-cmdLineUtils failuresTFile object is opened and closed on
different threads.TMessageHandlerPublished on June 28, 2021
TClassEditMemPoolForRooSetsSnapshot 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
objectsForeachStreamerElement retrieved from file has incorrect element
name for (some) arrays.sqrt without std:: in
Math/GenVector/PxPyPzE4D.hTUnuranContDist 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 == 1TNetXNGFile
object.root extension
with IMT onTTreeCache is turned off when
fAutoFlush == 0Published 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_tThese changes will be part of a future 6.24/10.