6.34 is a short term support cycle not meant to be used for data taking. It will be superseded by the 6.36 cycle, which is foreseen to start with 6.36.00 in the second quarter of 2025. Patch releases of the 6.36 cycle will be provided until June 30th 2025.
The development ROOT version 6.34.00 is scheduled for release at the end of November 2024.
For more information, see:
The following people have contributed to this new version:
Guilherme Amadio, CERN/IT,
Bertrand Bellenot, CERN/EP-SFT,
Jakob Blomer, CERN/EP-SFT,
Patrick Bos, Netherlands eScience Center,
Rene Brun,
Carsten Burgard, DESY
Will Buttinger, RAL,
Philippe Canal, FNAL,
Jolly Chen, CERN/EP-SFT,
Olivier Couet, CERN/EP-SFT,
Marta Czurylo, CERN/EP-SFT,
Monica Dessole, CERN/EP-SFT,
Adrian Duesselberg, TU Munchen,
Mattias Ellert, Uppsala University,
Gerri Ganis, CERN/EP-SFT,
Florine de Geus, CERN/University of Twente,
Andrei Gheata, CERN/EP-SFT,
Enrico Guiraud,
Stephan Hageboeck, CERN/EP-SFT,
Jonas Hahnfeld, CERN/Goethe University Frankfurt,
Fernando Hueso Gonzalez, University of Valencia,
Attila Krasznahorkay, CERN/EP-ADP-OS,
Wim Lavrijsen, LBL,
Aaron Jomy, CERN/EP-SFT,
Ida Kaspary, Imperial College,
Valerii Kholoimov, National University of Kyiv/IRIS-HEP,
Sergey Linev, GSI,
Javier Lopez-Gomez,
Pere Mato, CERN/EP-SFT,
Andrea Maria Ola Mejicanos, Berea College,
Alaettin Serhan Mete, Argonne,
Thomas Madlener, DESY,
Vedant Mehra, GSOC,
Lorenzo Moneta, CERN/EP-SFT,
Alja Mrak Tadel, UCSD/CMS,
Axel Naumann, CERN/EP-SFT,
Ianna Osborne, Princeton University,
Vincenzo Eduardo Padulano, CERN/EP-SFT,
Giacomo Parolini, CERN/EP-SFT,
Danilo Piparo, CERN/EP-SFT,
Kristupas Pranckietis, Vilnius University,
Fons Rademakers, CERN/IT,
Jonas Rembser, CERN/EP-SFT,
Andrea Rizzi, University of Pisa,
Andre Sailer, CERN/EP-SFT,
Nopphakorn Subsa-Ard, KMUTT,
Pavlo Svirin, National Technical University of Ukraine,
Robin Syring, Leibniz University Hannover, CERN/EP-SFT,
Maciej Szymanski, Argonne,
Christian Tacke, Darmstadt University,
Matevz Tadel, UCSD/CMS,
Alvaro Tolosa Delgado, CERN/RCS-PRJ-FC,
Devajith Valaparambil Sreeramaswamy, CERN/EP-SFT,
Peter Van Gemmeren, Argonne,
Vassil Vassilev, Princeton/CMS,
Wouter Verkerke, NIKHEF/ATLAS,
Stefan Wunsch
The following interfaces have been removed:
RooAbsReal::plotSliceOn()
function that was deprecated since at least ROOT 6 was removed. Use plotOn(frame,Slice(...))
instead.MnUserParameterState
, which is a change backwards compatible with older ROOT versions.The following interfaces are deprecated and will be removed in future releases:
RooTemplateProxy
constructors that take a proxyOwnsArg
parameter to manually pass ownership are deprecated and replaced by a new constructor that takes ownership via std::unique_ptr<T>
. They will be removed in ROOT 6.36.int ROOT::CompressionSettings(ROOT::ECompressionAlgorithm algorithm, int compressionLevel)
function is deprecated and will be removed in ROOT 6.36. Please use int CompressionSettings(RCompressionSetting::EAlgorithm::EValues algorithm, int compressionLevel)
instead.void R__zip(int cxlevel, int *srcsize, char *src, int *tgtsize, char *tgt, int *irep)
is deprecated and will be removed in ROOT 6.36. Please use void R__zipMultipleAlgorithm(int cxlevel, int *srcsize, char *src, int *tgtsize, char *tgt, int *irep, ROOT::RCompressionSetting::EAlgorithm::EValues algorithm)
instead.Bool_t TGeoShape::AreOverlapping(const TGeoBBox *box1, const TGeoMatrix *mat1, const TGeoBBox *box2, const TGeoMatrix *mat2)
is deprecated and will be removed in ROOT 6.36.TPython::Eval()
function that is deprecated scheduled for removal in ROOT 6.36.rootcling
invocation corresponding to a genreflex
invocation can be obtained with the new genreflex
command line argument --print-rootcling-invocation
. This can be useful when migrating from genreflex to rootcling.rootcling
utility now fully supports selection xml files and not only LinkDef files.RNTuple
on-disk binary format is finalized. Future versions of ROOT will be able to read back RNTuple data written as of this release. Please note that this version breaks compatibility with experimental RNTuple data written with releases up to v6.34. Please also note that the RNTuple API is not yet moving out of ROOT::Experimental
.RField<float|double>::SetTruncated()
(truncated mantissa) and RField<float|double>::SetQuantized()
(scaled integer representation).TFile::MakeProject()
properly creates header files for classes used in RNTuple data.RNTupleProcessor
class. The RNTupleProcessor
will support iteration of composed RNTuple data sets (comparable to and improving upon TTree friends and chains). This release supports chained (vertically composed) RNTuples. Other types of concatenations will be added in subsequent releases.RNTupleParallelWriter
. Cluster staging enables users to enforce a certain logical cluster ordering in the presence of parallel cluster writing.rntupleStreamerMode(true)
. This features is similar to the unsplit/level-0-split branch in TTree
.hadd
and when using the RNTupleMerger
class directly. Most notable of these fixes is the proper handling of projected fields.GetColumnNames
function to retrieve the number of available column names in the RDataFrame object is now also usable from a node of a distributed computation graph. This makes the generation of said computation graph slightly less lazy than before. Notably, it used to be the case that a distributed computation graph could be defined with code that was not yet available on the user’s local application, but that would only become available in the distributed worker. Now a call such as df.Define("mycol", "return run_my_fun();")
needs to be at least declarable to the interpreter also locally so that the column can be properly tracked.Define
of the column x
, then the one of the column y
, when filling the graph.DefinePerSample
operation now works also in the case when a TTree is stored in a subdirectory of a TFile.std::array
on disk explicitly as std::array
values in memory.df036_missingBranches
and df037_TTreeEventMatching
show example usage of the new functionalities.std::vector
to ROOT::RVec
which happens in memory within a JIT-ted RDataFrame computation graph meant that the result of a Snapshot
operation would implicitly change the type of the input branch. A new option available as the data member fVector2RVec
of the RSnapshotOptions
struct can be used to prevent RDataFrame from making this implicit conversion.THStack:GetMinimum()
was not correct in case of negative contents.The TUnfold package inside ROOT is upgraded from version 17.6 to version 17.9.
Usage of std::span<const double>
in the interface: To avoid forcing the user to do manual memory allocations via std::vector
, the interfaces of Minuit 2 function adapter classes like ROOT::Minuit2::FCNBase
or ROOT::Minuit2::FCNGradientBase
were changed to accept std::span<const double>
arguments instead of std::vector<double> const&
. This should have minimal impact on users, since one should usual use Minuit 2 via the ROOT::Math::Minimizer
interface, which is unchanged.
Initial error/covariance matrix values for Hessian matrix: Initial error/covariance matrix values can be passed for initializating the Hessian matrix to be used in minimization algorithms by attaching the covariance matrix to the ROOT::Minuit2::MnUserParameterState
instance used for seeding via the method AddCovariance(const MnUserCovariance &);
.
The MultiProcess
-based fitting stack now handles errors during fits. Error signaling in (legacy) RooFit happens through two mechanisms: logEvalError
calls and RooNaNPacker
-enhanced NaN doubles. Both are now implemented and working for MultiProcess
-based fits as well. See this PR for more details. This enables the latest ATLAS Higgs combination fits to complete successfully, and also other fits that encounter NaN values or other expected errors.
Setting useHashMapForFind(true)
is not supported for RooArgLists anymore, since hash-assisted finding by name hash can be ambiguous: a RooArgList is allowed to have different elements with the same name. If you want to do fast lookups by name, convert your RooArgList to a RooArgSet.
The function RooFit::bindFunction()
now supports arbitrary many input variables when binding a Python function.
The ExportOnly()
attribute of the RooStats::HistFactory::Measurement
object is now switched on by default, and the associated getter and setter functions are deprecated. They will be removed in ROOT 6.36. If you want to fit the model as well instead of just exporting it to a RooWorkspace, please do so with your own code as demonstrated in the hf001
tutorial.
Initial error values can be used for initializating the Hessian matrix to be used in Minuit2 minimization algorithms by setting the RooMinimizer::Config
option setInitialCovariance
to true
. These values correspond to the diagonal entries of the initial covariance matrix.
Fixed a bug where in some circumstances hadd
would not correctly merge objects in nested folders of a ROOT file.
RooFit::MultiProcess
-enabled fitting developer/advanced documentation – available through GitHub – was updated. It now contains the most up to date usage instructions for optimizing load balancing (and hence run speed) using this backend.
The RooStats::MarkovChain::GetAsDataSet
and RooStats::MarkovChain::GetAsDataHist
functions are deprecated and will be removed in ROOT 6.36. The same functionality can be implemented by calling RooAbsData::reduce
on the Markov Chain’s RooDataSet*
(obtained using MarkovChain::GetAsConstDataSet
) and then obtaining its binned clone(for RooDataHist
).
An example in Python would be:
mcInt = mc.GetInterval() # Obtain the MCMCInterval from a configured MCMCCalculator
mkc = mcInt.GetChain() # Obtain the MarkovChain
mkcData = mkc.GetAsConstDataSet()
mcIntParams = mcInt.GetParameters()
chainDataset = mkcData.reduce(SelectVars=mcIntParams, EventRange=(mcInt.GetNumBurnInSteps(), mkc.Size()))
chainDataHist = chainDataset.binnedClone()
The following methods related to the RooAbsArg interface are deprecated and will be removed in ROOT 6.36. They should be replaced with the suitable alternatives interfaces:
RooAbsArg::getDependents()
: use getObservables()
RooAbsArg::dependentOverlaps()
: use observableOverlaps()
RooAbsArg::checkDependents()
: use checkObservables()
RooAbsArg::recursiveCheckDependents()
: use recursiveCheckObservables()
The support for new ONNX operators has been included in the SOFIE ONNX parser and in RModel in order to generate inference code for new types of models. The full list of currently supported operators is available here
The list of operators added for this release is the following: - Constant and ConstantOfShape - If - Range - ReduceSum - Split - Tile - TopK
In addition support in RModel has been added to generate the code with dynamic input shape parameter, such as the batch size. These input shape parameters can be specified at run time when evaluating the model. Since not all ONNX operators in SOFIE support yet dynamic input parameters, it is possible to initialize a parsed dynamic model with fixed values. For this, a new member function, RModel::Initialize(const std::map<std::string,size_t> & inputParams, bool verbose = false)
has been added. The RModel class has been extended to support sub-graph (needed for operator If
), dynamic tensors and constant tensors (for example those defined by the operator Constant
).
Support “haxis” draw option for histograms, allows superposition of several histograms drawn on the same pad with horizontal ty axis. Add tutorials\webcanv\haxis.cxx
macro demonstrating new feature.
Support “frame” draw option for several primitives like TBox
, TLine
, TLatex
. This enforce clipping of such objects by frame border. Provide demo in tutorials\webcanv\inframe.cxx
macro
Provide batch mode for image production with headless browser. In such mode data for several canvases collected together (in batch) and then N images are produced with single invocation of the web browser (chrome or firefox). For instance after TWebCanvas::BatchImageMode(100)
next 99 calls to TCanvas::SaveAs(filename)
method will not lead to image files creation. But with following call all 100 images will be produced together. Alternatively one can use TCanvas::SaveAll()
static method which allows to create images for several canvases at once.
Support multi-page PDF file creation with web-based canvas using svg2pdf.js
library. Both with native and web-baed graphics one can do now:
Or same can be achieved with:
In TGraphErrors
TGraphAsymmErrors
and TGraphBentErrors
, the error bars were drawn inside the marker when the marker was bigger than the error bars. This produced a weird plot. This is now fixed.
When error-bars exceeded the y range limits the end of error bars were nevertheless displayed was not correcton the x-bottom and top axis. So it looked like the total error bar while it was indeed not.
Choosing an appropriate color scheme is essential for making results easy to understand and interpret. Factors like colorblindness and converting colors to grayscale for publications can impact accessibility. Furthermore, results should be aesthetically pleasing. The following three color schemes, recommended by M. Petroff in arXiv:2107.02270v2 and available on GitHub under the MIT License, meet these criteria.
Implement properly the TScatter palette attributes as requested here.
Add TStyle::SetLegendFillStyle
Update RenderCore rendering engine to version 1.6 with improved implementation of Signed Distance Field (SDF) fonts.
Implement REveText element to draw text with SDF fonts in screen or world coordinates. See the new example in tutorials/eve7/texts.C
Add initial version of REve overlays: a 2D area in screen coordinates that can draw text and frames in relative proportions; support position and scale editing on the client side.
Draw axis labels with SDF fonts in the mixed space-screen coordinate system.
Introduce REveGeoTopNode: a wrapper over a TGeoNode, possibly displaced with a global transformation stored in REveElement. It holds a pointer to TGeoManager and controls for steering of TGeoPainter (fVisOption, fVisLevel and fMaxVisNodes).
Integrate JSRoot hierarchical node browser in REve as REveGeoTable element. The demonstration of this feature is included in example tutorial/eve7/eveGeoBrowser.C
The geometry package is now optional and activated by default in the CMake configuration. To disable it, use the -Dgeometry=OFF
CMake option.
Adjust rootssh
script to be usable on MacOS. Fixing problem to start more than one web widget on remote node.
Fix rootbrowse
script to be able properly use it with all kinds of web widgets. Provide --web=<type>
argument as for regular root executable.
Update openui5 library to version 1.128.0. Requires use of modern web-browsers, skipping IE support.
TTree::SetBranchAddress()
for array inputsIf you call TTree::SetBranchAddress
with NumPy array or array.array
inputs, ROOT will now check if the array type matches with the column type. If it doesn’t, SetBranchAddress()
will return a negative status code and print an error. Take for example this code snippet:
arr = array.array(typecode, "d")
status = t.SetBranchAddress("name", arr)
print("Status = %s" % (status, ))
If the branch type is also double
(like the type of the array indicated by "d"
), the call to SetBranchAddress()
would succeed with status code zero. If the type doesn’t match, you now get a clear error instead of garbage values.
Error in <TTree::SetBranchAddress>: The pointer type given "Double_t" (8) does not correspond to the type needed "Float_t" (5) by the branch: a
Status = -2
TPython::Eval()
The TPython::Eval()
method is deprecated and scheduled for removal in ROOT 6.36. Its implementation was fragile, and the same functionality can be achieved with TPython::Exec()
, using a C++ variable that is known to the ROOT interpreter for crossing over from Python to C++.
Example:
// Before, with TPython::Eval()
std::string stringVal = static_cast<const char*>(TPython::Eval("'done'"));
std::cout << stringVal << std::endl;
// Now, with TPython::Exec(). You can set `_anyresult` to whatever std::any you want.
// It will be swapped into the return variable in the end.
std::any result;
TPython::Exec("_anyresult = ROOT.std.make_any['std::string']('done')", &result);
std::cout << std::any_cast<std::string>(result) << std::endl;
Upgrade to JSROOT 7.8.0 with following new features and fixes:
TScatter
TH1
marker, text and line drawing superimposed with “haxis”TBox
, TLatex
, TLine
, TMarker
drawing on “frame”, support drawing on swapped axesTProfile
and TProfile2D
projections https://github.com/root-project/root/issues/15851TEfficiency
when draw option starts with ‘b’TEfficiency
, THStack
and TMultiGraph
with different draw options via hist context menuTMultiGraph
, support context menu for itTH3
/RH3
drawing by using THREE.InstancedMesh
settings.CutAxisLabels
flag to remove labels which may exceed graphical rangeTAxis
custom labels via context menuTWebCanvas
batch mode#url[link]{label}
syntax - including jsPDF supportTAttMarker
style with line width bigger than 1TMultiGraph
TProfile2D
if it has entries #316JSROOT is now used as default display in jupyter
.
The following builtins have been updated:
More than 160 items were addressed for this release. The full list is:
RFieldBase::Create
does not enforce valid field namesTH2Poly
fails.RDF/InterfaceUtils.hxx
std::string
to std::string_view
broken in 6.32findScope
thisroot.sh
tries to drop the wrong lib paths from the existing environmentMacOSX15.0.sdk
THStack
does not automatically shows negative binsRDF::Describe
returns an incorrect file count-Dminimal=ON
disables runtime_cxxmodules
cling::utils::Lookup::Named
does not look into using directiveTEnum::GetEnum
does not seem to see ‘through’ using statements.std::set
not working in Windows PyROOT-Dasan=ON
and memory leak in minimal buildcan't dereference value-initialized vector iterator
<Double32_t
> over <double>
specializationTH1::GetQuantiles
RNTupleView
’s move ctor causes double deleteconstexpr
function return incorrect value in WindowsTGraph::Add(TF1 *f)
method like for TH1
’sunique_ptr