diff --git a/README/ReleaseNotes/v636/index.md b/README/ReleaseNotes/v636/index.md index 66e1144fefdaa..f3257ae638da3 100644 --- a/README/ReleaseNotes/v636/index.md +++ b/README/ReleaseNotes/v636/index.md @@ -181,10 +181,6 @@ efficiently. Many small bugs were found and fixed. * extend `stressGraphics` test on more use-cases, including `TSpline`, `TScatter`, `TEfficiency`, `TProfile2D`, `TProfile3D`, `TGraph2DErrors`, `TGraph2DAsymmErrors` classes * enable `stressGraphics` tests for web-based graphics -## Geometry - -## Montecarlo - ## JavaScript ROOT ROOT 6.36 will use JSROOT 7.9.x release series. It includes following important changes: @@ -225,9 +221,6 @@ ROOT 6.36 will use JSROOT 7.9.x release series. It includes following important * Fix - correct axis range in `TScatter` drawing * Fix - use draw option also for graph drawing in `TTree::Draw` - -## Class Reference Guide - ## Build, Configuration and Testing Infrastructure ### New build options for dependiencies of image processing @@ -242,3 +235,191 @@ A few more options were added to make ROOT builds more reproducible and to avoid With default build option values, there is no difference in behavior compared to previous ROOT versions. The real benefit of the new options becomes apparent in builds with `fail-on-missing=ON`, because then the build will fail if any of the dependencies is not found. + +## Items addressed + +For this release, the following items have been addressed: + + * [[#18441](https://github.com/root-project/root/issues/18441)] - import ROOT fails after a template instantiation is invoked from cppyy + * [[#18404](https://github.com/root-project/root/issues/18404)] - [ntuple] Unable to read collection of `TObject` + * [[#18374](https://github.com/root-project/root/issues/18374)] - TH2Poly bin names are drawn with an angle of 1° with option "TEXTN" + * [[#18365](https://github.com/root-project/root/issues/18365)] - SetBranchAddress does not work with np.int16 and uint16 in PyROOT + * [[#18354](https://github.com/root-project/root/issues/18354)] - ROOT does not build some pre-requisites on macOS with latest Brew because of make v4.0... + * [[#18343](https://github.com/root-project/root/issues/18343)] - "Definitely lost" reported by Valgrind in TCling::InspectMembers + * [[#18329](https://github.com/root-project/root/issues/18329)] - [core] "Definitely lost" from Valgrind in TUnixSystem::UnixOpendir + * [[#18322](https://github.com/root-project/root/issues/18322)] - [RF] "Definitely lost" reported by Valgrind in RooAbsCollection + * [[#18312](https://github.com/root-project/root/issues/18312)] - Problem with cmake 4.0.0 + * [[#18306](https://github.com/root-project/root/issues/18306)] - macos 15.4 building bug of module map file + * [[#18304](https://github.com/root-project/root/issues/18304)] - TBrowser not opening in root cling CLI on Fedora if RBrowser lib was deleted after install + * [[#18298](https://github.com/root-project/root/issues/18298)] - [ntuple] RNTupleMerger: compress the generated zero pages + * [[#18285](https://github.com/root-project/root/issues/18285)] - [FreeBSD] root build fails in master + * [[#18251](https://github.com/root-project/root/issues/18251)] - RMiniFile.cxx harsh failure + * [[#18236](https://github.com/root-project/root/issues/18236)] - Missing lock deep inside TClassEdit::GetNormalizedName + * [[#18213](https://github.com/root-project/root/issues/18213)] - macos sequoia 15.4 homebrew - Failed to Open ROOT after today's update + * [[#18195](https://github.com/root-project/root/issues/18195)] - TBufferJSON not serializing std::map + * [[#18167](https://github.com/root-project/root/issues/18167)] - [ci] Apply Ruff Formatting to Changed Lines Only + * [[#18146](https://github.com/root-project/root/issues/18146)] - [Python] Preserve full Python trace when raising errors in callbacks + * [[#18128](https://github.com/root-project/root/issues/18128)] - installing with rapidyaml cmake found + * [[#18066](https://github.com/root-project/root/issues/18066)] - Using a ternary conditional expression in TTree::Draw may mess up the histogram specification. + * [[#18055](https://github.com/root-project/root/issues/18055)] - misterious dependency on `mkl` for conda+ROOT 6.34 + * [[#18013](https://github.com/root-project/root/issues/18013)] - [RF] RooFormula doesn't complain if you use input called `x` but don't supply it + * [[#18002](https://github.com/root-project/root/issues/18002)] - Memory issues reported by Valgrind when cloning `gROOT->GetListOfColors()` + * [[#17992](https://github.com/root-project/root/issues/17992)] - Spurrious auto parsing when looking up a TClass + * [[#17969](https://github.com/root-project/root/issues/17969)] - Failure of thisroot.sh on freebsd + * [[#17909](https://github.com/root-project/root/pull/17909)] - Prevent LLVM cmake from finding builtin zstd. + * [[#17900](https://github.com/root-project/root/issues/17900)] - [ntuple] Add write API with const pointers + * [[#17864](https://github.com/root-project/root/issues/17864)] - [Docs] TTree example is missing the critical lines + * [[#17859](https://github.com/root-project/root/issues/17859)] - [CMake] JupyROOT sources not correctly tracked by CMake + * [[#17848](https://github.com/root-project/root/issues/17848)] - [ntuple] Type normalization problems with types in template classes + * [[#17843](https://github.com/root-project/root/issues/17843)] - [TTreeReader] Crash in TNotifyLink with reused TChain with friend + * [[#17824](https://github.com/root-project/root/issues/17824)] - TDirectory::mkdir does not return the created directory + * [[#17820](https://github.com/root-project/root/issues/17820)] - Wrong interaction between indexed TTree friend, GetEntries, GetListOfFriends + * [[#17814](https://github.com/root-project/root/pull/17814)] - meta: Disable TClass creation during tear down. + * [[#17809](https://github.com/root-project/root/issues/17809)] - TGraph2D doc (TGraph2D::GetFunction does not work) + * [[#17774](https://github.com/root-project/root/issues/17774)] - [ntuple] ATLAS RNTuple Writing Issue (2025-02-19) + * [[#17757](https://github.com/root-project/root/issues/17757)] - TClass object can be generated during tear down which can lead to the user of already deleted resources. + * [[#17754](https://github.com/root-project/root/issues/17754)] - [docu] TMinuit2 weird links + * [[#17753](https://github.com/root-project/root/issues/17753)] - Race condition in TClass::fStreamerImpl value for emulated classes. + * [[#17744](https://github.com/root-project/root/pull/17744)] - [skip-ci] move minuit2 user guide to doxygen and remove outdated info + * [[#17729](https://github.com/root-project/root/issues/17729)] - [Python Interface] Regression: can't properly convert a vector to 2D/3D numpy array + * [[#17715](https://github.com/root-project/root/issues/17715)] - Disable Docs workflow for forked repositories + * [[#17714](https://github.com/root-project/root/pull/17714)] - Prevent a race condition in fStreamerImpl value + * [[#17691](https://github.com/root-project/root/issues/17691)] - Crash when building dataframe from TChain + * [[#17686](https://github.com/root-project/root/issues/17686)] - C++23 crash in DiagnosticInfo.h + * [[#17658](https://github.com/root-project/root/issues/17658)] - Remove infinities in RooFit Crystal Ball PDF + * [[#17652](https://github.com/root-project/root/pull/17652)] - [TTree] when merging, ignore trees without branches + * [[#17648](https://github.com/root-project/root/issues/17648)] - [ntuple] Record field emulation not working with TFile + * [[#17634](https://github.com/root-project/root/issues/17634)] - TH1 Documentation: broken links to "Further Python fitting examples" + * [[#17570](https://github.com/root-project/root/issues/17570)] - [ntuple] Missing type name normalization for meta fields + * [[#17564](https://github.com/root-project/root/issues/17564)] - [RF] Test failure: TestLandauEvil.CompareFixedValuesNorm + * [[#17515](https://github.com/root-project/root/issues/17515)] - `-isysroot;` in CLING_CXX_PATH_ARGS: erroneous semicolon? + * [[#17497](https://github.com/root-project/root/issues/17497)] - Particular combination of function overload and std::runtime_error leads to segfault + * [[#17486](https://github.com/root-project/root/issues/17486)] - Sanity check for Vary is too restrictive + * [[#17485](https://github.com/root-project/root/issues/17485)] - Need more checks in RDataFrame + * [[#17472](https://github.com/root-project/root/issues/17472)] - RooEllipse not drawn in notebooks with `%jsroot on` + * [[#17470](https://github.com/root-project/root/issues/17470)] - Unwanted black line at y == 0 in TMultiGraph with TH1::SetDefaultSumw2() + * [[#17461](https://github.com/root-project/root/issues/17461)] - `builtin_clang=OFF` broken because of missing transitive dependencies + * [[#17456](https://github.com/root-project/root/issues/17456)] - Test failures when compiling ROOT with gcc 15 + * [[#17454](https://github.com/root-project/root/issues/17454)] - roottest/root/io/prefetching fails when Davix is disabled + * [[#17449](https://github.com/root-project/root/issues/17449)] - [DF] Issues with RDataSpec paths using EOS + * [[#17444](https://github.com/root-project/root/issues/17444)] - ROOT doesn't compile with gcc-15 + * [[#17418](https://github.com/root-project/root/issues/17418)] - Add option to change default basket size in RDataFrame Snapshot + * [[#17408](https://github.com/root-project/root/pull/17408)] - [skip-ci] Fix THistpainter tables + * [[#17350](https://github.com/root-project/root/issues/17350)] - rootreadspeed should be marked as "CMAKENOEXPORT" + * [[#17346](https://github.com/root-project/root/issues/17346)] - I/O Customization rules fails in case of changes in the inputs types. + * [[#17330](https://github.com/root-project/root/pull/17330)] - Text precision must be 2 in PaintText + * [[#17323](https://github.com/root-project/root/pull/17323)] - [RF] Remove unused sel rule for RooStats::ToyMCPayload + * [[#17321](https://github.com/root-project/root/issues/17321)] - [RF] Unused Class rule + * [[#17320](https://github.com/root-project/root/issues/17320)] - [RF] Race when testing RooStats with its tutorials via CTest + * [[#17305](https://github.com/root-project/root/issues/17305)] - The ONNX.Tile5D test in tmva/sofie/test/TestCustomModelsFromONNX.cxx writes array elements beyond the last element in the array. + * [[#17295](https://github.com/root-project/root/issues/17295)] - constprefix incorrectly set in TClassEdit + * [[#17291](https://github.com/root-project/root/issues/17291)] - [RF] Parameter ordering bug in RooFormulaArgStreamer + * [[#17274](https://github.com/root-project/root/issues/17274)] - Veccore won't compile with clang 19 + * [[#17263](https://github.com/root-project/root/issues/17263)] - [RDF] 'DistRDF.Ranges' has no attribute 'get_clusters_and_entries' + * [[#17225](https://github.com/root-project/root/issues/17225)] - TFormula: Possibility of failure during dynamic compilation of predefined functions "gausn" and "landau" + * [[#17223](https://github.com/root-project/root/issues/17223)] - TFileMerger leaves files open resulting in corrupt metadata + * [[#17222](https://github.com/root-project/root/issues/17222)] - Regression in Python ownership for histograms within subdirectories with ROOT 6.34.00 + * [[#17214](https://github.com/root-project/root/issues/17214)] - [ntuple] Optimize `RArrayField` reading + * [[#17190](https://github.com/root-project/root/issues/17190)] - Compiler error (GCC 14.2.0 on Linux) + * [[#17163](https://github.com/root-project/root/issues/17163)] - Warnings from the deserialization of RooCrystalBall + * [[#17157](https://github.com/root-project/root/issues/17157)] - operator errors in cppyy + * [[#17145](https://github.com/root-project/root/issues/17145)] - Distributed RDataFrame cannot deal with same column name in different branches + * [[#17142](https://github.com/root-project/root/issues/17142)] - Check Python code formatting in CI + * [[#17135](https://github.com/root-project/root/issues/17135)] - Add Alias transformation to distributed RDataFrame + * [[#17109](https://github.com/root-project/root/issues/17109)] - [PyROOT] False positive in cppyy proxy cache + * [[#17076](https://github.com/root-project/root/issues/17076)] - Double shadow in `TPaveText` + * [[#17040](https://github.com/root-project/root/issues/17040)] - Small difference between kp6Violet implementation and official value from Petroff paper + * [[#16976](https://github.com/root-project/root/issues/16976)] - Strange overflow bin bar when plotting TH1D with X1 option + * [[#16946](https://github.com/root-project/root/issues/16946)] - Crash in RDF constructor with empty file list + * [[#16936](https://github.com/root-project/root/issues/16936)] - [ntuple] RClusterPool can crash on non-existing cluster + * [[#16915](https://github.com/root-project/root/issues/16915)] - `TThreadExecutor::Map` is private, users can only run `MapReduce`. + * [[#16841](https://github.com/root-project/root/issues/16841)] - Validate `REntry` belonging to right model when reading + * [[#16794](https://github.com/root-project/root/issues/16794)] - TFormula: Pol functions do not accept variable name as arguments + * [[#16784](https://github.com/root-project/root/issues/16784)] - Remove default value of p from TH1::GetQuantiles() as is the case with TF1::GetQuantiles + * [[#16736](https://github.com/root-project/root/issues/16736)] - Please improve documentation and/or argument names for TH1::GetQuantiles() + * [[#16725](https://github.com/root-project/root/issues/16725)] - Pyroot crashes reading TClonesArray in a TTree + * [[#16720](https://github.com/root-project/root/issues/16720)] - 4 TMVA test requires BLAS library but run even when it was not found. + * [[#16687](https://github.com/root-project/root/issues/16687)] - Loss of floating point precision when saving TCanvas as ROOT macro + * [[#16487](https://github.com/root-project/root/issues/16487)] - Doc for `RInterface::Take` isn't clear about `column` parameter + * [[#16312](https://github.com/root-project/root/issues/16312)] - Broken streaming of vector of enum with underlying type other than int + * [[#16189](https://github.com/root-project/root/issues/16189)] - TFile::k630forwardCompatibility does not apply to new files correctly + * [[#16146](https://github.com/root-project/root/issues/16146)] - [ntuple] Additional information in RNTupleInspector::PrintColumnTypeInfo() + * [[#16034](https://github.com/root-project/root/issues/16034)] - [ntuple] Unable to use `std::vector` in RDF + * [[#15959](https://github.com/root-project/root/issues/15959)] - [RF] Make Offset(“bin”) usable for CLs method + * [[#15538](https://github.com/root-project/root/issues/15538)] - Enable additional LLVM checks + * [[#15364](https://github.com/root-project/root/issues/15364)] - [Win32] tutorial-roostats-rs101_limitexample-py fails with a segfault + * [[#15267](https://github.com/root-project/root/issues/15267)] - vc.modulemap created (and registered) when ROOT built without support for Vc + * [[#15091](https://github.com/root-project/root/issues/15091)] - Clad is an optional module but TFormula (and tests of) fails without it. + * [[#15082](https://github.com/root-project/root/issues/15082)] - [DF] In Histo2D, support different types of Data and Weights columns + * [[#14953](https://github.com/root-project/root/issues/14953)] - [cmake] Glob when copying headers and tutorials + * [[#14766](https://github.com/root-project/root/issues/14766)] - RResulPtr could better convey/share ownership of pointee + * [[#14583](https://github.com/root-project/root/issues/14583)] - [ROOT_5159] Improve TTree documentation about SetMakeClass() + * [[#14557](https://github.com/root-project/root/issues/14557)] - [ROOT-4550] TMessage doesn't honour kIsOwner bit when compression is used + * [[#14556](https://github.com/root-project/root/issues/14556)] - [ROOT-3452] Suggestions for Minimizer documentation + * [[#14425](https://github.com/root-project/root/issues/14425)] - PyROOT calls into deleted copy-constructor in valid C++ scenarios + * [[#14304](https://github.com/root-project/root/issues/14304)] - [math] Finite difference methods for Gradient + * [[#14007](https://github.com/root-project/root/issues/14007)] - Cannot create a RNtuple into a TDirectory + * [[#13880](https://github.com/root-project/root/issues/13880)] - Stats box content changes after zoom/unzoom with mouse wheel + * [[#13800](https://github.com/root-project/root/issues/13800)] - [DF] RDatasetSpec allows a global range larger than the actual dataset + * [[#12673](https://github.com/root-project/root/issues/12673)] - [ntuple] Crash when using RNTuple at prompt + * [[#12537](https://github.com/root-project/root/issues/12537)] - Segmentation violation when trying to open particular cycle using TBrowser + * [[#12510](https://github.com/root-project/root/issues/12510)] - Issue with `hadd` when first file has empty tree + * [[#12505](https://github.com/root-project/root/issues/12505)] - CI: PR should "fail" in case of warnings + * [[#12497](https://github.com/root-project/root/issues/12497)] - SetShowProjection highlights wrong bins on 2d histogram with logarithmic axis + * [[#12251](https://github.com/root-project/root/issues/12251)] - Problems with `TH1::GetQuantiles` + * [[#12225](https://github.com/root-project/root/issues/12225)] - [RF] Allowing to use AddPreprocessFunction for shape factors in HistFactory + * [[#11959](https://github.com/root-project/root/issues/11959)] - RDataFrame member function RDataFrame::GraphErrors + * [[#11675](https://github.com/root-project/root/issues/11675)] - `rootls` should not show errors when seeing a branch of class without dictionary + * [[#11448](https://github.com/root-project/root/issues/11448)] - Irrelevant binaries in CMake export set + * [[#10948](https://github.com/root-project/root/issues/10948)] - Two ClassImp statements in the same compilation unit result in a redefinition error + * [[#10774](https://github.com/root-project/root/issues/10774)] - [TTree] Inconcistency with the TTreeReader's SetEntries. + * [[#10769](https://github.com/root-project/root/issues/10769)] - [hist] Use correct rounding for parameters in TFormula::GetExpFormula + * [[#10749](https://github.com/root-project/root/issues/10749)] - RNTupleDS should check for column type mismatches + * [[#10102](https://github.com/root-project/root/issues/10102)] - `hadd` segfaults when the output file is too large + * [[#10024](https://github.com/root-project/root/issues/10024)] - `TTree::SaveAs` should error out when using with unsupported format. + * [[#10019](https://github.com/root-project/root/issues/10019)] - [ntuple] Add support for automatic schema evolution and I/O rules + * [[#9335](https://github.com/root-project/root/issues/9335)] - [hist] TGraphMultiErrors: needs some improvements in interface and better documentation + * [[#9319](https://github.com/root-project/root/issues/9319)] - [TTree] Print("clusters") off-by-one error in case of partial clusters + * [[#8951](https://github.com/root-project/root/issues/8951)] - Add optional flag to include underflow and overflow weights when returning sum of weights from histogram + * [[#7254](https://github.com/root-project/root/issues/7254)] - [RF] RooHypatia2 Analytical integral integration + * [[#6682](https://github.com/root-project/root/issues/6682)] - Add an option to draw "XKCD" plot in ROOT7 + * [[#6640](https://github.com/root-project/root/issues/6640)] - TFileMerger output file is deleted when TTree::ChangeFile is triggered by reaching a file size greater than TTree::GetMaxTreeSize + * [[#6607](https://github.com/root-project/root/issues/6607)] - TClassEdit::GetNormalizedName does not strip std::allocator on Windows + * [[ROOT-11020](https://its.cern.ch/jira/browse/ROOT-11020)] - Add function to evaluate expressions using fit parameters + * [[ROOT-10907](https://its.cern.ch/jira/browse/ROOT-10907)] - Allow to pass non-integer numbers of events to TEfficiency::SetTotalEvents and TEfficiency::SetPassedEvents methods + * [[ROOT-10823](https://its.cern.ch/jira/browse/ROOT-10823)] - [TTreeReader] Add method to check whether TTreeReaderArray contents are contiguous + * [[ROOT-10780](https://its.cern.ch/jira/browse/ROOT-10780)] - [cling] Cannot use trailing return types at prompt + * [[ROOT-10621](https://its.cern.ch/jira/browse/ROOT-10621)] - Segfault if TFile is used with TRint in teardown + * [[ROOT-10553](https://its.cern.ch/jira/browse/ROOT-10553)] - TSQLStatement::GetBinary is not consistently implemented + * [[ROOT-10537](https://its.cern.ch/jira/browse/ROOT-10537)] - CMakeList.txt environment cleanup inaccurate + * [[ROOT-10482](https://its.cern.ch/jira/browse/ROOT-10482)] - pullHist and residHist biased (or sampling biased) + * [[ROOT-10249](https://its.cern.ch/jira/browse/ROOT-10249)] - TDataMember::GetOptions returns empty list for enum members + * [[ROOT-10239](https://its.cern.ch/jira/browse/ROOT-10239)] - rootcling crashes on -Werror + unknown warning flag to clang + * [[ROOT-9886](https://its.cern.ch/jira/browse/ROOT-9886)] - TTreeReader loads wrong entry from chain friend + * [[ROOT-9833](https://its.cern.ch/jira/browse/ROOT-9833)] - TMVA crashes adding single event w/o prior var def + * [[ROOT-9753](https://its.cern.ch/jira/browse/ROOT-9753)] - UB Sanitizer Complaining About clang shared_ptr issue + * [[ROOT-9688](https://its.cern.ch/jira/browse/ROOT-9688)] - Be more specific about which tutorials/ to copy + * [[ROOT-9204](https://its.cern.ch/jira/browse/ROOT-9204)] - Impossible to use RooFrame or RooCurve chiSquare method if data histogram has option XErrorSize(0) + * [[ROOT-9013](https://its.cern.ch/jira/browse/ROOT-9013)] - Get rid of AbstractMethod() + * [[ROOT-8775](https://its.cern.ch/jira/browse/ROOT-8775)] - TTree::MakeSelector can produce invalid C++ code + * [[ROOT-8725](https://its.cern.ch/jira/browse/ROOT-8725)] - Thread-unsafe statics in GSLInterpolator + * [[ROOT-8397](https://its.cern.ch/jira/browse/ROOT-8397)] - TGraphSmooth::Approx graph misbehaves around the maximal "x" value + * [[ROOT-8278](https://its.cern.ch/jira/browse/ROOT-8278)] - roofit asymmetry plots create object names which fail when saving plot as macro + * [[ROOT-8240](https://its.cern.ch/jira/browse/ROOT-8240)] - Must not unload or reload cling runtime universe + * [[ROOT-8112](https://its.cern.ch/jira/browse/ROOT-8112)] - not possible to add filename to TChain which doesn't end in .root, with treename + * [[ROOT-7926](https://its.cern.ch/jira/browse/ROOT-7926)] - TTree::Print("toponly") does not account correctly top branches + * [[ROOT-7855](https://its.cern.ch/jira/browse/ROOT-7855)] - Inconsistent behaviour when cloning a tree using TChain and TTree + * [[ROOT-7626](https://its.cern.ch/jira/browse/ROOT-7626)] - TRegexp::MakeWildcard should support escape sequence + * [[ROOT-7372](https://its.cern.ch/jira/browse/ROOT-7372)] - Accessing complex map branches crashes in PyROOT + * [[ROOT-7322](https://its.cern.ch/jira/browse/ROOT-7322)] - Missing Overload for TF1 GetParError + * [[ROOT-7067](https://its.cern.ch/jira/browse/ROOT-7067)] - tree->GetMaximum() not working with TChain and TEntryList + * [[ROOT-6874](https://its.cern.ch/jira/browse/ROOT-6874)] - Suggested function TF1::EvalUncertainty() + * [[ROOT-6636](https://its.cern.ch/jira/browse/ROOT-6636)] - Tab completion fails for CV-qualified pointers and objects + * [[ROOT-5820](https://its.cern.ch/jira/browse/ROOT-5820)] - Multiple issues with TFileMerger in single file case + * [[ROOT-5588](https://its.cern.ch/jira/browse/ROOT-5588)] - GetEntries moves state of fReadEntry in TTree + * [[ROOT-5439](https://its.cern.ch/jira/browse/ROOT-5439)] - Dump-output of TH1 not showing pointerness of fArray + * [[ROOT-5137](https://its.cern.ch/jira/browse/ROOT-5137)] - Enhance error recover in TTreeCloner + * [[ROOT-4663](https://its.cern.ch/jira/browse/ROOT-4663)] - GetFromPipe() loses the return value + * [[ROOT-4012](https://its.cern.ch/jira/browse/ROOT-4012)] - TTree::SetAlias() fail to interpret the constant + * [[ROOT-119](https://its.cern.ch/jira/browse/ROOT-119)] - Implement Write rules + * [[ROOT-118](https://its.cern.ch/jira/browse/ROOT-118)] - Implement support for access to nested objects \ No newline at end of file diff --git a/core/foundation/inc/ROOT/RVersion.hxx b/core/foundation/inc/ROOT/RVersion.hxx index 455dd0159949e..bda86c63a97b6 100644 --- a/core/foundation/inc/ROOT/RVersion.hxx +++ b/core/foundation/inc/ROOT/RVersion.hxx @@ -3,8 +3,8 @@ /* Update on release: */ #define ROOT_VERSION_MAJOR 6 -#define ROOT_VERSION_MINOR 37 -#define ROOT_VERSION_PATCH 1 +#define ROOT_VERSION_MINOR 35 +#define ROOT_VERSION_PATCH 99 #define ROOT_RELEASE_DATE "Apr 4 2025" /* Don't change the lines below. */ diff --git a/documentation/doxygen/Doxyfile b/documentation/doxygen/Doxyfile index c9c2fdd8f31bc..0b07359451403 100644 --- a/documentation/doxygen/Doxyfile +++ b/documentation/doxygen/Doxyfile @@ -1597,7 +1597,7 @@ SITEMAP_URL = # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -GENERATE_QHP = YES +GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to diff --git a/documentation/doxygen/Makefile b/documentation/doxygen/Makefile index aa3d01d3a2f84..292f3a7035448 100644 --- a/documentation/doxygen/Makefile +++ b/documentation/doxygen/Makefile @@ -65,7 +65,6 @@ doxygen: filter pyzdoc doxygen bash ./CleanNamespaces.sh gzip $(DOXYGEN_IMAGE_PATH)/ROOT.tag - gzip $(DOXYGEN_IMAGE_PATH)/ROOT.qch rm -rf files c1* *.ps *.eps *.png *.jpg *.tex *.svg *.pdf *.root *.xpm *.out *.dat *.dtd *.dot *.txt *.csv *.log *.rs rm -rf listofclass.sh tmva* data* result* config* test* Roo* My* Freq* rm -f Doxyfile_INPUT filter htmlfooter.html MDF.C pca.C diff --git a/tree/ntuple/inc/ROOT/RCluster.hxx b/tree/ntuple/inc/ROOT/RCluster.hxx index 478c165aae95a..b206554763a8d 100644 --- a/tree/ntuple/inc/ROOT/RCluster.hxx +++ b/tree/ntuple/inc/ROOT/RCluster.hxx @@ -26,12 +26,11 @@ #include namespace ROOT { -namespace Experimental { namespace Internal { // clang-format off /** -\class ROnDiskPage +\class ROOT::Internal::ROnDiskPage \ingroup NTuple \brief A page as being stored on disk, that is packed and compressed @@ -68,16 +67,15 @@ public: }; // class ROnDiskPage } // namespace Internal -} // namespace Experimental } // namespace ROOT // For hash maps ROnDiskPage::Key --> ROnDiskPage namespace std { template <> -struct hash { +struct hash { // TODO(jblomer): quick and dirty hash, likely very sub-optimal, to be revised later. - size_t operator()(const ROOT::Experimental::Internal::ROnDiskPage::Key &key) const + size_t operator()(const ROOT::Internal::ROnDiskPage::Key &key) const { return ( (std::hash()(key.fPhysicalColumnId) ^ (hash()(key.fPageNo) << 1)) >> @@ -86,14 +84,12 @@ struct hash { }; } - namespace ROOT { -namespace Experimental { namespace Internal { // clang-format off /** -\class ROOT::Experimental::Internal::ROnDiskPageMap +\class ROOT::Internal::ROnDiskPageMap \ingroup NTuple \brief A memory region that contains packed and compressed pages @@ -122,7 +118,7 @@ public: // clang-format off /** -\class ROOT::Experimental::Internal::ROnDiskPageMapHeap +\class ROOT::Internal::ROnDiskPageMapHeap \ingroup NTuple \brief An ROnDiskPageMap that is used for an fMemory allocated as an array of unsigned char. */ @@ -142,7 +138,7 @@ public: // clang-format off /** -\class ROOT::Experimental::Internal::RCluster +\class ROOT::Internal::RCluster \ingroup NTuple \brief An in-memory subset of the packed and compressed pages of a cluster @@ -199,7 +195,6 @@ public: }; // class RCluster } // namespace Internal -} // namespace Experimental } // namespace ROOT #endif diff --git a/tree/ntuple/inc/ROOT/RClusterPool.hxx b/tree/ntuple/inc/ROOT/RClusterPool.hxx index 620c977ff4ae2..2de7beb2860b5 100644 --- a/tree/ntuple/inc/ROOT/RClusterPool.hxx +++ b/tree/ntuple/inc/ROOT/RClusterPool.hxx @@ -33,12 +33,11 @@ namespace Internal { class RPageSource; } -namespace Experimental { namespace Internal { // clang-format off /** -\class ROOT::Experimental::Internal::RClusterPool +\class ROOT::Internal::RClusterPool \ingroup NTuple \brief Managed a set of clusters containing compressed and packed pages @@ -142,7 +141,6 @@ public: }; // class RClusterPool } // namespace Internal -} // namespace Experimental } // namespace ROOT #endif diff --git a/tree/ntuple/inc/ROOT/RField/RFieldSequenceContainer.hxx b/tree/ntuple/inc/ROOT/RField/RFieldSequenceContainer.hxx index 86356756f369b..c817742ae9fd6 100644 --- a/tree/ntuple/inc/ROOT/RField/RFieldSequenceContainer.hxx +++ b/tree/ntuple/inc/ROOT/RField/RFieldSequenceContainer.hxx @@ -313,7 +313,7 @@ public: //////////////////////////////////////////////////////////////////////////////// /** -\class ROOT::Experimental::RArrayAsRVecField +\class ROOT::RArrayAsRVecField \brief A field for fixed-size arrays that are represented as RVecs in memory. \ingroup NTuple This class is used only for reading. In particular, it helps exposing diff --git a/tree/ntuple/inc/ROOT/RNTupleDescriptor.hxx b/tree/ntuple/inc/ROOT/RNTupleDescriptor.hxx index 3587b6071723b..b9a0a8a50e618 100644 --- a/tree/ntuple/inc/ROOT/RNTupleDescriptor.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleDescriptor.hxx @@ -235,7 +235,7 @@ class RClusterDescriptor final { public: // clang-format off /** - \class ROOT::Experimental::RClusterDescriptor::RColumnRange + \class ROOT::RClusterDescriptor::RColumnRange \ingroup NTuple \brief The window of element indexes of a particular column in a particular cluster */ diff --git a/tree/ntuple/inc/ROOT/RNTupleMerger.hxx b/tree/ntuple/inc/ROOT/RNTupleMerger.hxx index 6e0713a1d0e5c..15ea7fc63f7c0 100644 --- a/tree/ntuple/inc/ROOT/RNTupleMerger.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleMerger.hxx @@ -32,6 +32,7 @@ class RNTuple; namespace Internal { class RPageAllocator; +class RClusterPool; } namespace Experimental::Internal { @@ -59,8 +60,6 @@ struct RColumnMergeInfo; struct RNTupleMergeData; struct RSealedPageMergeData; -class RClusterPool; - /// Set of merging options to pass to RNTupleMerger. /// If you're using the merger through TFileMerger you need to give it string-based options instead. /// Here is the mapping for the TFileMerger options: @@ -99,11 +98,11 @@ class RNTupleMerger final { std::optional fTaskGroup; std::unique_ptr fModel; - void MergeCommonColumns(RClusterPool &clusterPool, const ROOT::RClusterDescriptor &clusterDesc, + void MergeCommonColumns(ROOT::Internal::RClusterPool &clusterPool, const ROOT::RClusterDescriptor &clusterDesc, std::span commonColumns, - const RCluster::ColumnSet_t &commonColumnSet, std::size_t nCommonColumnsInCluster, - RSealedPageMergeData &sealedPageData, const RNTupleMergeData &mergeData, - ROOT::Internal::RPageAllocator &pageAlloc); + const ROOT::Internal::RCluster::ColumnSet_t &commonColumnSet, + std::size_t nCommonColumnsInCluster, RSealedPageMergeData &sealedPageData, + const RNTupleMergeData &mergeData, ROOT::Internal::RPageAllocator &pageAlloc); void MergeSourceClusters(ROOT::Internal::RPageSource &source, std::span commonColumns, std::span extraDstColumns, RNTupleMergeData &mergeData); diff --git a/tree/ntuple/inc/ROOT/RPageStorage.hxx b/tree/ntuple/inc/ROOT/RPageStorage.hxx index 2b37e74b20555..039188f9c61bc 100644 --- a/tree/ntuple/inc/ROOT/RPageStorage.hxx +++ b/tree/ntuple/inc/ROOT/RPageStorage.hxx @@ -667,7 +667,7 @@ protected: public: void Insert(ROOT::DescriptorId_t physicalColumnId, ROOT::Internal::RColumnElementBase::RIdentifier elementId); void Erase(ROOT::DescriptorId_t physicalColumnId, ROOT::Internal::RColumnElementBase::RIdentifier elementId); - ROOT::Experimental::Internal::RCluster::ColumnSet_t ToColumnSet() const; + ROOT::Internal::RCluster::ColumnSet_t ToColumnSet() const; bool HasColumnInfos(ROOT::DescriptorId_t physicalColumnId) const { return fColumnInfos.count(physicalColumnId) > 0; @@ -703,7 +703,7 @@ protected: /// Returns a new, unattached page source for the same data set virtual std::unique_ptr CloneImpl() const = 0; // Only called if a task scheduler is set. No-op be default. - virtual void UnzipClusterImpl(ROOT::Experimental::Internal::RCluster *cluster); + virtual void UnzipClusterImpl(ROOT::Internal::RCluster *cluster); // Returns a page from storage if not found in the page pool. Should be able to handle zero page locators. virtual ROOT::Internal::RPageRef LoadPageImpl(ColumnHandle_t columnHandle, const RClusterInfo &clusterInfo, ROOT::NTupleSize_t idxInCluster) = 0; @@ -712,8 +712,7 @@ protected: /// `kTypePageZero` locator are filled in `pageZeroMap`; otherwise, `perPageFunc` is called for each page. This is /// commonly used as part of `LoadClusters()` in derived classes. void PrepareLoadCluster( - const ROOT::Experimental::Internal::RCluster::RKey &clusterKey, - ROOT::Experimental::Internal::ROnDiskPageMap &pageZeroMap, + const ROOT::Internal::RCluster::RKey &clusterKey, ROOT::Internal::ROnDiskPageMap &pageZeroMap, std::function perPageFunc); @@ -805,15 +804,15 @@ public: /// for the cluster would assume an incomplete cluster and trigger loading again. /// `LoadClusters()` is typically called from the I/O thread of a cluster pool, i.e. the method runs /// concurrently to other methods of the page source. - virtual std::vector> - LoadClusters(std::span clusterKeys) = 0; + virtual std::vector> + LoadClusters(std::span clusterKeys) = 0; /// Parallel decompression and unpacking of the pages in the given cluster. The unzipped pages are supposed /// to be preloaded in a page pool attached to the source. The method is triggered by the cluster pool's /// unzip thread. It is an optional optimization, the method can safely do nothing. In particular, the /// actual implementation will only run if a task scheduler is set. In practice, a task scheduler is set /// if implicit multi-threading is turned on. - void UnzipCluster(ROOT::Experimental::Internal::RCluster *cluster); + void UnzipCluster(ROOT::Internal::RCluster *cluster); // TODO(gparolini): for symmetry with SealPage(), we should either make this private or SealPage() public. RResult diff --git a/tree/ntuple/inc/ROOT/RPageStorageDaos.hxx b/tree/ntuple/inc/ROOT/RPageStorageDaos.hxx index 68c86a1d7e0c2..4b7962bb1f1ff 100644 --- a/tree/ntuple/inc/ROOT/RPageStorageDaos.hxx +++ b/tree/ntuple/inc/ROOT/RPageStorageDaos.hxx @@ -31,12 +31,15 @@ #include namespace ROOT { -namespace Experimental { namespace Internal { -using ntuple_index_t = std::uint32_t; class RCluster; class RClusterPool; +} // namespace Internal + +namespace Experimental { +namespace Internal { +using ntuple_index_t = std::uint32_t; class RDaosPool; class RDaosContainer; class RPageAllocatorHeap; @@ -151,13 +154,13 @@ private: ntuple_index_t fNTupleIndex{0}; /// The last cluster from which a page got loaded. Points into fClusterPool->fPool - RCluster *fCurrentCluster = nullptr; + ROOT::Internal::RCluster *fCurrentCluster = nullptr; /// A container that stores object data (header/footer, pages, etc.) std::unique_ptr fDaosContainer; /// A URI to a DAOS pool of the form 'daos://pool-label/container-label' std::string fURI; /// The cluster pool asynchronously preloads the next few clusters - std::unique_ptr fClusterPool; + std::unique_ptr fClusterPool; ROOT::Internal::RNTupleDescriptorBuilder fDescriptorBuilder; @@ -177,7 +180,8 @@ public: void LoadSealedPage(ROOT::DescriptorId_t physicalColumnId, RNTupleLocalIndex localIndex, RSealedPage &sealedPage) final; - std::vector> LoadClusters(std::span clusterKeys) final; + std::vector> + LoadClusters(std::span clusterKeys) final; /// Return the object class used for user data OIDs in this ntuple. std::string GetObjectClass() const; diff --git a/tree/ntuple/inc/ROOT/RPageStorageFile.hxx b/tree/ntuple/inc/ROOT/RPageStorageFile.hxx index 18fb8975500d8..b223d008f0c07 100644 --- a/tree/ntuple/inc/ROOT/RPageStorageFile.hxx +++ b/tree/ntuple/inc/ROOT/RPageStorageFile.hxx @@ -35,11 +35,8 @@ namespace ROOT { class RNTuple; // for making RPageSourceFile a friend of RNTuple class RNTupleLocator; -namespace Experimental::Internal { -class RClusterPool; -} - namespace Internal { +class RClusterPool; class RRawFile; class RPageAllocatorHeap; @@ -131,7 +128,7 @@ private: /// Either provided by CreateFromAnchor, or read from the ROOT file given the ntuple name std::optional fAnchor; /// The last cluster from which a page got loaded. Points into fClusterPool->fPool - ROOT::Experimental::Internal::RCluster *fCurrentCluster = nullptr; + ROOT::Internal::RCluster *fCurrentCluster = nullptr; /// An RRawFile is used to request the necessary byte ranges from a local or a remote file std::unique_ptr fFile; /// Takes the fFile to read ntuple blobs from it @@ -139,7 +136,7 @@ private: /// The descriptor is created from the header and footer either in AttachImpl or in CreateFromAnchor RNTupleDescriptorBuilder fDescriptorBuilder; /// The cluster pool asynchronously preloads the next few clusters - std::unique_ptr fClusterPool; + std::unique_ptr fClusterPool; /// Populated by LoadStructureImpl(), reset at the end of Attach() RStructureBuffer fStructureBuffer; @@ -149,9 +146,8 @@ private: /// read requests for a given cluster and columns. The reead requests are appended to /// the provided vector. This way, requests can be collected for multiple clusters before /// sending them to RRawFile::ReadV(). - std::unique_ptr - PrepareSingleCluster(const ROOT::Experimental::Internal::RCluster::RKey &clusterKey, - std::vector &readRequests); + std::unique_ptr + PrepareSingleCluster(const ROOT::Internal::RCluster::RKey &clusterKey, std::vector &readRequests); protected: void LoadStructureImpl() final; @@ -180,8 +176,8 @@ public: void LoadSealedPage(ROOT::DescriptorId_t physicalColumnId, RNTupleLocalIndex localIndex, RSealedPage &sealedPage) final; - std::vector> - LoadClusters(std::span clusterKeys) final; + std::vector> + LoadClusters(std::span clusterKeys) final; }; // class RPageSourceFile } // namespace Internal diff --git a/tree/ntuple/src/RCluster.cxx b/tree/ntuple/src/RCluster.cxx index c074ad3f58544..b9e0b479653b9 100644 --- a/tree/ntuple/src/RCluster.cxx +++ b/tree/ntuple/src/RCluster.cxx @@ -20,16 +20,15 @@ #include #include -ROOT::Experimental::Internal::ROnDiskPageMap::~ROnDiskPageMap() = default; +ROOT::Internal::ROnDiskPageMap::~ROnDiskPageMap() = default; //////////////////////////////////////////////////////////////////////////////// -ROOT::Experimental::Internal::ROnDiskPageMapHeap::~ROnDiskPageMapHeap() = default; +ROOT::Internal::ROnDiskPageMapHeap::~ROnDiskPageMapHeap() = default; //////////////////////////////////////////////////////////////////////////////// -const ROOT::Experimental::Internal::ROnDiskPage * -ROOT::Experimental::Internal::RCluster::GetOnDiskPage(const ROnDiskPage::Key &key) const +const ROOT::Internal::ROnDiskPage *ROOT::Internal::RCluster::GetOnDiskPage(const ROnDiskPage::Key &key) const { const auto itr = fOnDiskPages.find(key); if (itr != fOnDiskPages.end()) @@ -37,7 +36,7 @@ ROOT::Experimental::Internal::RCluster::GetOnDiskPage(const ROnDiskPage::Key &ke return nullptr; } -void ROOT::Experimental::Internal::RCluster::Adopt(std::unique_ptr pageMap) +void ROOT::Internal::RCluster::Adopt(std::unique_ptr pageMap) { auto &pages = pageMap->fOnDiskPages; fOnDiskPages.insert(std::make_move_iterator(pages.begin()), std::make_move_iterator(pages.end())); @@ -45,7 +44,7 @@ void ROOT::Experimental::Internal::RCluster::Adopt(std::unique_ptr #include -bool ROOT::Experimental::Internal::RClusterPool::RInFlightCluster::operator<(const RInFlightCluster &other) const +bool ROOT::Internal::RClusterPool::RInFlightCluster::operator<(const RInFlightCluster &other) const { if (fClusterKey.fClusterId == other.fClusterKey.fClusterId) { if (fClusterKey.fPhysicalColumnSet.size() == other.fClusterKey.fPhysicalColumnSet.size()) { @@ -48,8 +48,7 @@ bool ROOT::Experimental::Internal::RClusterPool::RInFlightCluster::operator<(con return fClusterKey.fClusterId < other.fClusterKey.fClusterId; } -ROOT::Experimental::Internal::RClusterPool::RClusterPool(ROOT::Internal::RPageSource &pageSource, - unsigned int clusterBunchSize) +ROOT::Internal::RClusterPool::RClusterPool(ROOT::Internal::RPageSource &pageSource, unsigned int clusterBunchSize) : fPageSource(pageSource), fClusterBunchSize(clusterBunchSize), fPool(2 * clusterBunchSize), @@ -58,7 +57,7 @@ ROOT::Experimental::Internal::RClusterPool::RClusterPool(ROOT::Internal::RPageSo R__ASSERT(clusterBunchSize > 0); } -ROOT::Experimental::Internal::RClusterPool::~RClusterPool() +ROOT::Internal::RClusterPool::~RClusterPool() { { // Controlled shutdown of the I/O thread @@ -69,7 +68,7 @@ ROOT::Experimental::Internal::RClusterPool::~RClusterPool() fThreadIo.join(); } -void ROOT::Experimental::Internal::RClusterPool::ExecReadClusters() +void ROOT::Internal::RClusterPool::ExecReadClusters() { std::deque readItems; while (true) { @@ -105,8 +104,7 @@ void ROOT::Experimental::Internal::RClusterPool::ExecReadClusters() } // while (true) } -ROOT::Experimental::Internal::RCluster * -ROOT::Experimental::Internal::RClusterPool::FindInPool(ROOT::DescriptorId_t clusterId) const +ROOT::Internal::RCluster *ROOT::Internal::RClusterPool::FindInPool(ROOT::DescriptorId_t clusterId) const { for (const auto &cptr : fPool) { if (cptr && (cptr->GetId() == clusterId)) @@ -115,7 +113,7 @@ ROOT::Experimental::Internal::RClusterPool::FindInPool(ROOT::DescriptorId_t clus return nullptr; } -size_t ROOT::Experimental::Internal::RClusterPool::FindFreeSlot() const +size_t ROOT::Internal::RClusterPool::FindFreeSlot() const { auto N = fPool.size(); for (unsigned i = 0; i < N; ++i) { @@ -133,7 +131,7 @@ namespace { /// Helper class for the (cluster, column list) pairs that should be loaded in the background class RProvides { using DescriptorId_t = ROOT::DescriptorId_t; - using ColumnSet_t = ROOT::Experimental::Internal::RCluster::ColumnSet_t; + using ColumnSet_t = ROOT::Internal::RCluster::ColumnSet_t; public: struct RInfo { @@ -182,9 +180,8 @@ class RProvides { } // anonymous namespace -ROOT::Experimental::Internal::RCluster * -ROOT::Experimental::Internal::RClusterPool::GetCluster(ROOT::DescriptorId_t clusterId, - const RCluster::ColumnSet_t &physicalColumns) +ROOT::Internal::RCluster * +ROOT::Internal::RClusterPool::GetCluster(ROOT::DescriptorId_t clusterId, const RCluster::ColumnSet_t &physicalColumns) { std::set keep; RProvides provide; @@ -328,9 +325,8 @@ ROOT::Experimental::Internal::RClusterPool::GetCluster(ROOT::DescriptorId_t clus return WaitFor(clusterId, physicalColumns); } -ROOT::Experimental::Internal::RCluster * -ROOT::Experimental::Internal::RClusterPool::WaitFor(ROOT::DescriptorId_t clusterId, - const RCluster::ColumnSet_t &physicalColumns) +ROOT::Internal::RCluster * +ROOT::Internal::RClusterPool::WaitFor(ROOT::DescriptorId_t clusterId, const RCluster::ColumnSet_t &physicalColumns) { while (true) { // Fast exit: the cluster happens to be already present in the cache pool @@ -383,7 +379,7 @@ ROOT::Experimental::Internal::RClusterPool::WaitFor(ROOT::DescriptorId_t cluster } } -void ROOT::Experimental::Internal::RClusterPool::WaitForInFlightClusters() +void ROOT::Internal::RClusterPool::WaitForInFlightClusters() { while (true) { decltype(fInFlightClusters)::iterator itr; diff --git a/tree/ntuple/src/RNTupleMerger.cxx b/tree/ntuple/src/RNTupleMerger.cxx index 19797c6f06cb8..97f1f335b5467 100644 --- a/tree/ntuple/src/RNTupleMerger.cxx +++ b/tree/ntuple/src/RNTupleMerger.cxx @@ -43,6 +43,7 @@ using ROOT::ENTupleColumnType; using ROOT::RNTupleModel; using ROOT::Internal::MakeUninitArray; +using ROOT::Internal::RCluster; using ROOT::Internal::RColumnElementBase; using ROOT::Internal::RNTupleSerializer; using ROOT::Internal::RPageSink; @@ -693,7 +694,8 @@ static void GenerateZeroPagesForColumns(size_t nEntriesToGenerate, std::span commonColumns, const RCluster::ColumnSet_t &commonColumnSet, std::size_t nCommonColumnsInCluster, RSealedPageMergeData &sealedPageData, @@ -768,7 +770,7 @@ void RNTupleMerger::MergeCommonColumns(RClusterPool &clusterPool, const ROOT::RC assert(sealedPageData.fBuffers.size() == 0 || pageIdx < sealedPageData.fBuffers.size()); assert(pageInfo.GetLocator().GetType() != RNTupleLocator::kTypePageZero); - ROnDiskPage::Key key{columnId, pageIdx}; + ROOT::Internal::ROnDiskPage::Key key{columnId, pageIdx}; auto onDiskPage = cluster->GetOnDiskPage(key); const auto checksumSize = pageInfo.HasChecksum() * RPageStorage::kNBytesPageChecksum; @@ -816,7 +818,7 @@ void RNTupleMerger::MergeCommonColumns(RClusterPool &clusterPool, const ROOT::RC void RNTupleMerger::MergeSourceClusters(RPageSource &source, std::span commonColumns, std::span extraDstColumns, RNTupleMergeData &mergeData) { - RClusterPool clusterPool{source}; + ROOT::Internal::RClusterPool clusterPool{source}; std::vector missingColumns{extraDstColumns.begin(), extraDstColumns.end()}; diff --git a/tree/ntuple/src/RPageStorage.cxx b/tree/ntuple/src/RPageStorage.cxx index 1cc3938acc0b0..1652f7ca3f4f4 100644 --- a/tree/ntuple/src/RPageStorage.cxx +++ b/tree/ntuple/src/RPageStorage.cxx @@ -50,9 +50,9 @@ using ROOT::Internal::RExtraTypeInfoDescriptorBuilder; using ROOT::Internal::RFieldDescriptorBuilder; using ROOT::Internal::RNTupleSerializer; -using ROOT::Experimental::Internal::RCluster; -using ROOT::Experimental::Internal::ROnDiskPage; -using ROOT::Experimental::Internal::ROnDiskPageMap; +using ROOT::Internal::RCluster; +using ROOT::Internal::ROnDiskPage; +using ROOT::Internal::ROnDiskPageMap; using ROOT::Experimental::Detail::RNTupleAtomicCounter; using ROOT::Experimental::Detail::RNTupleAtomicTimer; @@ -136,8 +136,7 @@ void ROOT::Internal::RPageSource::RActivePhysicalColumns::Erase(ROOT::Descriptor } } -ROOT::Experimental::Internal::RCluster::ColumnSet_t -ROOT::Internal::RPageSource::RActivePhysicalColumns::ToColumnSet() const +ROOT::Internal::RCluster::ColumnSet_t ROOT::Internal::RPageSource::RActivePhysicalColumns::ToColumnSet() const { RCluster::ColumnSet_t result; for (const auto &[physicalColumnId, _] : fColumnInfos) diff --git a/tree/ntuple/src/RPageStorageDaos.cxx b/tree/ntuple/src/RPageStorageDaos.cxx index 3f5e0a0279ea8..9fb04336d7786 100644 --- a/tree/ntuple/src/RPageStorageDaos.cxx +++ b/tree/ntuple/src/RPageStorageDaos.cxx @@ -45,6 +45,7 @@ using AttributeKey_t = ROOT::Experimental::Internal::RDaosContainer::AttributeKe using DistributionKey_t = ROOT::Experimental::Internal::RDaosContainer::DistributionKey_t; using ntuple_index_t = ROOT::Experimental::Internal::ntuple_index_t; using ROOT::Internal::MakeUninitArray; +using ROOT::Internal::RCluster; using ROOT::Internal::RNTupleCompressor; using ROOT::Internal::RNTupleDecompressor; using ROOT::Internal::RNTupleSerializer; @@ -489,8 +490,8 @@ ROOT::Experimental::Internal::RPageSourceDaos::RPageSourceDaos(std::string_view const ROOT::RNTupleReadOptions &options) : RPageSource(ntupleName, options), fURI(uri), - fClusterPool( - std::make_unique(*this, ROOT::Internal::RNTupleReadOptionsManip::GetClusterBunchSize(options))) + fClusterPool(std::make_unique( + *this, ROOT::Internal::RNTupleReadOptionsManip::GetClusterBunchSize(options))) { EnableDefaultMetrics("RPageSourceDaos"); @@ -642,7 +643,7 @@ ROOT::Internal::RPageRef ROOT::Experimental::Internal::RPageSourceDaos::LoadPage if (!cachedPageRef.Get().IsNull()) return cachedPageRef; - ROnDiskPage::Key key(columnId, pageInfo.GetPageNumber()); + ROOT::Internal::ROnDiskPage::Key key(columnId, pageInfo.GetPageNumber()); auto onDiskPage = fCurrentCluster->GetOnDiskPage(key); R__ASSERT(onDiskPage && (sealedPage.GetBufferSize() == onDiskPage->GetSize())); sealedPage.SetBuffer(onDiskPage->GetAddress()); @@ -667,7 +668,7 @@ std::unique_ptr ROOT::Experimental::Internal::RPage return std::unique_ptr(clone); } -std::vector> +std::vector> ROOT::Experimental::Internal::RPageSourceDaos::LoadClusters(std::span clusterKeys) { struct RDaosSealedPageLocator { @@ -692,7 +693,7 @@ ROOT::Experimental::Internal::RPageSourceDaos::LoadClusters(std::span> onDiskPages; unsigned clusterBufSz = 0, nPages = 0; - auto pageZeroMap = std::make_unique(); + auto pageZeroMap = std::make_unique(); PrepareLoadCluster( clusterKey, *pageZeroMap, [&](ROOT::DescriptorId_t physicalColumnId, ROOT::NTupleSize_t pageNo, @@ -710,7 +711,8 @@ ROOT::Experimental::Internal::RPageSourceDaos::LoadClusters(std::span(std::unique_ptr(clusterBuffer)); + auto pageMap = + std::make_unique(std::unique_ptr(clusterBuffer)); auto cageBuffer = clusterBuffer; // Fill the cluster page map and the read requests for the RDaosContainer::ReadV() call @@ -722,8 +724,8 @@ ROOT::Experimental::Internal::RPageSourceDaos::LoadClusters(std::spanRegister(key, ROnDiskPage(cageBuffer + s.fCageOffset, s.fBufferSize)); + ROOT::Internal::ROnDiskPage::Key key(s.fColumnId, s.fPageNo); + pageMap->Register(key, ROOT::Internal::ROnDiskPage(cageBuffer + s.fCageOffset, s.fBufferSize)); cageSz += s.fBufferSize; } @@ -751,7 +753,7 @@ ROOT::Experimental::Internal::RPageSourceDaos::LoadClusters(std::spanfNClusterLoaded.Add(clusterKeys.size()); - std::vector> clusters; + std::vector> clusters; RDaosContainer::MultiObjectRWOperation_t readRequests; for (auto key : clusterKeys) { clusters.emplace_back(fnPrepareSingleCluster(key, readRequests)); diff --git a/tree/ntuple/src/RPageStorageFile.cxx b/tree/ntuple/src/RPageStorageFile.cxx index c70cb7a4b9b7d..545c4b9972a61 100644 --- a/tree/ntuple/src/RPageStorageFile.cxx +++ b/tree/ntuple/src/RPageStorageFile.cxx @@ -42,15 +42,15 @@ #include using ROOT::Experimental::Detail::RNTupleAtomicTimer; -using ROOT::Experimental::Internal::RCluster; -using ROOT::Experimental::Internal::RClusterPool; -using ROOT::Experimental::Internal::ROnDiskPage; -using ROOT::Experimental::Internal::ROnDiskPageMap; using ROOT::Internal::MakeUninitArray; +using ROOT::Internal::RCluster; +using ROOT::Internal::RClusterPool; using ROOT::Internal::RNTupleCompressor; using ROOT::Internal::RNTupleDecompressor; using ROOT::Internal::RNTupleFileWriter; using ROOT::Internal::RNTupleSerializer; +using ROOT::Internal::ROnDiskPage; +using ROOT::Internal::ROnDiskPageMap; using ROOT::Internal::RPagePool; ROOT::Internal::RPageSinkFile::RPageSinkFile(std::string_view ntupleName, const ROOT::RNTupleWriteOptions &options) @@ -491,7 +491,7 @@ std::unique_ptr ROOT::Internal::RPageSourceFile::Cl return std::unique_ptr(clone); } -std::unique_ptr +std::unique_ptr ROOT::Internal::RPageSourceFile::PrepareSingleCluster(const RCluster::RKey &clusterKey, std::vector &readRequests) { @@ -599,8 +599,7 @@ ROOT::Internal::RPageSourceFile::PrepareSingleCluster(const RCluster::RKey &clus // Register the on disk pages in a page map auto buffer = new unsigned char[reinterpret_cast(req.fBuffer) + req.fSize]; - auto pageMap = - std::make_unique(std::unique_ptr(buffer)); + auto pageMap = std::make_unique(std::unique_ptr(buffer)); for (const auto &s : onDiskPages) { ROnDiskPage::Key key(s.fColumnId, s.fPageNo); pageMap->Register(key, ROnDiskPage(buffer + s.fBufPos, s.fSize)); @@ -618,12 +617,12 @@ ROOT::Internal::RPageSourceFile::PrepareSingleCluster(const RCluster::RKey &clus return cluster; } -std::vector> +std::vector> ROOT::Internal::RPageSourceFile::LoadClusters(std::span clusterKeys) { fCounters->fNClusterLoaded.Add(clusterKeys.size()); - std::vector> clusters; + std::vector> clusters; std::vector readRequests; clusters.reserve(clusterKeys.size()); diff --git a/tree/ntuple/test/ntuple_cluster.cxx b/tree/ntuple/test/ntuple_cluster.cxx index e807052324901..896d9f27c4c89 100644 --- a/tree/ntuple/test/ntuple_cluster.cxx +++ b/tree/ntuple/test/ntuple_cluster.cxx @@ -24,9 +24,10 @@ #include #include -using ROOT::Experimental::Internal::RCluster; -using ROOT::Experimental::Internal::RClusterPool; -using ROOT::Experimental::Internal::ROnDiskPage; +using ROOT::Internal::RCluster; +using ROOT::Internal::RClusterPool; +using ROOT::Internal::ROnDiskPage; +using ROOT::Internal::ROnDiskPageMapHeap; using ROOT::Internal::RPageRef; using ROOT::Internal::RPageSource; @@ -45,7 +46,7 @@ class RPageSourceMock : public RPageSource { public: /// Records the cluster IDs requests by LoadClusters() calls std::vector fReqsClusterIds; - std::vector fReqsColumns; + std::vector fReqsColumns; RPageSourceMock() : RPageSource("test", RNTupleReadOptions()) { @@ -74,7 +75,7 @@ class RPageSourceMock : public RPageSource { fReqsClusterIds.emplace_back(key.fClusterId); fReqsColumns.emplace_back(key.fPhysicalColumnSet); auto cluster = std::make_unique(key.fClusterId); - auto pageMap = std::make_unique(); + auto pageMap = std::make_unique(); for (auto colId : key.fPhysicalColumnSet) { pageMap->Register(ROnDiskPage::Key(colId, 0), ROnDiskPage(nullptr, 0)); cluster->SetColumnAvailable(colId); @@ -90,18 +91,17 @@ class RPageSourceMock : public RPageSource { TEST(Cluster, Allocate) { - auto cluster = new ROOT::Experimental::Internal::ROnDiskPageMapHeap(nullptr); + auto cluster = new ROnDiskPageMapHeap(nullptr); delete cluster; - cluster = new ROOT::Experimental::Internal::ROnDiskPageMapHeap(std::make_unique(1)); + cluster = new ROnDiskPageMapHeap(std::make_unique(1)); delete cluster; } TEST(Cluster, Basics) { auto memory = new unsigned char[3]; - auto pageMap = - std::make_unique(std::unique_ptr(memory)); + auto pageMap = std::make_unique(std::unique_ptr(memory)); pageMap->Register(ROnDiskPage::Key(5, 0), ROnDiskPage(&memory[0], 1)); pageMap->Register(ROnDiskPage::Key(5, 1), ROnDiskPage(&memory[1], 2)); auto cluster = std::make_unique(0); @@ -121,14 +121,12 @@ TEST(Cluster, Basics) TEST(Cluster, AdoptPageMaps) { auto mem1 = new unsigned char[3]; - auto pageMap1 = - std::make_unique(std::unique_ptr(mem1)); + auto pageMap1 = std::make_unique(std::unique_ptr(mem1)); pageMap1->Register(ROnDiskPage::Key(5, 0), ROnDiskPage(&mem1[0], 1)); pageMap1->Register(ROnDiskPage::Key(5, 1), ROnDiskPage(&mem1[1], 2)); // Column 5 is in both mem1 and mem2 but that should not hurt auto mem2 = new unsigned char[4]; - auto pageMap2 = - std::make_unique(std::unique_ptr(mem2)); + auto pageMap2 = std::make_unique(std::unique_ptr(mem2)); pageMap2->Register(ROnDiskPage::Key(5, 0), ROnDiskPage(&mem2[0], 1)); pageMap2->Register(ROnDiskPage::Key(5, 1), ROnDiskPage(&mem2[1], 2)); pageMap2->Register(ROnDiskPage::Key(6, 0), ROnDiskPage(&mem2[3], 1)); @@ -158,8 +156,7 @@ TEST(Cluster, AdoptPageMaps) TEST(Cluster, AdoptClusters) { auto mem1 = new unsigned char[3]; - auto pageMap1 = - std::make_unique(std::unique_ptr(mem1)); + auto pageMap1 = std::make_unique(std::unique_ptr(mem1)); pageMap1->Register(ROnDiskPage::Key(5, 0), ROnDiskPage(&mem1[0], 1)); pageMap1->Register(ROnDiskPage::Key(5, 1), ROnDiskPage(&mem1[1], 2)); auto cluster1 = std::make_unique(0); @@ -168,8 +165,7 @@ TEST(Cluster, AdoptClusters) // Column 5 is in both clusters but that should not hurt auto mem2 = new unsigned char[4]; - auto pageMap2 = - std::make_unique(std::unique_ptr(mem2)); + auto pageMap2 = std::make_unique(std::unique_ptr(mem2)); pageMap2->Register(ROnDiskPage::Key(5, 0), ROnDiskPage(&mem2[0], 1)); pageMap2->Register(ROnDiskPage::Key(5, 1), ROnDiskPage(&mem2[1], 2)); pageMap2->Register(ROnDiskPage::Key(6, 0), ROnDiskPage(&mem2[3], 1)); @@ -336,7 +332,7 @@ TEST(PageStorageFile, LoadClusters) EXPECT_NE(ROOT::kInvalidDescriptorId, colId); } - std::vector clusterKeys; + std::vector clusterKeys; clusterKeys.push_back({0, {}}); auto cluster = std::move(source.LoadClusters(clusterKeys)[0]); EXPECT_EQ(0U, cluster->GetId()); diff --git a/tree/ntuple/test/ntuple_endian.cxx b/tree/ntuple/test/ntuple_endian.cxx index 7610d63875b42..2443d6c22904e 100644 --- a/tree/ntuple/test/ntuple_endian.cxx +++ b/tree/ntuple/test/ntuple_endian.cxx @@ -24,7 +24,7 @@ using ROOT::ENTupleColumnType; using ROOT::NTupleSize_t; using ROOT::RNTupleDescriptor; using ROOT::RNTupleModel; -using ROOT::Experimental::Internal::RCluster; +using ROOT::Internal::RCluster; using ROOT::Internal::RColumn; using ROOT::Internal::RColumnElementBase; using ROOT::Internal::RPage; diff --git a/tree/ntupleutil/v7/src/RNTupleExporter.cxx b/tree/ntupleutil/v7/src/RNTupleExporter.cxx index 434cbe447fc67..c2db3ce071f6c 100644 --- a/tree/ntupleutil/v7/src/RNTupleExporter.cxx +++ b/tree/ntupleutil/v7/src/RNTupleExporter.cxx @@ -117,14 +117,14 @@ RNTupleExporter::ExportPages(ROOT::Internal::RPageSource &source, const RPagesOp source.Attach(); auto desc = source.GetSharedDescriptorGuard(); - RClusterPool clusterPool{source}; + ROOT::Internal::RClusterPool clusterPool{source}; // Collect column info std::vector columnInfos; const RAddColumnsResult addColRes = AddColumnsFromField(columnInfos, desc.GetRef(), desc->GetFieldZero(), options); // Collect ColumnSet for the cluster pool query - RCluster::ColumnSet_t columnSet; + ROOT::Internal::RCluster::ColumnSet_t columnSet; columnSet.reserve(columnInfos.size()); for (const auto &colInfo : columnInfos) { columnSet.emplace(colInfo.fColDesc->GetPhysicalId()); @@ -141,7 +141,7 @@ RNTupleExporter::ExportPages(ROOT::Internal::RPageSource &source, const RPagesOp int prevIntPercent = 0; while (clusterId != ROOT::kInvalidDescriptorId) { const auto &clusterDesc = desc->GetClusterDescriptor(clusterId); - const RCluster *cluster = clusterPool.GetCluster(clusterId, columnSet); + const ROOT::Internal::RCluster *cluster = clusterPool.GetCluster(clusterId, columnSet); for (const auto &colInfo : columnInfos) { auto columnId = colInfo.fColDesc->GetPhysicalId(); const auto &pages = clusterDesc.GetPageRange(columnId); @@ -155,8 +155,8 @@ RNTupleExporter::ExportPages(ROOT::Internal::RPageSource &source, const RPagesOp assert(!colRange.IsSuppressed() || pages.GetPageInfos().empty()); for (const auto &pageInfo : pages.GetPageInfos()) { - ROnDiskPage::Key key{columnId, pageIdx}; - const ROnDiskPage *onDiskPage = cluster->GetOnDiskPage(key); + ROOT::Internal::ROnDiskPage::Key key{columnId, pageIdx}; + const ROOT::Internal::ROnDiskPage *onDiskPage = cluster->GetOnDiskPage(key); // dump the page const void *pageBuf = onDiskPage->GetAddress();