diff --git a/bindings/pyroot/pythonizations/doc/index.md b/bindings/pyroot/pythonizations/doc/index.md index 6cc1e578623e9..57e2b6bf00133 100644 --- a/bindings/pyroot/pythonizations/doc/index.md +++ b/bindings/pyroot/pythonizations/doc/index.md @@ -1,285 +1,119 @@ -\defgroup Pythonizations Python interface -\brief Python-specific functionalities offered by ROOT - -This page lists the so-called "pythonizations", that is those functionalities offered by ROOT for classes and functions which are specific to Python usage of the package and provide a more pythonic experience. - -### Pythonization example - -This example shows how to use the `@pythonization` decorator to add extra -behaviour to C++ user classes that are used from Python via PyROOT. -Let's first define a new C++ class. In this tutorial, we will see how we can -"pythonize" this class, i.e. how we can add some extra behaviour to it to -make it more pythonic or easier to use from Python. -Note: In this example, the class is defined dynamically for demonstration -purposes, but it could also be a C++ class defined in some library or header. -For more information about loading C++ user code to be used from Python with -PyROOT, please see: -https://root.cern.ch/manual/python#loading-user-libraries-and-just-in-time-compilation-jitting - -~~~{.py} -ROOT.gInterpreter.Declare(""" -class MyClass {}; -""") -~~~ - -Next, we define a pythonizor function: the function that will be responsible -for injecting new behaviour in our C++ class `MyClass`. -To convert a given Python function into a pythonizor, we need to decorate it -with the @pythonization decorator. Such decorator allows us to define which -which class we want to pythonize by providing its class name and its -namespace (if the latter is not specified, it defaults to the global -namespace, i.e. '::'). -The decorated function - the pythonizor - must accept either one or two -parameters: -1. The class to be pythonized (proxy object where new behaviour can be -injected) -2. The fully-qualified name of that class (optional). -Let's see all this with a simple example. Suppose I would like to define how -`MyClass` objects are represented as a string in Python (i.e. what would be -shown when I print that object). For that purpose, I can define the following -pythonizor function. There are two important things to be noted here: -- The @pythonization decorator has one argument that specifies our target -class is `MyClass`. -- The pythonizor function `pythonizor_of_myclass` provides and injects a new -implementation for `__str__`, the mechanism that Python provides to define -how to represent objects as strings. This new implementation -always returns the string "This is a MyClass object". - -~~~{.py} -@pythonization('MyClass') -def pythonizor_of_myclass(klass): - klass.__str__ = lambda o : 'This is a MyClass object' -~~~ -Once we have defined our pythonizor function, let's see it in action. -We will now use the `MyClass` class for the first time from Python: we will -create a new instance of that class. At this moment, the pythonizor will -execute and modify the class - pythonizors are always lazily run when a given -class is used for the first time from a Python script. - -~~~{.py} -my_object = ROOT.MyClass() -~~~ - -Since the pythonizor already executed, we should now see the new behaviour. -For that purpose, let's print `my_object` (should show "This is a MyClass -object"). - -~~~{.py} -print(my_object) -~~~ - -The previous example is just a simple one, but there are many ways in which a -class can be pythonized. Typical examples are the redefinition of dunder -methods (e.g. `__iter__` and `__next__` to make your objects iterable from -Python). If you need some inspiration, many ROOT classes are pythonized in -the way we just saw; their pythonizations can be seen at: - -The @pythonization decorator offers a few more options when it comes to -matching classes that you want to pythonize. We saw that we can match a -single class, but we can also specify a list of classes to pythonize. -The following code defines a couple of new classes: - -~~~{.py} -ROOT.gInterpreter.Declare(""" -namespace NS { - class Class1 {}; - class Class2 {}; +\defgroup Python Python Interface +\ingroup Python +\brief Python bindings and utilities for ROOT. + + +ROOT is a C++ framework used across HEP for data storage, analysis and visualisation. Its full API is available directly in Python through dynamic bindings powered by [cppyy](https://cppyy.readthedocs.io/). Every ROOT class you see in the +C++ documentation is accessible from Python under the `ROOT` module. + +On top of that, a set of [pythonizations](@ref Pythonizations) adapt selected classes to feel more natively Pythonic: operator overloading, iterators, NumPy interoperability, and more. + + +# Installation + +\htmlonly +
+
+ + +
+
+
conda install -c conda-forge root
+
+ +
+ + + + +\endhtmlonly -So far we have seen how pythonizations can be registered for classes that -have not been used yet. We have discussed how, in that case, the pythonizor -functions are executed lazily when their target class/es are used for the -first time in the application. -However, it can also happen that our target class/es have already been -accessed by the time we register a pythonization. In such a scenario, the -pythonizor is applied immediately (at registration time) to the target -class/es -Let's see an example of what was just explained. We will define a new class -and immediately create an object of that class. We can check how the object -still does not have a new attribute `pythonized` that we are going to inject -in the next step. +See root.cern/install for all installation options. -~~~{.py} -ROOT.gInterpreter.Declare(""" -class MyClass2 {}; -""") -o = ROOT.MyClass2() -try: - print(o.pythonized) -except AttributeError: - print("Object has not been pythonized yet!") -~~~ +# Quickstart -After that, we will register a pythonization for `MyClass2`. Since the class -has already been used, the pythonization will happen right away. +The entry point to ROOT in Python is one import: ~~~{.py} -@pythonization('MyClass2') -def pythonizor_for_myclass2(klass): - klass.pythonized = True +import ROOT ~~~ -Now our object does have the `pythonized` attribute: +Every ROOT class and function is available under the `ROOT` module. -~~~{.py} -print(o.pythonized) # prints True -~~~ - -### Pythonization printing example -This example illustrates the pretty printing feature of PyROOT, which reveals -the content of the object if a string representation is requested, e.g., by -Python's print statement. The printing behaves similar to the ROOT prompt -powered by the C++ interpreter cling. -Create an object with PyROOT +Now let's create a histogram, fill it from a [NumPy array](https://numpy.org/devdocs/reference/generated/numpy.ndarray.html) and write it to a file: ~~~{.py} -obj = ROOT.std.vector("int")(3) -for i in range(obj.size()): - obj[i] = i -~~~ +import numpy as np -Print the object, which reveals the content. Note that `print` calls the special -method `__str__` of the object internally. +# Create a 1D histogram +h = ROOT.TH1D("h", "Gaussian distribution;x;counts", 100, -5, 5) -~~~{.py} -print(obj) -~~~ - -The output can be retrieved as string by any function that triggers the `__str__` -special method of the object, e.g., `str` or `format`. +# Fill it from a NumPy array +data = np.random.normal(0, 1, 10000) +h.Fill(data) -~~~{.py} -print(str(obj)) -print("{}".format(obj)) +# Write it to a ROOT file +with ROOT.TFile.Open("output.root", "RECREATE") as f: + h.Write() ~~~ -Note that the interactive Python prompt does not call `__str__`, it calls -`__repr__`, which implements a formal and unique string representation of -the object. +Now we create an RDataFrame from scratch, define a new column with a Python lambda and draw a histogram: ~~~{.py} -print(repr(obj)) -obj -~~~ +import numpy as np -The print output behaves similar to the ROOT prompt, e.g., here for a ROOT histogram. +# Create an RDataFrame with 10000 rows +rdf = ROOT.RDataFrame(10000) -~~~{.py} -hist = ROOT.TH1F("name", "title", 10, 0, 1) -print(hist) -~~~ +# Define a column x +rdf = rdf.Define("x", lambda : np.random.normal(0, 1)) -If cling cannot produce any nice representation for the class, we fall back to a -"" format, which is what `__repr__` returns - -~~~{.py} -ROOT.gInterpreter.Declare('class MyClass {};') -m = ROOT.MyClass() -print(m) -print(str(m) == repr(m)) +# Draw a histogram of x +rdf.Histo1D("x").Draw() ~~~ diff --git a/bindings/pyroot/pythonizations/doc/interop.md b/bindings/pyroot/pythonizations/doc/interop.md new file mode 100644 index 0000000000000..2c84aee9e9373 --- /dev/null +++ b/bindings/pyroot/pythonizations/doc/interop.md @@ -0,0 +1,3 @@ +\defgroup Py_Interop Interoperability +\ingroup Python +\brief Using ROOT alongside other Python packages diff --git a/bindings/pyroot/pythonizations/doc/pythonizations.md b/bindings/pyroot/pythonizations/doc/pythonizations.md new file mode 100644 index 0000000000000..88e03eecf596d --- /dev/null +++ b/bindings/pyroot/pythonizations/doc/pythonizations.md @@ -0,0 +1,286 @@ +\defgroup Pythonizations Pythonizations +\ingroup Python +\brief Python-specific functionalities offered by ROOT + +This page lists the so-called "pythonizations", that is those functionalities offered by ROOT for classes and functions which are specific to Python usage of the package and provide a more pythonic experience. + +### Pythonization example + +This example shows how to use the `@pythonization` decorator to add extra +behaviour to C++ user classes that are used from Python via PyROOT. +Let's first define a new C++ class. In this tutorial, we will see how we can +"pythonize" this class, i.e. how we can add some extra behaviour to it to +make it more pythonic or easier to use from Python. +Note: In this example, the class is defined dynamically for demonstration +purposes, but it could also be a C++ class defined in some library or header. +For more information about loading C++ user code to be used from Python with +PyROOT, please see: +https://root.cern.ch/manual/python#loading-user-libraries-and-just-in-time-compilation-jitting + +~~~{.py} +ROOT.gInterpreter.Declare(""" +class MyClass {}; +""") +~~~ + +Next, we define a pythonizor function: the function that will be responsible +for injecting new behaviour in our C++ class `MyClass`. +To convert a given Python function into a pythonizor, we need to decorate it +with the @pythonization decorator. Such decorator allows us to define which +which class we want to pythonize by providing its class name and its +namespace (if the latter is not specified, it defaults to the global +namespace, i.e. '::'). +The decorated function - the pythonizor - must accept either one or two +parameters: +1. The class to be pythonized (proxy object where new behaviour can be +injected) +2. The fully-qualified name of that class (optional). +Let's see all this with a simple example. Suppose I would like to define how +`MyClass` objects are represented as a string in Python (i.e. what would be +shown when I print that object). For that purpose, I can define the following +pythonizor function. There are two important things to be noted here: +- The @pythonization decorator has one argument that specifies our target +class is `MyClass`. +- The pythonizor function `pythonizor_of_myclass` provides and injects a new +implementation for `__str__`, the mechanism that Python provides to define +how to represent objects as strings. This new implementation +always returns the string "This is a MyClass object". + +~~~{.py} +@pythonization('MyClass') +def pythonizor_of_myclass(klass): + klass.__str__ = lambda o : 'This is a MyClass object' +~~~ +Once we have defined our pythonizor function, let's see it in action. +We will now use the `MyClass` class for the first time from Python: we will +create a new instance of that class. At this moment, the pythonizor will +execute and modify the class - pythonizors are always lazily run when a given +class is used for the first time from a Python script. + +~~~{.py} +my_object = ROOT.MyClass() +~~~ + +Since the pythonizor already executed, we should now see the new behaviour. +For that purpose, let's print `my_object` (should show "This is a MyClass +object"). + +~~~{.py} +print(my_object) +~~~ + +The previous example is just a simple one, but there are many ways in which a +class can be pythonized. Typical examples are the redefinition of dunder +methods (e.g. `__iter__` and `__next__` to make your objects iterable from +Python). If you need some inspiration, many ROOT classes are pythonized in +the way we just saw; their pythonizations can be seen at: + +The @pythonization decorator offers a few more options when it comes to +matching classes that you want to pythonize. We saw that we can match a +single class, but we can also specify a list of classes to pythonize. +The following code defines a couple of new classes: + +~~~{.py} +ROOT.gInterpreter.Declare(""" +namespace NS { + class Class1 {}; + class Class2 {}; +} +""") +~~~ + +Note that these classes belong to the `NS` namespace. As mentioned above, the +@pythonization decorator accepts a parameter with the namespace of the class +or classes to be pythonized. Therefore, a pythonizor that matches both classes +would look like this: + +~~~{.py} +@pythonization(['Class1', 'Class2'], ns='NS') +def pythonize_two_classes(klass): + klass.new_attribute = 1 +~~~ + +Both classes will have the new attribute: + +~~~{.py} +o1 = ROOT.NS.Class1() +o2 = ROOT.NS.Class2() +print("Printing new attribute") +for o in o1, o2: + print(o.new_attribute) +~~~ + +In addition, @pythonization also accepts prefixes of classes in a certain +namespace in order to match multiple classes in that namespace. To signal that +what we provide to @pythonization is a prefix, we need to set the `is_prefix` +argument to `True` (default is `False`). +A common case where matching prefixes is useful is when we have a templated +class and we want to pythonize all possible instantiations of that template. +For example, we can pythonize the `std::vector` (templated) class like so: + +~~~{.py} +@pythonization('vector<', ns='std', is_prefix=True) +def vector_pythonizor(klass): + # first_elem returns the first element of the vector if it exists + klass.first_elem = lambda v : v[0] if v else None +~~~ + +Since we defined a prefix to do the match, the pythonization will be applied +both if we instantiate e.g. a vector of integers and a vector of doubles. + +~~~{.py} +v_int = ROOT.std.vector['int']([1,2,3]) +v_double = ROOT.std.vector['double']([4.,5.,6.]) +print("First element of integer vector: {}".format(v_int.first_elem())) +print("First element of double vector: {}".format(v_double.first_elem())) +~~~ + +These are some examples of combinations of prefixes and namespaces and the +corresponding classes that they match: +- '' : all classes in the global namespace. +- '', ns='NS1::NS2' : all classes in the `NS1::NS2` namespace. +- 'Prefix' : classes whose name starts with `Prefix` in the global namespace. +- 'Prefix', ns='NS' : classes whose name starts with `Prefix` in the `NS` +namespace +Moreover, a pythonizor function can have a second optional parameter that +contains the fully-qualified name of the class being pythonized. This can be +useful e.g. if we would like to do some more complex filtering of classes in +our pythonizor, for instance using regular expressions. + +~~~{.py} +@pythonization('pair<', ns='std', is_prefix=True) +def pair_pythonizor(klass, name): + print('Pythonizing class ' + name) +~~~ + +The pythonizor above will be applied to any instantiation of `std::pair` - we +can see this with the print we did inside the pythonizor. +Note that we could use the `name` parameter to e.g. further filter which +particular instantiations we would like to pythonize. + +~~~{.py} +p1 = ROOT.std.pair['int','int'](1,2) # prints 'Pythonizing class std::pair' +p2 = ROOT.std.pair['int','double'](1,2.) # prints 'Pythonizing class std::pair' +~~~ + +Note that, to pythonize multiple classes in different namespaces, we can +stack multiple @pythonization decorators. For example, if we define these +classes: + +~~~{.py} +ROOT.gInterpreter.Declare(""" +class FirstClass {}; +namespace NS { + class SecondClass {}; +} +""") +~~~ + +We can pythonize both of them with a single pythonizor function like so: + +~~~{.py} +@pythonization('FirstClass') +@pythonization('SecondClass', ns='NS') +def pythonizor_for_first_and_second(klass, name): + print('Executed for class ' + name) +~~~ + +If we now access both classes, we should see that the pythonizor runs twice. + +~~~{.py} +f = ROOT.FirstClass() +s = ROOT.NS.SecondClass() +~~~ + +So far we have seen how pythonizations can be registered for classes that +have not been used yet. We have discussed how, in that case, the pythonizor +functions are executed lazily when their target class/es are used for the +first time in the application. +However, it can also happen that our target class/es have already been +accessed by the time we register a pythonization. In such a scenario, the +pythonizor is applied immediately (at registration time) to the target +class/es +Let's see an example of what was just explained. We will define a new class +and immediately create an object of that class. We can check how the object +still does not have a new attribute `pythonized` that we are going to inject +in the next step. + +~~~{.py} +ROOT.gInterpreter.Declare(""" +class MyClass2 {}; +""") +o = ROOT.MyClass2() +try: + print(o.pythonized) +except AttributeError: + print("Object has not been pythonized yet!") +~~~ + +After that, we will register a pythonization for `MyClass2`. Since the class +has already been used, the pythonization will happen right away. + +~~~{.py} +@pythonization('MyClass2') +def pythonizor_for_myclass2(klass): + klass.pythonized = True +~~~ + +Now our object does have the `pythonized` attribute: + +~~~{.py} +print(o.pythonized) # prints True +~~~ + +### Pythonization printing example +This example illustrates the pretty printing feature of PyROOT, which reveals +the content of the object if a string representation is requested, e.g., by +Python's print statement. The printing behaves similar to the ROOT prompt +powered by the C++ interpreter cling. +Create an object with PyROOT + +~~~{.py} +obj = ROOT.std.vector("int")(3) +for i in range(obj.size()): + obj[i] = i +~~~ + +Print the object, which reveals the content. Note that `print` calls the special +method `__str__` of the object internally. + +~~~{.py} +print(obj) +~~~ + +The output can be retrieved as string by any function that triggers the `__str__` +special method of the object, e.g., `str` or `format`. + +~~~{.py} +print(str(obj)) +print("{}".format(obj)) +~~~ + +Note that the interactive Python prompt does not call `__str__`, it calls +`__repr__`, which implements a formal and unique string representation of +the object. + +~~~{.py} +print(repr(obj)) +obj +~~~ + +The print output behaves similar to the ROOT prompt, e.g., here for a ROOT histogram. + +~~~{.py} +hist = ROOT.TH1F("name", "title", 10, 0, 1) +print(hist) +~~~ + +If cling cannot produce any nice representation for the class, we fall back to a +"" format, which is what `__repr__` returns + +~~~{.py} +ROOT.gInterpreter.Declare('class MyClass {};') +m = ROOT.MyClass() +print(m) +print(str(m) == repr(m)) +~~~ diff --git a/bindings/pyroot/pythonizations/python/ROOT/_pythonization/index.md b/bindings/pyroot/pythonizations/python/ROOT/_pythonization/_uhi/index.md similarity index 67% rename from bindings/pyroot/pythonizations/python/ROOT/_pythonization/index.md rename to bindings/pyroot/pythonizations/python/ROOT/_pythonization/_uhi/index.md index 4554b97fed568..65f1b262680db 100644 --- a/bindings/pyroot/pythonizations/python/ROOT/_pythonization/index.md +++ b/bindings/pyroot/pythonizations/python/ROOT/_pythonization/_uhi/index.md @@ -1,18 +1,34 @@ -\defgroup uhi_docs Unified Histogram Interface (UHI) -\ingroup Pythonizations +\defgroup Py_UHI Unified Histogram Interface (UHI) +\ingroup Python +\brief Using ROOT histograms in Python -ROOT histograms implement the [Unified Histogram Interface (UHI)](https://uhi.readthedocs.io/en/latest/index.html), enhancing interoperability with other UHI-compatible libraries. This compliance standardizes histogram operations, making tasks like plotting, indexing, and slicing more intuitive and consistent. +# ROOT Histograms & UHI -# Table of contents -- [Plotting](\ref plotting) - - [Plotting with mplhep](\ref plotting-with-mplhep) - - [Additional Notes](\ref additional-notes-1) -- [Indexing](\ref indexing) - - [Setup](\ref setup) - - [Slicing](\ref slicing) - - [Setting](\ref setting) - - [Access](\ref access) - - [Additional Notes](\ref additional-notes-2) +ROOT histograms implement the [Unified Histogram Interface (UHI)](https://uhi.readthedocs.io/en/latest/index.html), a standard protocol that makes ROOT histograms interoperable with the broader Python +scientific ecosystem. This compliance standardizes histogram operations, making tasks like plotting, indexing, and slicing more intuitive and consistent. + +\note UHI support is available for all [`TH1`](https://root.cern.ch/doc/master/classTH1.html)-derived +classes, including [`TH2`](https://root.cern.ch/doc/master/classTH2.html) and +[`TH3`](https://root.cern.ch/doc/master/classTH3.html). + +## Cheat Sheet + +A one-page quick reference covering the API. + +\htmlonly + +

PDF preview not available in your browser.

+
+ + ⬇ Download cheat sheet (PDF) + +\endhtmlonly \anchor plotting @@ -28,10 +44,12 @@ You can read more about the protocol on the [UHI plotting](https://uhi.readthedo import ROOT import matplotlib.pyplot as plt import mplhep as hep +import numpy as np # Create and fill a 1D histogram h1 = ROOT.TH1D("h1", "MyHist", 10, -1, 1) -h1.FillRandom("gaus", 1000) +arr = np.random.normal(0, 1, 1000) +h1.Fill(arr) # Load a style sheet and plot the histogram hep.style.use("LHCb2") @@ -40,39 +58,16 @@ plt.title("MyHist") plt.show() ``` -\image html uhi_th1_plot.png width=600px - -\anchor additional-notes-1 -## Additional Notes +For 2D histograms, use `hep.hist2dplot`: -- UHI plotting related pythonizations are added to all [`TH1`](https://root.cern.ch/doc/master/classTH1.html)-derived classes (that includes [`TH2`](https://root.cern.ch/doc/master/classTH2.html) and [`TH3`](https://root.cern.ch/doc/master/classTH3.html)). -- While some libraries such as [mplhep](https://github.com/scikit-hep/mplhep) may not yet support multidimensional `PlottableHistogram` objects, you can call `.values()` on your histogram to retrieve a [`numpy.ndarray`](https://numpy.org/doc/2.2/reference/generated/numpy.ndarray.html) and pass it to appropriate plotting functions. - - Example plotting a 2D ROOT histogram with [`matplotlib.pyplot.imshow`](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html#matplotlib-pyplot-imshow) and [`seaborn.heatmap`](https://seaborn.pydata.org/generated/seaborn.heatmap.html#seaborn-heatmap): ```python -import ROOT -import matplotlib.pyplot as plt -import seaborn as sns -import numpy as np - h2 = ROOT.TH2D("h2", "h2", 10, -1, 1, 10, -1, 1) -h2[...] = np.random.rand(10, 10) - -fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6)) +h2.FillRandom("gaus", 10000) -# First subplot with imshow -ax1.imshow(h2.values(), cmap='hot', interpolation='nearest') -ax1.set_title("imshow") - -# Second subplot with seaborn heatmap -sns.heatmap(h2.values(), linewidth=0.5, ax=ax2) -ax2.set_title("heatmap") - -plt.tight_layout() +hep.hist2dplot(h2) plt.show() ``` -\image html uhi_th2_plot.png width=800px - \anchor indexing # Indexing @@ -132,7 +127,7 @@ h[...] = 5 ``` \anchor access -## Access +### Access ```python # Accessing the bin contents using the bin number v = h[1, 2] @@ -164,4 +159,21 @@ v = h[underflow, underflow] - ex. `h_projected = h[:, ::sum, ::sum]` --> `h_projected` is a 1D histogram representing the y and z projections along the x axis. - **Setting operations** - Setting with a scalar does not set the flow bins. - - Setting with an array checks whether the array matches the shape of the histogram with flow bins or the size without flow bins. \ No newline at end of file + - Setting with an array checks whether the array matches the shape of the histogram with flow bins or the size without flow bins. + + +# Serialization + +ROOT histograms can be serialized to a [shared UHI format](https://uhi.readthedocs.io/en/latest/serialization.html) +and deserialized into any UHI-compatible library, enabling histogram exchange between ROOT, boost-histogram, hist and others without manual conversion. + +```python +import json, uhi.io.json, hist + +# ROOT histogram → JSON +ob = json.dumps(h_root, default=uhi.io.json.default) + +# JSON → any UHI-compatible library +ir = json.loads(ob, object_hook=uhi.io.json.object_hook) +h_hist = hist.Hist(ir) +``` diff --git a/bindings/pyroot/pythonizations/python/ROOT/_pythonization/dataloader.md b/bindings/pyroot/pythonizations/python/ROOT/_pythonization/dataloader.md new file mode 100644 index 0000000000000..06f8871e02049 --- /dev/null +++ b/bindings/pyroot/pythonizations/python/ROOT/_pythonization/dataloader.md @@ -0,0 +1,276 @@ +\defgroup Py_ML RDataLoader +\ingroup Python +\brief Feed ROOT data directly into models for machine learning training. + + +`RDataLoader` streams ROOT data into machine learning frameworks as batches ready for training. It takes any [RDataFrame](@ref Py_RDataFrame) as input, giving you access to the full ROOT ecosystem for filtering, defining new variables and applying selections; it delivers batches of your dataset for [NumPy](https://numpy.org/devdocs/reference/generated/numpy.ndarray.html), [TensorFlow](https://www.tensorflow.org/api_docs/python/tf/data/Dataset) and [PyTorch](https://docs.pytorch.org/docs/main/tensors.html) through a simple iteration interface. + +\note `RDataLoader` is part of `ROOT.Experimental.ML` and is currently experimental. The API may change between ROOT releases. + +## Cheat Sheet + +A one-page quick reference covering the API. + +\htmlonly + +

PDF preview not available in your browser.

+
+ + ⬇ Download cheat sheet (PDF) + +\endhtmlonly + +## Getting your data ready + +`RDataLoader` takes an `RDataFrame` as input. This means your data preparation (selecting events, computing +new variables, applying cuts, etc.) all happens before the loader is created, using the full power of `RDataFrame`: + +~~~{.py} +import math +import ROOT + +# Open a ROOT file and create an RDataFrame +rdf = ROOT.RDataFrame("events", "file.root") + +# Define a Python callback to compute a new variable +def invariant_mass(E: float, p: float) -> float: + return math.sqrt(E**2 - p**2) + +# Apply selections and compute derived features +rdf = rdf.Filter("nMuons >= 2") \ + .Define("inv_mass", invariant_mass, ["E", "p"]) +~~~ + +Then pass your `RDataFrame` to `RDataLoader`: + +~~~{.py} +from ROOT.Experimental.ML import RDataLoader + +dl = RDataLoader(rdf, + columns=["inv_mass", "label"], + batch_size=64, + batches_in_memory=1000, + target="label") + +# Iterate your batches as PyTorch tensors: X contains inv_mass, y contains label +for X, y in dl.as_torch(): + ... +~~~ + +The sections below explain how to configure the loader and get the most out of it. + +## Configuring the RDataLoader + +### Selecting columns and target + +`columns` selects which branches to load. `target` names the label column, it is returned separately as `y` when you iterate, so you don't need to split it manually: + +~~~{.py} +dl = RDataLoader( + rdf, + columns=["inv_mass", "pt", "eta", "label"], + target="label", + batch_size=256, + batches_in_memory=1000 +) +~~~ + +You can also pass multiple targets: + +~~~{.py} +dl = RDataLoader(rdf, + columns=["x1", "x2", "x3", "y1", "y2"], + target=["y1", "y2"]) + +for X, y in dl.as_torch(): + # X.shape: (256, 3) + # y.shape: (256, 2) + ... +~~~ + +\warning `target` must appear in the `columns` list. + +### Batch size and memory + +`batch_size` controls how many events are in each batch. `batches_in_memory` +controls how many batches are held in the shuffle buffer at any time: + +~~~{.py} +dl = RDataLoader(rdf, + batch_size=256, + batches_in_memory=20) # default: 10 +~~~ + +- **`batches_in_memory` ↑** - larger shuffle buffer, better randomisation, higher memory use +- **`batches_in_memory` ↓** - lower memory use, limited shuffle + + +### Shuffling and reproducibility + +Shuffling is enabled by default. To make runs reproducible, fix the seed: + +~~~{.py} +dl = RDataLoader(rdf, batch_size=256, + shuffle=True, + set_seed=42) # same order every run +~~~ + + +### RVec / variable-length branches + +ROOT branches that store variable-length arrays must be declared with a maximum size. Shorter entries are zero-padded and the branch is expanded into numbered columns: + +~~~{.py} +dl = RDataLoader( + rdf, + columns=["jets_pt", "jets_eta", "label"], + max_vec_sizes={"jets_pt": 10, "jets_eta": 10}, + vec_padding=0.0, + target="label", +) +# jets_pt expands to jets_pt_0, jets_pt_1, … jets_pt_9 +# events with fewer than 10 jets are zero-padded +~~~ + +\warning Every RVec column in `columns` must appear in `max_vec_sizes`. + +## Iterating Batches + +### as_torch() + +Yields `torch.Tensor` batches: + +~~~{.py} +loss_fn = torch.nn.CrossEntropyLoss() +optimizer = torch.optim.Adam(model.parameters()) + +for epoch in range(num_epochs): + for X, y in dl.as_torch(): + optimizer.zero_grad() + loss = loss_fn(model(X), y) + loss.backward() + optimizer.step() +~~~ + +Move tensors to GPU by passing a device: + +~~~{.py} +for X, y in dl.as_torch(device="cuda"): + ... +~~~ + +### as_tensorflow() + +Returns a `tf.data.Dataset` of `tf.Tensor` batches: + +~~~{.py} +model.fit(dl.as_tensorflow(), epochs=10) +~~~ + +### as_numpy() + +Yields `np.ndarray` batches: + +~~~{.py} +from sklearn.linear_model import SGDClassifier + +clf = SGDClassifier() +for X, y in dl.as_numpy(): + clf.partial_fit(X, y, classes=[0, 1]) +~~~ + +## Train / Validation Split + +Pass `test_size` to split the dataset into two loaders each representing a fraction of the original dataset (no data is duplicated): + +~~~{.py} +train, val = dl.train_test_split(test_size=0.2) + +for epoch in range(num_epochs): + model.train() + for X, y in train.as_torch(device): + ... + + model.eval() + for X, y in val.as_torch(device): + ... +~~~ + +\note Need a three-way train / val / test split? Call `train_test_split` twice: + +~~~{.py} +train_val, test = dl.train_test_split(test_size=0.15) +train, val = train_val.train_test_split(test_size=0.176) +# 0.176 × 0.85 ≈ 15% of the total +~~~ + +## Advanced Features + +### Resampling + +Correct class imbalance by oversampling the minority or undersampling the majority. You can do this by passing two RDataFrames: + +~~~{.py} +dl = RDataLoader( + [rdf_signal, rdf_background], + columns=["inv_mass", "label"], + target="label", + batch_size=256, + batches_in_memory=1000, + load_eager=True, + sampling_type="oversampling", # or "undersampling" + sampling_ratio=1.0, +) +~~~ + +\warning This feature is only available in eager loading mode (`load_eager=True`). + +### Event weights + +If your dataset has a weight column, pass its name to `weights`. It is returned as a third value `w` alongside `X` and `y`: + +~~~{.py} +dl = RDataLoader(rdf, + columns=["inv_mass", "label", "weight"], + target="label", + weights="weight") + +for X, y, w in dl.as_torch(): + loss = (loss_fn(model(X), y) * w).mean() +~~~ + +### Eager loading + +By default the loader reads data lazily, one chunk of data at a time. For small datasets that fit in memory and will be iterated many times, eager loading pays a one-time cost at construction and then serves every epoch from memory: + +~~~{.py} +dl = RDataLoader(rdf, batch_size=256, load_eager=True) +~~~ + +## API Reference + +### RDataLoader(rdataframes, ...) + +| Argument | Type | Default | Description | +|---|---|---|---| +| `rdataframes` | `RDF \| list` | - | One or more RDataFrames to load from | +| `batch_size` | `int` | `64` | Number of events per batch | +| `batches_in_memory` | `int` | `10` | Shuffle buffer size in batches | +| `columns` | `list[str]` | `None` | Branches to load - all if not given | +| `max_vec_sizes` | `dict` | `None` | Max size per RVec column | +| `vec_padding` | `float` | `0.0` | Pad value for short RVec entries | +| `target` | `str \| list` | `None` | Label column(s) - returned as `y` | +| `weights` | `str` | `""` | Event weight column - returned as `w` | +| `shuffle` | `bool` | `True` | Randomise event order | +| `drop_remainder` | `bool` | `True` | Drop last incomplete batch | +| `set_seed` | `int` | `0` | RNG seed - 0 means random | +| `load_eager` | `bool` | `False` | Load full dataset into RAM | +| `sampling_type` | `str` | `""` | `"oversampling"` or `"undersampling"` | +| `sampling_ratio` | `float` | `1.0` | Minority/majority ratio after resampling | +| `replacement` | `bool` | `False` | Undersampling with replacement | \ No newline at end of file diff --git a/core/base/doc/index.md b/core/base/doc/index.md index 46d944cfca70c..c7d3f51c7aa02 100644 --- a/core/base/doc/index.md +++ b/core/base/doc/index.md @@ -1,4 +1,4 @@ -\defgroup Core Core ROOT classes +\defgroup Core Core classes \brief The Core classes of ROOT. \defgroup Base Base ROOT classes \ingroup Core diff --git a/core/base/inc/ROOT/RCryptoRandom.hxx b/core/base/inc/ROOT/RCryptoRandom.hxx index a67b485c6d8d0..0adba081812ef 100644 --- a/core/base/inc/ROOT/RCryptoRandom.hxx +++ b/core/base/inc/ROOT/RCryptoRandom.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RCryptoRandom.hxx -/// \ingroup Base /// \date 2026-04-24 /************************************************************************* diff --git a/core/foundation/inc/ROOT/RError.hxx b/core/foundation/inc/ROOT/RError.hxx index 84d45259a5b68..1f9e491a515a6 100644 --- a/core/foundation/inc/ROOT/RError.hxx +++ b/core/foundation/inc/ROOT/RError.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RError.hxx -/// \ingroup Base /// \author Jakob Blomer /// \date 2019-12-11 diff --git a/core/foundation/src/RConversionRuleParser.cxx b/core/foundation/src/RConversionRuleParser.cxx index 568d9e270b52a..ce36d77f5d481 100644 --- a/core/foundation/src/RConversionRuleParser.cxx +++ b/core/foundation/src/RConversionRuleParser.cxx @@ -1,6 +1,5 @@ // @(#)root/core:$Id$ /// \file RConversionRuleParser.cxx -/// \ingroup Base /// \author Victor Perev /// \author Philippe Canal /// \date 04/10/2003 diff --git a/core/foundation/src/TClassEdit.cxx b/core/foundation/src/TClassEdit.cxx index aa092c7b45035..280317fbef5cb 100644 --- a/core/foundation/src/TClassEdit.cxx +++ b/core/foundation/src/TClassEdit.cxx @@ -1,6 +1,5 @@ // @(#)root/metautils:$Id$ /// \file TClassEdit.cxx -/// \ingroup Base /// \author Victor Perev /// \author Philippe Canal /// \date 04/10/2003 diff --git a/core/meta/inc/TVirtualArray.h b/core/meta/inc/TVirtualArray.h index b800f543bfee2..7f5aa5d54b7da 100644 --- a/core/meta/inc/TVirtualArray.h +++ b/core/meta/inc/TVirtualArray.h @@ -16,7 +16,7 @@ /** \class TVirtualArray -\ingroup IO +\ingroup io_other Wrapper around an object and giving indirect access to its content even if the object is not of a class in the Cint/Reflex dictionary. */ diff --git a/core/meta/inc/TVirtualObject.h b/core/meta/inc/TVirtualObject.h index ffae64dd7ab7c..02c1fee2af427 100644 --- a/core/meta/inc/TVirtualObject.h +++ b/core/meta/inc/TVirtualObject.h @@ -14,7 +14,7 @@ /** \class TVirtualObject -\ingroup IO +\ingroup io_other Wrapper around an object and giving indirect access to its content even if the object is not of a class in the Cint/Reflex dictionary. diff --git a/documentation/doxygen/Doxyfile b/documentation/doxygen/Doxyfile index a20c98d7fdb55..ea6c2bcdaf10f 100644 --- a/documentation/doxygen/Doxyfile +++ b/documentation/doxygen/Doxyfile @@ -165,7 +165,7 @@ ALWAYS_DETAILED_SEC = YES # operators of the base classes will not be shown. # The default value is: NO. -INLINE_INHERITED_MEMB = NO +INLINE_INHERITED_MEMB = YES # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the @@ -359,6 +359,20 @@ EXTENSION_MAPPING = h=C++ \ MARKDOWN_SUPPORT = YES +# If the MARKDOWN_STRICT tag is enabled then doxygen treats text in comments as +# Markdown formatted also in cases where doxygen's native markup format +# conflicts with that of Markdown. This is only relevant in cases where +# backticks are used. doxygen's native markup style allows a single quote to end +# a text fragment started with a backtick and then treat it as a piece of quoted +# text, whereas in Markdown such text fragment is treated as verbatim and only +# ends when a second matching backtick is found. Also, doxygen's native markup +# format requires double quotes to be escaped when they appear in a backtick +# section, whereas this is not needed for Markdown. +# The default value is: YES. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_STRICT = YES + # When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up # to that level are automatically included in the table of contents, even if # they do not have an id attribute. @@ -488,7 +502,7 @@ TYPEDEF_HIDES_STRUCT = NO # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. -LOOKUP_CACHE_SIZE = 4 +LOOKUP_CACHE_SIZE = 6 # The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use # during processing. When set to 0 doxygen will based this on the number of @@ -499,9 +513,9 @@ LOOKUP_CACHE_SIZE = 4 # which effectively disables parallel processing. Please report any issues you # encounter. Generating dot graphs in parallel is controlled by the # DOT_NUM_THREADS setting. -# Minimum value: 0, maximum value: 32, default value: 1. +# Minimum value: 0, maximum value: 512, default value: 1. -NUM_PROC_THREADS = 1 +NUM_PROC_THREADS = $(DOXYGEN_NUM_THREADS) # If the TIMESTAMP tag is set different from NO then each generated page will # contain the date or date and time when the page was generated. Setting this to @@ -598,6 +612,14 @@ HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO +# If the HIDE_UNDOC_NAMESPACES tag is set to YES, doxygen will hide all +# undocumented namespaces that are normally visible in the namespace hierarchy. +# If set to NO, these namespaces will be included in the various overviews. This +# option has no effect if EXTRACT_ALL is enabled. +# The default value is: YES. + +HIDE_UNDOC_NAMESPACES = YES + # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the # documentation. @@ -713,7 +735,7 @@ SORT_MEMBERS_CTORS_1ST = YES # appear in their defined order. # The default value is: NO. -SORT_GROUP_NAMES = NO +SORT_GROUP_NAMES = YES # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will @@ -892,6 +914,14 @@ WARN_NO_PARAMDOC = NO WARN_IF_UNDOC_ENUM_VAL = NO +# If WARN_LAYOUT_FILE option is set to YES, doxygen will warn about issues found +# while parsing the user defined layout file, such as missing or wrong elements. +# See also LAYOUT_FILE for details. If set to NO, problems with the layout file +# will be suppressed. +# The default value is: YES. + +WARN_LAYOUT_FILE = YES + # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS # then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but @@ -1044,7 +1074,23 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = +EXCLUDE = ../../interpreter/ \ + ../../roottest/ \ + ../../README/ \ + ../../ui5 \ + ../../cmake \ + ../../etc \ + ../../js \ + ../../core/clib/ \ + ../../core/lzma/ \ + ../../core/newdelete/ \ + ../../core/textinput/ \ + ../../graf2d/mathtext/ \ + ../../graf3d/ftgl/ \ + ../../graf3d/x3d/ \ + ../../net/rootd/ \ + ../../net/rpdutils/ \ + ../../documentation/doxygen/html # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -1141,7 +1187,7 @@ IMAGE_PATH = $(DOXYGEN_OUTPUT_DIRECTORY)/html # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. -INPUT_FILTER = ./filter +INPUT_FILTER = $(DOXYGEN_INPUT_FILTER) # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the @@ -1386,7 +1432,9 @@ HTML_EXTRA_STYLESHEET = ROOT.css # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = ./rootlogo_s.gif \ - ./notebook.gif + ./notebook.gif \ + ./cheatsheets/rdataloader-cheatsheet.pdf \ + ./cheatsheets/uhi-cheatsheet.pdf # The HTML_COLORSTYLE tag can be used to specify if the generated HTML output # should be rendered with a dark or light theme. @@ -1702,13 +1750,22 @@ DISABLE_INDEX = YES GENERATE_TREEVIEW = YES -# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the -# FULL_SIDEBAR option determines if the side bar is limited to only the treeview -# area (value NO) or if it should extend to the full height of the window (value -# YES). Setting this to YES gives a layout similar to -# https://docs.readthedocs.io with more room for contents, but less room for the -# project logo, title, and description. If either GENERATE_TREEVIEW or -# DISABLE_INDEX is set to NO, this option has no effect. +# When GENERATE_TREEVIEW is set to YES, the PAGE_OUTLINE_PANEL option determines +# if an additional navigation panel is shown at the right hand side of the +# screen, displaying an outline of the contents of the main page, similar to +# e.g. https://developer.android.com/reference If GENERATE_TREEVIEW is set to +# NO, this option has no effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +PAGE_OUTLINE_PANEL = YES + +# When GENERATE_TREEVIEW is set to YES, the FULL_SIDEBAR option determines if +# the side bar is limited to only the treeview area (value NO) or if it should +# extend to the full height of the window (value YES). Setting this to YES gives +# a layout similar to e.g. https://docs.readthedocs.io with more room for +# contents, but less room for the project logo, title, and description. If +# GENERATE_TREEVIEW is set to NO, this option has no effect. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1729,7 +1786,7 @@ ENUM_VALUES_PER_LINE = 4 # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. -TREEVIEW_WIDTH = 250 +TREEVIEW_WIDTH = 200 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. @@ -2478,7 +2535,7 @@ HIDE_UNDOC_RELATIONS = NO # set to NO # The default value is: NO. -HAVE_DOT = YES +HAVE_DOT = $(DOXYGEN_HAVE_DOT) # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed # to run in parallel. When set to 0 doxygen will base this on the number of diff --git a/documentation/doxygen/DoxygenLayout.xml b/documentation/doxygen/DoxygenLayout.xml index 51dd23163800b..33663784cde62 100644 --- a/documentation/doxygen/DoxygenLayout.xml +++ b/documentation/doxygen/DoxygenLayout.xml @@ -2,8 +2,9 @@ - + + diff --git a/documentation/doxygen/Makefile b/documentation/doxygen/Makefile index b39c9339cea04..a9be04778a7eb 100644 --- a/documentation/doxygen/Makefile +++ b/documentation/doxygen/Makefile @@ -27,6 +27,8 @@ export DOXYGEN_STRIP_PATH := $(shell cd $(PWD)/../..; pwd) export DOXYGEN_INCLUDE_PATH := $(shell find $(DOXYGEN_STRIP_PATH) -type d -name dictpch -prune -o -type d -name inc) export DOXYGEN_PYZDOC_PATH := $(DOXYGEN_OUTPUT_DIRECTORY)/pyzdoc export DOXYGEN_STRIP_FROM_PATH := $(DOXYGEN_STRIP_PATH) $(DOXYGEN_OUTPUT_DIRECTORY) +export DOXYGEN_NUM_THREADS := 1 +export DOXYGEN_INPUT_FILTER := ./filter PYZ_DIR = $(DOXYGEN_SOURCE_DIRECTORY)/bindings/pyroot/pythonizations/python/ROOT/_pythonization @@ -36,6 +38,15 @@ endef all: filter folders mathjax js images doxygen replaceCollaborationDiagrams notebooks rootWork +preview: export DOXYGEN_OUTPUT_DIRECTORY := /tmp/doxygen_preview +preview: export DOXYGEN_NUM_THREADS := 0 +preview: export DOXYGEN_HAVE_DOT := NO +preview: export DOXYGEN_INPUT_FILTER := +preview: htmlfooter + echo "INPUT = ./mainpage.md ../.." > Doxyfile_INPUT + doxygen Doxyfile + echo "Your preview is in $(DOXYGEN_OUTPUT_DIRECTORY)" + filter: `root-config --cxx` -o filter filter.cxx -std=c++14 -O2 @@ -56,12 +67,14 @@ pyzdoc: $(Python3_EXECUTABLE) extract_docstrings.py $(PYZ_DIR) $(DOXYGEN_PYZDOC_PATH) $(Python3_EXECUTABLE) print_roofit_pyz_doctrings.py > $(DOXYGEN_PYZDOC_PATH)/_roofit.pyzdoc -doxygen: filter pyzdoc +htmlfooter: + ./makehtmlfooter.sh > htmlfooter.html + +doxygen: filter pyzdoc htmlfooter rm -f tutorialWorklist_py tutorialWorklist_root $(call MkDir,$(DOXYGEN_OUTPUT_DIRECTORY)) $(call MkDir,$(DOXYGEN_EXAMPLE_PATH)) $(call MkDir,$(DOXYGEN_NOTEBOOK_PATH)) - ./makehtmlfooter.sh > htmlfooter.html ./makeinput.sh doxygen bash ./CleanNamespaces.sh diff --git a/documentation/doxygen/cheatsheets/rdataloader-cheatsheet.pdf b/documentation/doxygen/cheatsheets/rdataloader-cheatsheet.pdf new file mode 100644 index 0000000000000..a23cc8b2b5dcd Binary files /dev/null and b/documentation/doxygen/cheatsheets/rdataloader-cheatsheet.pdf differ diff --git a/documentation/doxygen/cheatsheets/uhi-cheatsheet.pdf b/documentation/doxygen/cheatsheets/uhi-cheatsheet.pdf new file mode 100644 index 0000000000000..5633b8b1412c2 Binary files /dev/null and b/documentation/doxygen/cheatsheets/uhi-cheatsheet.pdf differ diff --git a/gui/browsable/src/RSysFile.cxx b/gui/browsable/src/RSysFile.cxx index aca03bb6d14a0..8bfd34e013582 100644 --- a/gui/browsable/src/RSysFile.cxx +++ b/gui/browsable/src/RSysFile.cxx @@ -7,7 +7,6 @@ *************************************************************************/ /// \file -/// \ingroup rbrowser /// \author Sergey Linev /// \date 2019-10-15 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/gui/doc/index.md b/gui/doc/index.md index 840353fed6e2a..5016f3d5a8504 100644 --- a/gui/doc/index.md +++ b/gui/doc/index.md @@ -1,4 +1,5 @@ \defgroup gui GUI +\ingroup Graphics \brief Graphical User Interface The ROOT GUI classes support an extensive and rich set of widgets. The widget classes @@ -8,3 +9,4 @@ fully cross-platform. \defgroup webwidgets Web Widgets \brief A Graphical User Interface based on WEB technology +\ingroup webdisplay diff --git a/gui/webdisplay/doc/index.md b/gui/webdisplay/doc/index.md index 8950ff69789d4..ba0bf89f8790c 100644 --- a/gui/webdisplay/doc/index.md +++ b/gui/webdisplay/doc/index.md @@ -1,2 +1,3 @@ \defgroup webdisplay Web Display \brief A Graphical User Interface based on WEB technology +\ingroup gui diff --git a/hist/hist/inc/TH2.h b/hist/hist/inc/TH2.h index e7d8101aecc58..40ef814dde7fb 100644 --- a/hist/hist/inc/TH2.h +++ b/hist/hist/inc/TH2.h @@ -87,7 +87,7 @@ class TH2 : public TH1 { void FillN(Int_t, const Double_t *, const Double_t *, Int_t) override {} //MayNotUse void FillN(Int_t ntimes, const Double_t *x, const Double_t *y, const Double_t *w, Int_t stride=1) override; using TH1::FillRandom; - void FillRandom(TF1 *f1, Int_t ntimes=5000, TRandom *rng = nullptr) override; + void FillRandom(TF1 *function, Int_t ntimes=5000, TRandom *rng = nullptr) override; void FillRandom(TH1 *h, Int_t ntimes=5000, TRandom *rng = nullptr) override; virtual void FitSlicesX(TF1 *f1 = nullptr, Int_t firstybin=0, Int_t lastybin=-1, Int_t cut=0, Option_t *option="QNR", TObjArray* arr = nullptr); virtual void FitSlicesY(TF1 *f1 = nullptr, Int_t firstxbin=0, Int_t lastxbin=-1, Int_t cut=0, Option_t *option="QNR", TObjArray* arr = nullptr); diff --git a/hist/hist/src/TH2.cxx b/hist/hist/src/TH2.cxx index 3b0cd5f93084b..a4320ee5c575c 100644 --- a/hist/hist/src/TH2.cxx +++ b/hist/hist/src/TH2.cxx @@ -664,9 +664,9 @@ void TH2::FillN(Int_t ntimes, const Double_t *x, const Double_t *y, const Double //////////////////////////////////////////////////////////////////////////////// -/// Fill histogram following distribution in function fname. +/// Fill histogram following distribution in function `function`. /// -/// @param fname : Function name used for filling the histogram +/// @param function Function name used for filling the histogram /// @param ntimes : number of times the histogram is filled /// @param rng : (optional) Random number generator used to sample /// @@ -681,12 +681,12 @@ void TH2::FillN(Int_t ntimes, const Double_t *x, const Double_t *y, const Double /// /// One can also call TF2::GetRandom2 to get a random variate from a function. -void TH2::FillRandom(TF1 *fobj, Int_t ntimes, TRandom * rng) +void TH2::FillRandom(TF1 *function, Int_t ntimes, TRandom * rng) { Int_t bin, binx, biny, ibin, loop; Double_t r1, x, y; - TF2 * f1 = dynamic_cast(fobj); - if (!f1) { Error("FillRandom", "Function: %s is not a TF2, is a %s",fobj->GetName(),fobj->IsA()->GetName()); return; } + TF2 * f1 = dynamic_cast(function); + if (!f1) { Error("FillRandom", "Function: %s is not a TF2, is a %s",function->GetName(),function->IsA()->GetName()); return; } TAxis & xAxis = fXaxis; diff --git a/io/dcache/src/TDCacheFile.cxx b/io/dcache/src/TDCacheFile.cxx index 82cc13f71b50e..3243b791e3963 100644 --- a/io/dcache/src/TDCacheFile.cxx +++ b/io/dcache/src/TDCacheFile.cxx @@ -14,7 +14,7 @@ /** \class TDCacheFile -\ingroup IO +\ingroup io_files A TDCacheFile is like a normal TFile except that it may read and write its data via a dCache server (for more on the dCache daemon see http://www-dcache.desy.de/. Given a path which doesn't belong diff --git a/io/io/doc/index.md b/io/io/doc/index.md index bec17662cecde..34a143f2c20b2 100644 --- a/io/io/doc/index.md +++ b/io/io/doc/index.md @@ -10,3 +10,18 @@ For an overview of I/O in ROOT, see the following pages in the ROOT manual: - [I/O of custom classes](root.cern/manual/io_custom_classes/): how to read and write user-defined C++ objects For ROOT I/O developers, a detailed internal description of the \ref rootio is also available. + +\defgroup io_files Files +\ingroup IO + +\defgroup io_SQL SQL +\ingroup IO + +\defgroup io_xml XML +\ingroup IO + +\defgroup io_ZIP ZIP +\ingroup IO + +\defgroup io_other Other +\ingroup IO diff --git a/io/io/inc/ROOT/RRawFile.hxx b/io/io/inc/ROOT/RRawFile.hxx index 1e1b83aca697d..0f6300126f041 100644 --- a/io/io/inc/ROOT/RRawFile.hxx +++ b/io/io/inc/ROOT/RRawFile.hxx @@ -24,7 +24,7 @@ namespace Internal { /** * \class RRawFile RRawFile.hxx - * \ingroup IO + * \ingroup io_files * * The RRawFile provides read-only access to local and remote files. Data can be read either byte-wise or line-wise. * The RRawFile base class provides line-wise access and buffering for byte-wise access. Derived classes provide the diff --git a/io/io/inc/ROOT/RRawFileTFile.hxx b/io/io/inc/ROOT/RRawFileTFile.hxx index 764751ae64516..194643ea120b0 100644 --- a/io/io/inc/ROOT/RRawFileTFile.hxx +++ b/io/io/inc/ROOT/RRawFileTFile.hxx @@ -22,7 +22,7 @@ namespace Internal { /** * \class RRawFileTFile RRawFileTFile.hxx - * \ingroup IO + * \ingroup io_files * * The RRawFileTFile wraps an open TFile, but does not take ownership. */ diff --git a/io/io/inc/ROOT/RRawFileUnix.hxx b/io/io/inc/ROOT/RRawFileUnix.hxx index bb8ebb32fe2aa..3f3cdf23a437a 100644 --- a/io/io/inc/ROOT/RRawFileUnix.hxx +++ b/io/io/inc/ROOT/RRawFileUnix.hxx @@ -23,7 +23,7 @@ namespace Internal { /** * \class RRawFileUnix RRawFileUnix.hxx - * \ingroup IO + * \ingroup io_files * * The RRawFileUnix class uses POSIX calls to read from a mounted file system. Thus the path name can refer, * for instance, to a named pipe instead of a regular file. diff --git a/io/io/inc/ROOT/RRawFileWin.hxx b/io/io/inc/ROOT/RRawFileWin.hxx index 142f1ccde45b7..918db15947b5c 100644 --- a/io/io/inc/ROOT/RRawFileWin.hxx +++ b/io/io/inc/ROOT/RRawFileWin.hxx @@ -24,7 +24,7 @@ namespace Internal { /** * \class RRawFileWin RRawFileWin.hxx - * \ingroup IO + * \ingroup io_files * * The RRawFileWin class uses portable C I/O calls to read from a drive. The standard C I/O buffering is turned off * for the buffering of RRawFile base class. diff --git a/io/io/inc/ROOT/TBufferMerger.hxx b/io/io/inc/ROOT/TBufferMerger.hxx index d3c8ac86849a2..e08450d2f5d06 100644 --- a/io/io/inc/ROOT/TBufferMerger.hxx +++ b/io/io/inc/ROOT/TBufferMerger.hxx @@ -27,7 +27,7 @@ class TBufferMergerFile; /** * \class TBufferMerger TBufferMerger.hxx - * \ingroup IO + * \ingroup io_files * * TBufferMerger is a class to facilitate writing data in * parallel from multiple threads, while writing to a single @@ -133,7 +133,7 @@ private: /** * \class TBufferMergerFile TBufferMerger.hxx - * \ingroup IO + * \ingroup io_other * * A TBufferMergerFile is similar to a TMemFile, but when data * is written to it, it is appended to the TBufferMerger queue. diff --git a/io/io/inc/TCollectionProxyFactory.h b/io/io/inc/TCollectionProxyFactory.h index 22ebc16ba026b..66493a61e2d33 100644 --- a/io/io/inc/TCollectionProxyFactory.h +++ b/io/io/inc/TCollectionProxyFactory.h @@ -115,7 +115,7 @@ class TCollectionProxyFactory { /** \class TCollectionStreamer TCollectionProxyFactory.h - \ingroup IO + \ingroup io_other Class streamer object to implement TClassStreamer functionality for I/O emulation. @@ -147,7 +147,7 @@ class TCollectionStreamer { /** \class TCollectionClassStreamer TCollectionProxyFactory.h - \ingroup IO + \ingroup io_other Class streamer object to implement TClassStreamer functionality for I/O emulation. @@ -195,7 +195,7 @@ class TCollectionClassStreamer : public TClassStreamer, public TCollectionStream /** \class TCollectionMemberStreamer TCollectionProxyFactory.h - \ingroup IO + \ingroup io_other Class streamer object to implement TMemberStreamer functionality for I/O emulation. diff --git a/io/io/inc/TFPBlock.h b/io/io/inc/TFPBlock.h index 53d751e280732..baa14eb2ac9fd 100644 --- a/io/io/inc/TFPBlock.h +++ b/io/io/inc/TFPBlock.h @@ -16,7 +16,7 @@ /** \class TFPBlock -\ingroup IO +\ingroup io_other */ class TFPBlock : public TObject{ diff --git a/io/io/inc/TFile.h b/io/io/inc/TFile.h index 4986d068468c1..ee87f2bb96bb4 100644 --- a/io/io/inc/TFile.h +++ b/io/io/inc/TFile.h @@ -440,7 +440,7 @@ class TFile : public TDirectoryFile { /** \class TFileOpenHandle -\ingroup IO +\ingroup io_files Class holding info about the file being opened */ class TFileOpenHandle : public TNamed { diff --git a/io/io/inc/TMapFile.h b/io/io/inc/TMapFile.h index 74ab7e1f739a8..249cfd837957e 100644 --- a/io/io/inc/TMapFile.h +++ b/io/io/inc/TMapFile.h @@ -121,7 +121,7 @@ friend class TMapRec; /** \class TMapRec -\ingroup IO +\ingroup io_files Keep track of an object in the mapped file. diff --git a/io/io/inc/TStreamerInfoActions.h b/io/io/inc/TStreamerInfoActions.h index f09054389579a..6cc37943ac8f8 100644 --- a/io/io/inc/TStreamerInfoActions.h +++ b/io/io/inc/TStreamerInfoActions.h @@ -20,7 +20,7 @@ /** \class TStreamerInfoActions::TConfiguration -\ingroup IO +\ingroup io_files */ namespace TStreamerInfoActions { diff --git a/io/io/inc/TVirtualCollectionIterators.h b/io/io/inc/TVirtualCollectionIterators.h index 9d1a8b7c8b99c..25088e42fb7fc 100644 --- a/io/io/inc/TVirtualCollectionIterators.h +++ b/io/io/inc/TVirtualCollectionIterators.h @@ -14,7 +14,7 @@ /** \class TVirtualCollectionIterators -\ingroup IO +\ingroup io_other Small helper class to generically acquire and release iterators. */ @@ -189,7 +189,7 @@ inline TGenericCollectionIterator *TGenericCollectionIterator::New(void *collect /** \class TVirtualCollectionPtrIterators -\ingroup IO +\ingroup io_other */ class TVirtualCollectionPtrIterators { diff --git a/io/io/inc/TZIPFile.h b/io/io/inc/TZIPFile.h index 99409e980893e..892dae7383386 100644 --- a/io/io/inc/TZIPFile.h +++ b/io/io/inc/TZIPFile.h @@ -146,7 +146,7 @@ class TZIPFile : public TArchiveFile { /** \class TZIPMember -\ingroup IO +\ingroup io_ZIP A ZIP archive consists of files compressed with the popular ZLIB compression algorithm; this class records the information about a single archive member. diff --git a/io/io/src/TArchiveFile.cxx b/io/io/src/TArchiveFile.cxx index fd5055b4ddeb6..f50733bd967ae 100644 --- a/io/io/src/TArchiveFile.cxx +++ b/io/io/src/TArchiveFile.cxx @@ -12,7 +12,7 @@ /** \file TArchiveFile.cxx \class TArchiveFile -\ingroup IO +\ingroup io_other Class describing an archive file containing multiple sub-files, like a ZIP or TAR archive. diff --git a/io/io/src/TBufferFile.cxx b/io/io/src/TBufferFile.cxx index 362c2c5f17ff0..a20a67ec60861 100644 --- a/io/io/src/TBufferFile.cxx +++ b/io/io/src/TBufferFile.cxx @@ -12,7 +12,7 @@ /** \file TBufferFile.cxx \class TBufferFile -\ingroup IO +\ingroup io_other The concrete implementation of TBuffer for writing/reading to/from a ROOT file or socket. */ diff --git a/io/io/src/TBufferIO.cxx b/io/io/src/TBufferIO.cxx index 6e84623c9a56a..71bad29a3296c 100644 --- a/io/io/src/TBufferIO.cxx +++ b/io/io/src/TBufferIO.cxx @@ -12,7 +12,7 @@ /** \file TBufferIO.cxx \class TBufferIO -\ingroup IO +\ingroup io_other Direct subclass of TBuffer, implements common methods for TBufferFile and TBufferText classes */ diff --git a/io/io/src/TBufferJSON.cxx b/io/io/src/TBufferJSON.cxx index c4d901dd8d66d..33f2550360063 100644 --- a/io/io/src/TBufferJSON.cxx +++ b/io/io/src/TBufferJSON.cxx @@ -11,7 +11,7 @@ /** \class TBufferJSON -\ingroup IO +\ingroup io_other Class for serializing object to and from JavaScript Object Notation (JSON) format. It creates such object representation, which can be directly diff --git a/io/io/src/TBufferText.cxx b/io/io/src/TBufferText.cxx index 76e625f8ead24..d1961bc841320 100644 --- a/io/io/src/TBufferText.cxx +++ b/io/io/src/TBufferText.cxx @@ -11,7 +11,7 @@ /** \class TBufferText -\ingroup IO +\ingroup io_other Base class for text-based streamers like TBufferJSON or TBufferXML Special actions list will use methods, introduced in this class. diff --git a/io/io/src/TContainerConverters.cxx b/io/io/src/TContainerConverters.cxx index c5f8fe65c4a5f..8e25771e4e812 100644 --- a/io/io/src/TContainerConverters.cxx +++ b/io/io/src/TContainerConverters.cxx @@ -18,7 +18,7 @@ /** \class TConvertClonesArrayToProxy TContainerConverters.cxx - \ingroup IO + \ingroup io_other Small helper to read a TBuffer containing a TClonesArray into any valid collection. diff --git a/io/io/src/TDirectoryFile.cxx b/io/io/src/TDirectoryFile.cxx index 3e9c01eaf9218..2f598d32296a7 100644 --- a/io/io/src/TDirectoryFile.cxx +++ b/io/io/src/TDirectoryFile.cxx @@ -11,7 +11,7 @@ /** \class TDirectoryFile - \ingroup IO + \ingroup io_files A ROOT file is structured in Directories (like a file system). Each Directory has a list of Keys (see TKeys) and a list of objects diff --git a/io/io/src/TEmulatedCollectionProxy.cxx b/io/io/src/TEmulatedCollectionProxy.cxx index 9fccbf7922cf5..b951b314b45f6 100644 --- a/io/io/src/TEmulatedCollectionProxy.cxx +++ b/io/io/src/TEmulatedCollectionProxy.cxx @@ -11,7 +11,7 @@ /** \class TEmulatedCollectionProxy - \ingroup IO + \ingroup io_other Streamer around an arbitrary STL like container, which implements basic container functionality. diff --git a/io/io/src/TEmulatedMapProxy.cxx b/io/io/src/TEmulatedMapProxy.cxx index 548f7a8bef4c9..f244a8aba6f05 100644 --- a/io/io/src/TEmulatedMapProxy.cxx +++ b/io/io/src/TEmulatedMapProxy.cxx @@ -25,7 +25,7 @@ /** \class TEmulatedMapProxy - \ingroup IO + \ingroup io_other Streamer around a map container. For optimization reasons this functionality is separated from the TEmulatedProxy. diff --git a/io/io/src/TFPBlock.cxx b/io/io/src/TFPBlock.cxx index 545e7192f44b3..562f4446fbb04 100644 --- a/io/io/src/TFPBlock.cxx +++ b/io/io/src/TFPBlock.cxx @@ -11,7 +11,7 @@ /** \class TFPBlock TFPBlock.cxx -\ingroup IO +\ingroup io_other This class represents the encapsulation of a block request. It contains the chunks to be prefetched and also serves as a diff --git a/io/io/src/TFile.cxx b/io/io/src/TFile.cxx index ce56d801d4e6f..4d71c78283592 100644 --- a/io/io/src/TFile.cxx +++ b/io/io/src/TFile.cxx @@ -12,7 +12,7 @@ /** \file TFile.cxx \class TFile -\ingroup IO +\ingroup io_files \brief A file, usually with extension .root, that stores data and code in the form of serialized objects in a file-system-like logical structure, possibly including subdirectory hierarchies. \note ROOT files contain data, and executable code, for example through TExec, TMacro, and TFormula instances. As for diff --git a/io/io/src/TFileCacheRead.cxx b/io/io/src/TFileCacheRead.cxx index e51832ae37682..ec859aa0d72e6 100644 --- a/io/io/src/TFileCacheRead.cxx +++ b/io/io/src/TFileCacheRead.cxx @@ -11,7 +11,7 @@ /** \class TFileCacheRead - \ingroup IO + \ingroup io_files A cache when reading files over the network. diff --git a/io/io/src/TFileCacheWrite.cxx b/io/io/src/TFileCacheWrite.cxx index df80ce0f548a5..7474ab9a7f33c 100644 --- a/io/io/src/TFileCacheWrite.cxx +++ b/io/io/src/TFileCacheWrite.cxx @@ -11,7 +11,7 @@ /** \class TFileCacheWrite TFileCacheWrite.cxx -\ingroup IO +\ingroup io_files A cache when writing files over the network A caching system to speed up network I/O, i.e. when there is diff --git a/io/io/src/TFileMerger.cxx b/io/io/src/TFileMerger.cxx index 14c8d442575a2..b0eccc6d4b37b 100644 --- a/io/io/src/TFileMerger.cxx +++ b/io/io/src/TFileMerger.cxx @@ -11,7 +11,7 @@ /** \class TFileMerger TFileMerger.cxx -\ingroup IO +\ingroup io_files This class provides file copy and merging services. diff --git a/io/io/src/TFilePrefetch.cxx b/io/io/src/TFilePrefetch.cxx index a62f30a016ede..9a9620ce46602 100644 --- a/io/io/src/TFilePrefetch.cxx +++ b/io/io/src/TFilePrefetch.cxx @@ -33,7 +33,7 @@ inline int xtod(char c) { return (c>='0' && c<='9') ? c-'0' : ((c>='A' && c<='F' /** \class TFilePrefetch -\ingroup IO +\ingroup io_files The prefetching mechanism uses two classes (TFilePrefetch and TFPBlock) to prefetch in advance a block of tree entries. There is diff --git a/io/io/src/TFree.cxx b/io/io/src/TFree.cxx index 5001c67a45982..5a06ac2497ada 100644 --- a/io/io/src/TFree.cxx +++ b/io/io/src/TFree.cxx @@ -18,7 +18,7 @@ /** \class TFree -\ingroup IO +\ingroup io_other Service class for TFile. Each file has a linked list of free segments. Each free segment is described diff --git a/io/io/src/TGenCollectionProxy.cxx b/io/io/src/TGenCollectionProxy.cxx index bae962d6e7c95..9b240e02ad28d 100644 --- a/io/io/src/TGenCollectionProxy.cxx +++ b/io/io/src/TGenCollectionProxy.cxx @@ -28,7 +28,7 @@ /** \class TGenVectorProxy -\ingroup IO +\ingroup io_other Local optimization class. Collection proxies get copied. On copy we switch the type of the @@ -78,7 +78,7 @@ class TGenVectorProxy : public TGenCollectionProxy { /** \class TGenVectorBoolProxy -\ingroup IO +\ingroup io_other Local optimization class. Collection proxies get copied. On copy we switch the type of the @@ -179,7 +179,7 @@ class TGenBitsetProxy : public TGenCollectionProxy { /* \class TGenListProxy -\ingroup IO +\ingroup io_other Local optimization class. Collection proxies get copied. On copy we switch the type of the @@ -221,7 +221,7 @@ class TGenListProxy : public TGenVectorProxy { /** \class TGenSetProxy -\ingroup IO +\ingroup io_other Localoptimization class. Collection proxies get copied. On copy we switch the type of the @@ -266,7 +266,7 @@ class TGenSetProxy : public TGenVectorProxy { /** \class TGenMapProxy -\ingroup IO +\ingroup io_other Localoptimization class. Collection proxies get copied. On copy we switch the type of the @@ -535,7 +535,7 @@ void TGenCollectionProxy::Value::DeleteItem(void* ptr) /** \class TGenCollectionProxy TGenCollectionProxy.cxx - \ingroup IO + \ingroup io_other Proxy around an arbitrary container, which implements basic functionality and iteration. diff --git a/io/io/src/TGenCollectionStreamer.cxx b/io/io/src/TGenCollectionStreamer.cxx index 0ac364f92c524..3dbddde5df4b3 100644 --- a/io/io/src/TGenCollectionStreamer.cxx +++ b/io/io/src/TGenCollectionStreamer.cxx @@ -11,7 +11,7 @@ /* \class TGenCollectionStreamer -\ingroup IO +\ingroup io_other Streamer around an arbitrary container, which implements basic functionality and iteration. diff --git a/io/io/src/TKey.cxx b/io/io/src/TKey.cxx index c59d0f71c8904..8f9b6232d23b4 100644 --- a/io/io/src/TKey.cxx +++ b/io/io/src/TKey.cxx @@ -11,7 +11,7 @@ /** \class TKey -\ingroup IO +\ingroup io_files Book space in a file, create I/O buffers, to fill them, (un)compress them. diff --git a/io/io/src/TKeyMapFile.cxx b/io/io/src/TKeyMapFile.cxx index f95f5d71f3f60..c6b84af9a9728 100644 --- a/io/io/src/TKeyMapFile.cxx +++ b/io/io/src/TKeyMapFile.cxx @@ -11,7 +11,7 @@ /** \class TKeyMapFile -\ingroup IO +\ingroup io_files Utility class for browsing TMapFile objects. When the browser is invoked for a TMapFile, a TKeyMapFile object diff --git a/io/io/src/TLockFile.cxx b/io/io/src/TLockFile.cxx index b8879a96f83b1..a4fe102a26ef4 100644 --- a/io/io/src/TLockFile.cxx +++ b/io/io/src/TLockFile.cxx @@ -11,7 +11,7 @@ /** \class TLockFile -\ingroup IO +\ingroup io_other A scoped lock based on files. diff --git a/io/io/src/TMakeProject.cxx b/io/io/src/TMakeProject.cxx index 8021ae49f7a15..f1e5e4878efee 100644 --- a/io/io/src/TMakeProject.cxx +++ b/io/io/src/TMakeProject.cxx @@ -11,7 +11,7 @@ /* \class TMakeProject TMakeProject.cxx -\ingroup IO +\ingroup io_other Helper class implementing the TFile::MakeProject. **/ diff --git a/io/io/src/TMapFile.cxx b/io/io/src/TMapFile.cxx index 7692d5886a223..4c8de5a88e6d0 100644 --- a/io/io/src/TMapFile.cxx +++ b/io/io/src/TMapFile.cxx @@ -14,7 +14,7 @@ /** \class TMapFile -\ingroup IO +\ingroup io_files This class implements a shared memory region mapped to a file. Objects can be placed into this shared memory area using the Add() diff --git a/io/io/src/TMemFile.cxx b/io/io/src/TMemFile.cxx index 275107db7c2b9..35f6508f9491f 100644 --- a/io/io/src/TMemFile.cxx +++ b/io/io/src/TMemFile.cxx @@ -11,7 +11,7 @@ /** \class TMemFile TMemFile.cxx -\ingroup IO +\ingroup io_files A TMemFile is like a normal TFile except that it reads and writes only from memory. diff --git a/io/io/src/TStreamerInfo.cxx b/io/io/src/TStreamerInfo.cxx index 204c5844138f6..ba7f6ae80eb65 100644 --- a/io/io/src/TStreamerInfo.cxx +++ b/io/io/src/TStreamerInfo.cxx @@ -10,7 +10,7 @@ *************************************************************************/ /** \class TStreamerInfo - \ingroup IO + \ingroup io_files Describes a persistent version of a class. diff --git a/io/io/src/TZIPFile.cxx b/io/io/src/TZIPFile.cxx index 6e90a9bb76a3c..3608614f9e5e0 100644 --- a/io/io/src/TZIPFile.cxx +++ b/io/io/src/TZIPFile.cxx @@ -11,7 +11,7 @@ /** \class TZIPFile -\ingroup IO +\ingroup io_ZIP Describes a ZIP archive file containing multiple sub-files. diff --git a/io/sql/inc/TSQLObjectData.h b/io/sql/inc/TSQLObjectData.h index a2298f07c87f0..4d70703f62782 100644 --- a/io/sql/inc/TSQLObjectData.h +++ b/io/sql/inc/TSQLObjectData.h @@ -101,7 +101,7 @@ class TSQLObjectData : public TObject { // ====================================================================== /** \class TSQLObjectDataPool -\ingroup IO +\ingroup io_SQL XML object keeper class */ diff --git a/io/sql/src/TBufferSQL2.cxx b/io/sql/src/TBufferSQL2.cxx index eae8309d44560..6874364da81f7 100644 --- a/io/sql/src/TBufferSQL2.cxx +++ b/io/sql/src/TBufferSQL2.cxx @@ -11,7 +11,7 @@ /** \class TBufferSQL2 -\ingroup IO +\ingroup io_SQL Converts data to SQL statements or read data from SQL tables. diff --git a/io/sql/src/TKeySQL.cxx b/io/sql/src/TKeySQL.cxx index b2eb94dec2bee..88d995da25f88 100644 --- a/io/sql/src/TKeySQL.cxx +++ b/io/sql/src/TKeySQL.cxx @@ -11,7 +11,7 @@ /** \class TKeySQL -\ingroup IO +\ingroup io_SQL TKeySQL represents meta-information about object, which was written to SQL database. It keeps object id, which used to locate object data diff --git a/io/sql/src/TSQLClassInfo.cxx b/io/sql/src/TSQLClassInfo.cxx index a45cd02c3cdd6..8e342cc968f4a 100644 --- a/io/sql/src/TSQLClassInfo.cxx +++ b/io/sql/src/TSQLClassInfo.cxx @@ -11,7 +11,7 @@ /** \class TSQLClassInfo -\ingroup IO +\ingroup io_SQL Contains information about tables specific to one class and version. It provides names of table for that class. For each version of diff --git a/io/sql/src/TSQLFile.cxx b/io/sql/src/TSQLFile.cxx index 5d4db4cfd34d9..cdd6c856746f2 100644 --- a/io/sql/src/TSQLFile.cxx +++ b/io/sql/src/TSQLFile.cxx @@ -11,7 +11,7 @@ /** \class TSQLFile -\ingroup IO +\ingroup io_SQL Access an SQL db via the TFile interface. diff --git a/io/sql/src/TSQLObjectData.cxx b/io/sql/src/TSQLObjectData.cxx index 3705b2bd2e37b..a043b04ee96c8 100644 --- a/io/sql/src/TSQLObjectData.cxx +++ b/io/sql/src/TSQLObjectData.cxx @@ -11,7 +11,7 @@ /** \class TSQLObjectData -\ingroup IO +\ingroup io_SQL TSQLObjectData is used in TBufferSQL2 class in reading procedure. It contains data, request from database table for one specific @@ -34,7 +34,7 @@ will be kept in single TSQLObjectData instance. /** \class TSQLObjectInfo -\ingroup IO +\ingroup io_SQL Info (classname, version) about object in database */ diff --git a/io/sql/src/TSQLStructure.cxx b/io/sql/src/TSQLStructure.cxx index 8f13e97f6d401..582738ea8c078 100644 --- a/io/sql/src/TSQLStructure.cxx +++ b/io/sql/src/TSQLStructure.cxx @@ -11,7 +11,7 @@ /** \class TSQLStructure -\ingroup IO +\ingroup io_SQL This is hierarchical structure, which is created when data is written by TBufferSQL2. It contains data all structural information such: version of written class, data member types of that class, value for @@ -149,7 +149,7 @@ Long64_t sqlio::atol64(const char *value) /** \class TSQLColumnData -\ingroup IO +\ingroup io_SQL */ diff --git a/io/xml/src/TBufferXML.cxx b/io/xml/src/TBufferXML.cxx index c04050f720564..12f7420cd7999 100644 --- a/io/xml/src/TBufferXML.cxx +++ b/io/xml/src/TBufferXML.cxx @@ -11,7 +11,7 @@ /** \class TBufferXML -\ingroup IO +\ingroup io_xml Class for serializing/deserializing object to/from xml. diff --git a/io/xmlparser/src/TDOMParser.cxx b/io/xmlparser/src/TDOMParser.cxx index 29efead75fecf..c269ace3db110 100644 --- a/io/xmlparser/src/TDOMParser.cxx +++ b/io/xmlparser/src/TDOMParser.cxx @@ -11,7 +11,7 @@ /** \class TDomParser -\ingroup IO +\ingroup io_xml DOM stands for the Document Object Model; this is an API for accessing XML or HTML structured documents. diff --git a/io/xmlparser/src/TSAXParser.cxx b/io/xmlparser/src/TSAXParser.cxx index eb7e2bb25f7e4..0c51ad067e073 100644 --- a/io/xmlparser/src/TSAXParser.cxx +++ b/io/xmlparser/src/TSAXParser.cxx @@ -11,7 +11,7 @@ /** \class TSAXParser -\ingroup IO +\ingroup io_xml TSAXParser is a subclass of TXMLParser, it is a wraper class to libxml library. diff --git a/io/xmlparser/src/TXMLAttr.cxx b/io/xmlparser/src/TXMLAttr.cxx index bf1a35a124061..5232caa4261ab 100644 --- a/io/xmlparser/src/TXMLAttr.cxx +++ b/io/xmlparser/src/TXMLAttr.cxx @@ -11,7 +11,7 @@ /** \class TXMLAttr -\ingroup IO +\ingroup io_xml TXMLAttribute is the attribute of an Element. It contains the name and the value of the attribute. diff --git a/io/xmlparser/src/TXMLDocument.cxx b/io/xmlparser/src/TXMLDocument.cxx index 07292a412476b..d5a0ee9abb9a1 100644 --- a/io/xmlparser/src/TXMLDocument.cxx +++ b/io/xmlparser/src/TXMLDocument.cxx @@ -11,7 +11,7 @@ /** \class TXMLDocument -\ingroup IO +\ingroup io_xml TXMLDocument contains a pointer to an xmlDoc structure, after the parser returns a tree built during the document analysis. diff --git a/io/xmlparser/src/TXMLNode.cxx b/io/xmlparser/src/TXMLNode.cxx index ad5f1de5eef46..6e912fd4fcec4 100644 --- a/io/xmlparser/src/TXMLNode.cxx +++ b/io/xmlparser/src/TXMLNode.cxx @@ -11,7 +11,7 @@ /** \class TXMLNode -\ingroup IO +\ingroup io_xml TXMLNode contains a pointer to xmlNode, which is a node under the DOM tree. A node can be an Element, an Attribute, a Text Node diff --git a/io/xmlparser/src/TXMLParser.cxx b/io/xmlparser/src/TXMLParser.cxx index 26d4569ac64c5..fedb24a90063d 100644 --- a/io/xmlparser/src/TXMLParser.cxx +++ b/io/xmlparser/src/TXMLParser.cxx @@ -11,7 +11,7 @@ /** \class TXMLParser -\ingroup IO +\ingroup io_xml TXMLParser is an abstract class which interfaces with Libxml2. Libxml2 is the XML C parser and toolkit developed for the Gnome diff --git a/math/mathcore/inc/Math/ParamFunctor.h b/math/mathcore/inc/Math/ParamFunctor.h index b5c1e405d4a98..789192f0b5600 100644 --- a/math/mathcore/inc/Math/ParamFunctor.h +++ b/math/mathcore/inc/Math/ParamFunctor.h @@ -35,6 +35,7 @@ namespace Math { /** * \defgroup ParamFunctor_int N-D parametric functions * \brief Multi-dimensional parametric functions + * \ingroup Math */ /** class defining the signature for multi-dim parametric functions diff --git a/math/vecops/inc/ROOT/RVec.hxx b/math/vecops/inc/ROOT/RVec.hxx index 4d1d1a5fa26a7..fdf9d42d011f0 100644 --- a/math/vecops/inc/ROOT/RVec.hxx +++ b/math/vecops/inc/ROOT/RVec.hxx @@ -1130,8 +1130,9 @@ namespace VecOps { // Note that we open here with @{ the Doxygen group vecops and it is // closed again at the end of the C++ namespace VecOps /** - * \defgroup vecops VecOps - * A "std::vector"-like collection of values implementing handy operation to analyse them + * \defgroup vecops RVec and VecOps + * RVec is a "std::vector"-like collection of values that can adopt memory for fast data manipulation. + * This page lists functions to perform operations on RVecs to manipulate and analyse them. * @{ */ diff --git a/roofit/batchcompute/src/ComputeFunctions.cxx b/roofit/batchcompute/src/ComputeFunctions.cxx index 4225073a32452..3f67a736c7eb2 100644 --- a/roofit/batchcompute/src/ComputeFunctions.cxx +++ b/roofit/batchcompute/src/ComputeFunctions.cxx @@ -12,7 +12,6 @@ /** \file ComputeFunctions.cxx -\ingroup roofit_dev_docs_batchcompute This file contains vectorizable computation functions for PDFs and other Roofit objects. The same source file can also be compiled with nvcc. All functions have a single `Batches` diff --git a/roofit/roofitcore/src/Initialisation.cxx b/roofit/roofitcore/src/Initialisation.cxx index be347677f2522..5bd460827c80e 100644 --- a/roofit/roofitcore/src/Initialisation.cxx +++ b/roofit/roofitcore/src/Initialisation.cxx @@ -7,7 +7,6 @@ /** \file Initialisation.cxx -\ingroup Roofitcore Run static initialisers on first load of RooFitCore. **/ diff --git a/tree/dataframe/inc/ROOT/RDF/ActionHelpers.hxx b/tree/dataframe/inc/ROOT/RDF/ActionHelpers.hxx index 92553f5af5723..c64870a0e0c48 100644 --- a/tree/dataframe/inc/ROOT/RDF/ActionHelpers.hxx +++ b/tree/dataframe/inc/ROOT/RDF/ActionHelpers.hxx @@ -1,6 +1,5 @@ /** \file ROOT/RDF/ActionHelpers.hxx - \ingroup dataframe \author Enrico Guiraud, CERN \author Danilo Piparo, CERN \date 2016-12 diff --git a/tree/dataframe/inc/ROOT/RDF/GraphNode.hxx b/tree/dataframe/inc/ROOT/RDF/GraphNode.hxx index 02811084acd87..7561ce0fd8cab 100644 --- a/tree/dataframe/inc/ROOT/RDF/GraphNode.hxx +++ b/tree/dataframe/inc/ROOT/RDF/GraphNode.hxx @@ -37,7 +37,6 @@ class GraphCreatorHelper; // clang-format off /** \class ROOT::Internal::RDF::GraphDrawing::GraphNode -\ingroup dataframe \brief Class used to create the operation graph to be printed in the dot representation This represent a single node of the overall graph. Each node maps the real RNode keeping just diff --git a/tree/dataframe/inc/ROOT/RDF/RColumnRegister.hxx b/tree/dataframe/inc/ROOT/RDF/RColumnRegister.hxx index 5f622947794d5..a40c5e50de988 100644 --- a/tree/dataframe/inc/ROOT/RDF/RColumnRegister.hxx +++ b/tree/dataframe/inc/ROOT/RDF/RColumnRegister.hxx @@ -46,7 +46,6 @@ class RVariationsWithReaders; /** * \class ROOT::Internal::RDF::RColumnRegister - * \ingroup dataframe * \brief A binder for user-defined columns, variations and aliases. * * The storage is copy-on-write and shared between all instances of the class that have the same values. diff --git a/tree/dataframe/inc/ROOT/RDF/RInterface.hxx b/tree/dataframe/inc/ROOT/RDF/RInterface.hxx index ce0df1c44be85..b7cd49c1177e2 100644 --- a/tree/dataframe/inc/ROOT/RDF/RInterface.hxx +++ b/tree/dataframe/inc/ROOT/RDF/RInterface.hxx @@ -189,6 +189,14 @@ public: return RNode(std::static_pointer_cast<::ROOT::Detail::RDF::RNodeBase>(fProxiedPtr), *fLoopManager, fColRegister); } + /// \name Transformations + /// These functions transform the columns of the dataframe, such as filtering events or defining columns. + /// Transformations can be chained, for example + /// ~~~{.cpp} + /// auto filtered = rdf.Filter(...).Define(...).Define(...); + /// ~~~ + /// \{ + //////////////////////////////////////////////////////////////////////////// /// \brief Append a filter to the call graph. /// \param[in] f Function, lambda expression, functor class or any other callable object. It must return a `bool` @@ -1311,6 +1319,55 @@ public: return newInterface; } + // clang-format off + //////////////////////////////////////////////////////////////////////////// + /// \brief Creates a node that filters entries based on range: [begin, end). + /// \param[in] begin Initial entry number considered for this range. + /// \param[in] end Final entry number (excluded) considered for this range. 0 means that the range goes until the end of the dataset. + /// \param[in] stride Process one entry of the [begin, end) range every `stride` entries. Must be strictly greater than 0. + /// \return the first node of the computation graph for which the event loop is limited to a certain range of entries. + /// + /// Note that in case of previous Ranges and Filters the selected range refers to the transformed dataset. + /// Ranges are only available if EnableImplicitMT has _not_ been called. Multi-thread ranges are not supported. + /// + /// ### Example usage: + /// ~~~{.cpp} + /// auto d_0_30 = d.Range(0, 30); // Pick the first 30 entries + /// auto d_15_end = d.Range(15, 0); // Pick all entries from 15 onwards + /// auto d_15_end_3 = d.Range(15, 0, 3); // Stride: from event 15, pick an event every 3 + /// ~~~ + // clang-format on + RInterface> Range(unsigned int begin, unsigned int end, unsigned int stride = 1) + { + // check invariants + if (stride == 0 || (end != 0 && end < begin)) + throw std::runtime_error("Range: stride must be strictly greater than 0 and end must be greater than begin."); + CheckIMTDisabled("Range"); + + using Range_t = RDFDetail::RRange; + auto rangePtr = std::make_shared(begin, end, stride, fProxiedPtr); + RInterface> newInterface(std::move(rangePtr), *fLoopManager, fColRegister); + return newInterface; + } + + // clang-format off + //////////////////////////////////////////////////////////////////////////// + /// \brief Creates a node that filters entries based on range. + /// \param[in] end Final entry number (excluded) considered for this range. 0 means that the range goes until the end of the dataset. + /// \return a node of the computation graph for which the range is defined. + /// + /// See the other Range overload for a detailed description. + // clang-format on + RInterface> Range(unsigned int end) { return Range(0, end, 1); } + + /// \} + // --------------------------------------------------------------------------------- + // End of the doxygen group for Transformations + + /// \name Immediate Actions + /// Immediate Actions start the event loop and generate a type of result. + /// \{ + template [[deprecated("Snapshot is not any more a template. You can safely remove the template parameters.")]] RResultPtr> @@ -1720,46 +1777,6 @@ public: return Cache(selectedColumns); } - // clang-format off - //////////////////////////////////////////////////////////////////////////// - /// \brief Creates a node that filters entries based on range: [begin, end). - /// \param[in] begin Initial entry number considered for this range. - /// \param[in] end Final entry number (excluded) considered for this range. 0 means that the range goes until the end of the dataset. - /// \param[in] stride Process one entry of the [begin, end) range every `stride` entries. Must be strictly greater than 0. - /// \return the first node of the computation graph for which the event loop is limited to a certain range of entries. - /// - /// Note that in case of previous Ranges and Filters the selected range refers to the transformed dataset. - /// Ranges are only available if EnableImplicitMT has _not_ been called. Multi-thread ranges are not supported. - /// - /// ### Example usage: - /// ~~~{.cpp} - /// auto d_0_30 = d.Range(0, 30); // Pick the first 30 entries - /// auto d_15_end = d.Range(15, 0); // Pick all entries from 15 onwards - /// auto d_15_end_3 = d.Range(15, 0, 3); // Stride: from event 15, pick an event every 3 - /// ~~~ - // clang-format on - RInterface> Range(unsigned int begin, unsigned int end, unsigned int stride = 1) - { - // check invariants - if (stride == 0 || (end != 0 && end < begin)) - throw std::runtime_error("Range: stride must be strictly greater than 0 and end must be greater than begin."); - CheckIMTDisabled("Range"); - - using Range_t = RDFDetail::RRange; - auto rangePtr = std::make_shared(begin, end, stride, fProxiedPtr); - RInterface> newInterface(std::move(rangePtr), *fLoopManager, fColRegister); - return newInterface; - } - - // clang-format off - //////////////////////////////////////////////////////////////////////////// - /// \brief Creates a node that filters entries based on range. - /// \param[in] end Final entry number (excluded) considered for this range. 0 means that the range goes until the end of the dataset. - /// \return a node of the computation graph for which the range is defined. - /// - /// See the other Range overload for a detailed description. - // clang-format on - RInterface> Range(unsigned int end) { return Range(0, end, 1); } // clang-format off //////////////////////////////////////////////////////////////////////////// @@ -1825,64 +1842,13 @@ public: fLoopManager->Run(); } - // clang-format off - //////////////////////////////////////////////////////////////////////////// - /// \brief Execute a user-defined reduce operation on the values of a column. - /// \tparam F The type of the reduce callable. Automatically deduced. - /// \tparam T The type of the column to apply the reduction to. Automatically deduced. - /// \param[in] f A callable with signature `T(T,T)` - /// \param[in] columnName The column to be reduced. If omitted, the first default column is used instead. - /// \return the reduced quantity wrapped in a ROOT::RDF:RResultPtr. - /// - /// A reduction takes two values of a column and merges them into one (e.g. - /// by summing them, taking the maximum, etc). This action performs the - /// specified reduction operation on all processed column values, returning - /// a single value of the same type. The callable f must satisfy the general - /// requirements of a *processing function* besides having signature `T(T,T)` - /// where `T` is the type of column columnName. - /// - /// The returned reduced value of each thread (e.g. the initial value of a sum) is initialized to a - /// default-constructed T object. This is commonly expected to be the neutral/identity element for the specific - /// reduction operation `f` (e.g. 0 for a sum, 1 for a product). If a default-constructed T does not satisfy this - /// requirement, users should explicitly specify an initialization value for T by calling the appropriate `Reduce` - /// overload. - /// - /// ### Example usage: - /// ~~~{.cpp} - /// auto sumOfIntCol = d.Reduce([](int x, int y) { return x + y; }, "intCol"); - /// ~~~ - /// - /// This action is *lazy*: upon invocation of this method the calculation is - /// booked but not executed. Also see RResultPtr. - // clang-format on - template ::ret_type> - RResultPtr Reduce(F f, std::string_view columnName = "") - { - static_assert( - std::is_default_constructible::value, - "reduce object cannot be default-constructed. Please provide an initialisation value (redIdentity)"); - return Reduce(std::move(f), columnName, T()); - } - - //////////////////////////////////////////////////////////////////////////// - /// \brief Execute a user-defined reduce operation on the values of a column. - /// \tparam F The type of the reduce callable. Automatically deduced. - /// \tparam T The type of the column to apply the reduction to. Automatically deduced. - /// \param[in] f A callable with signature `T(T,T)` - /// \param[in] columnName The column to be reduced. If omitted, the first default column is used instead. - /// \param[in] redIdentity The reduced object of each thread is initialized to this value. - /// \return the reduced quantity wrapped in a RResultPtr. - /// - /// ### Example usage: - /// ~~~{.cpp} - /// auto sumOfIntColWithOffset = d.Reduce([](int x, int y) { return x + y; }, "intCol", 42); - /// ~~~ - /// See the description of the first Reduce overload for more information. - template ::ret_type> - RResultPtr Reduce(F f, std::string_view columnName, const T &redIdentity) - { - return Aggregate(f, f, columnName, redIdentity); - } + /// \} + // End of doxygen group for immediate actions + // ---------------------------------------------------------------------------------------- + /// \name Actions + /// Actions declare a type of result to be produced, for example histograms or summary statistics. + /// Actions are lazy, i.e. they are only executed once a result is requested. + /// \{ //////////////////////////////////////////////////////////////////////////// /// \brief Return the number of entries processed (*lazy action*). @@ -3446,6 +3412,105 @@ public: return MakeResultPtr(rep, *fLoopManager, std::move(action)); } + + //////////////////////////////////////////////////////////////////////////// + /// \brief Provides a representation of the columns in the dataset. + /// \tparam ColumnTypes variadic list of branch/column types. + /// \param[in] columnList Names of the columns to be displayed. + /// \param[in] nRows Number of events for each column to be displayed. + /// \param[in] nMaxCollectionElements Maximum number of collection elements to display per row. + /// \return the `RDisplay` instance wrapped in a RResultPtr. + /// + /// This function returns a `RResultPtr` containing all the entries to be displayed, organized in a tabular + /// form. RDisplay will either print on the standard output a summarized version through `RDisplay::Print()` or will + /// return a complete version through `RDisplay::AsString()`. + /// + /// This action is *lazy*: upon invocation of this method the calculation is booked but not executed. Also see + /// RResultPtr. + /// + /// Example usage: + /// ~~~{.cpp} + /// // Preparing the RResultPtr object with all columns and default number of entries + /// auto d1 = rdf.Display(""); + /// // Preparing the RResultPtr object with two columns and 128 entries + /// auto d2 = d.Display({"x", "y"}, 128); + /// // Printing the short representations, the event loop will run + /// d1->Print(); + /// d2->Print(); + /// ~~~ + template + RResultPtr Display(const ColumnNames_t &columnList, size_t nRows = 5, size_t nMaxCollectionElements = 10) + { + CheckIMTDisabled("Display"); + auto newCols = columnList; + newCols.insert(newCols.begin(), "rdfentry_"); // Artificially insert first column + auto displayer = std::make_shared(newCols, GetColumnTypeNamesList(newCols), nMaxCollectionElements); + using displayHelperArgs_t = std::pair>; + // Need to add ULong64_t type corresponding to the first column rdfentry_ + return CreateAction( + std::move(newCols), displayer, std::make_shared(nRows, displayer), fProxiedPtr); + } + + //////////////////////////////////////////////////////////////////////////// + /// \brief Provides a representation of the columns in the dataset. + /// \param[in] columnList Names of the columns to be displayed. + /// \param[in] nRows Number of events for each column to be displayed. + /// \param[in] nMaxCollectionElements Maximum number of collection elements to display per row. + /// \return the `RDisplay` instance wrapped in a RResultPtr. + /// + /// This overload automatically infers the column types. + /// See the previous overloads for further details. + /// + /// Invoked when no types are specified to Display + RResultPtr Display(const ColumnNames_t &columnList, size_t nRows = 5, size_t nMaxCollectionElements = 10) + { + CheckIMTDisabled("Display"); + auto newCols = columnList; + newCols.insert(newCols.begin(), "rdfentry_"); // Artificially insert first column + auto displayer = std::make_shared(newCols, GetColumnTypeNamesList(newCols), nMaxCollectionElements); + using displayHelperArgs_t = std::pair>; + return CreateAction( + std::move(newCols), displayer, std::make_shared(nRows, displayer), fProxiedPtr, + columnList.size() + 1); + } + + //////////////////////////////////////////////////////////////////////////// + /// \brief Provides a representation of the columns in the dataset. + /// \param[in] columnNameRegexp A regular expression to select the columns. + /// \param[in] nRows Number of events for each column to be displayed. + /// \param[in] nMaxCollectionElements Maximum number of collection elements to display per row. + /// \return the `RDisplay` instance wrapped in a RResultPtr. + /// + /// The existing columns are matched against the regular expression. If the string provided + /// is empty, all columns are selected. + /// See the previous overloads for further details. + RResultPtr + Display(std::string_view columnNameRegexp = "", size_t nRows = 5, size_t nMaxCollectionElements = 10) + { + const auto columnNames = GetColumnNames(); + const auto selectedColumns = RDFInternal::ConvertRegexToColumns(columnNames, columnNameRegexp, "Display"); + return Display(selectedColumns, nRows, nMaxCollectionElements); + } + + //////////////////////////////////////////////////////////////////////////// + /// \brief Provides a representation of the columns in the dataset. + /// \param[in] columnList Names of the columns to be displayed. + /// \param[in] nRows Number of events for each column to be displayed. + /// \param[in] nMaxCollectionElements Number of maximum elements in collection. + /// \return the `RDisplay` instance wrapped in a RResultPtr. + /// + /// See the previous overloads for further details. + RResultPtr + Display(std::initializer_list columnList, size_t nRows = 5, size_t nMaxCollectionElements = 10) + { + ColumnNames_t selectedColumns(columnList); + return Display(selectedColumns, nRows, nMaxCollectionElements); + } + + /// \} + // End of the doxygen group for actions + // ---------------------------------------------------------------------------------------- + /// \brief Returns the names of the filters created. /// \return the container of filters names. /// @@ -3462,6 +3527,10 @@ public: /// std::vector GetFilterNames() { return RDFInternal::GetFilterNames(fProxiedPtr); } + /// \name User-defined Actions + /// Run a user-defined function on the data and produce a result. + /// \{ + // clang-format off //////////////////////////////////////////////////////////////////////////// /// \brief Execute a user-defined accumulation operation on the processed column values in each processing slot. @@ -3637,99 +3706,68 @@ public: } } + + // clang-format off //////////////////////////////////////////////////////////////////////////// - /// \brief Provides a representation of the columns in the dataset. - /// \tparam ColumnTypes variadic list of branch/column types. - /// \param[in] columnList Names of the columns to be displayed. - /// \param[in] nRows Number of events for each column to be displayed. - /// \param[in] nMaxCollectionElements Maximum number of collection elements to display per row. - /// \return the `RDisplay` instance wrapped in a RResultPtr. + /// \brief Execute a user-defined reduce operation on the values of a column. + /// \tparam F The type of the reduce callable. Automatically deduced. + /// \tparam T The type of the column to apply the reduction to. Automatically deduced. + /// \param[in] f A callable with signature `T(T,T)` + /// \param[in] columnName The column to be reduced. If omitted, the first default column is used instead. + /// \return the reduced quantity wrapped in a ROOT::RDF:RResultPtr. /// - /// This function returns a `RResultPtr` containing all the entries to be displayed, organized in a tabular - /// form. RDisplay will either print on the standard output a summarized version through `RDisplay::Print()` or will - /// return a complete version through `RDisplay::AsString()`. + /// A reduction takes two values of a column and merges them into one (e.g. + /// by summing them, taking the maximum, etc). This action performs the + /// specified reduction operation on all processed column values, returning + /// a single value of the same type. The callable f must satisfy the general + /// requirements of a *processing function* besides having signature `T(T,T)` + /// where `T` is the type of column columnName. /// - /// This action is *lazy*: upon invocation of this method the calculation is booked but not executed. Also see - /// RResultPtr. + /// The returned reduced value of each thread (e.g. the initial value of a sum) is initialized to a + /// default-constructed T object. This is commonly expected to be the neutral/identity element for the specific + /// reduction operation `f` (e.g. 0 for a sum, 1 for a product). If a default-constructed T does not satisfy this + /// requirement, users should explicitly specify an initialization value for T by calling the appropriate `Reduce` + /// overload. /// - /// Example usage: + /// ### Example usage: /// ~~~{.cpp} - /// // Preparing the RResultPtr object with all columns and default number of entries - /// auto d1 = rdf.Display(""); - /// // Preparing the RResultPtr object with two columns and 128 entries - /// auto d2 = d.Display({"x", "y"}, 128); - /// // Printing the short representations, the event loop will run - /// d1->Print(); - /// d2->Print(); + /// auto sumOfIntCol = d.Reduce([](int x, int y) { return x + y; }, "intCol"); /// ~~~ - template - RResultPtr Display(const ColumnNames_t &columnList, size_t nRows = 5, size_t nMaxCollectionElements = 10) - { - CheckIMTDisabled("Display"); - auto newCols = columnList; - newCols.insert(newCols.begin(), "rdfentry_"); // Artificially insert first column - auto displayer = std::make_shared(newCols, GetColumnTypeNamesList(newCols), nMaxCollectionElements); - using displayHelperArgs_t = std::pair>; - // Need to add ULong64_t type corresponding to the first column rdfentry_ - return CreateAction( - std::move(newCols), displayer, std::make_shared(nRows, displayer), fProxiedPtr); - } - - //////////////////////////////////////////////////////////////////////////// - /// \brief Provides a representation of the columns in the dataset. - /// \param[in] columnList Names of the columns to be displayed. - /// \param[in] nRows Number of events for each column to be displayed. - /// \param[in] nMaxCollectionElements Maximum number of collection elements to display per row. - /// \return the `RDisplay` instance wrapped in a RResultPtr. - /// - /// This overload automatically infers the column types. - /// See the previous overloads for further details. /// - /// Invoked when no types are specified to Display - RResultPtr Display(const ColumnNames_t &columnList, size_t nRows = 5, size_t nMaxCollectionElements = 10) + /// This action is *lazy*: upon invocation of this method the calculation is + /// booked but not executed. Also see RResultPtr. + // clang-format on + template ::ret_type> + RResultPtr Reduce(F f, std::string_view columnName = "") { - CheckIMTDisabled("Display"); - auto newCols = columnList; - newCols.insert(newCols.begin(), "rdfentry_"); // Artificially insert first column - auto displayer = std::make_shared(newCols, GetColumnTypeNamesList(newCols), nMaxCollectionElements); - using displayHelperArgs_t = std::pair>; - return CreateAction( - std::move(newCols), displayer, std::make_shared(nRows, displayer), fProxiedPtr, - columnList.size() + 1); + static_assert( + std::is_default_constructible::value, + "reduce object cannot be default-constructed. Please provide an initialisation value (redIdentity)"); + return Reduce(std::move(f), columnName, T()); } //////////////////////////////////////////////////////////////////////////// - /// \brief Provides a representation of the columns in the dataset. - /// \param[in] columnNameRegexp A regular expression to select the columns. - /// \param[in] nRows Number of events for each column to be displayed. - /// \param[in] nMaxCollectionElements Maximum number of collection elements to display per row. - /// \return the `RDisplay` instance wrapped in a RResultPtr. + /// \brief Execute a user-defined reduce operation on the values of a column. + /// \tparam F The type of the reduce callable. Automatically deduced. + /// \tparam T The type of the column to apply the reduction to. Automatically deduced. + /// \param[in] f A callable with signature `T(T,T)` + /// \param[in] columnName The column to be reduced. If omitted, the first default column is used instead. + /// \param[in] redIdentity The reduced object of each thread is initialized to this value. + /// \return the reduced quantity wrapped in a RResultPtr. /// - /// The existing columns are matched against the regular expression. If the string provided - /// is empty, all columns are selected. - /// See the previous overloads for further details. - RResultPtr - Display(std::string_view columnNameRegexp = "", size_t nRows = 5, size_t nMaxCollectionElements = 10) + /// ### Example usage: + /// ~~~{.cpp} + /// auto sumOfIntColWithOffset = d.Reduce([](int x, int y) { return x + y; }, "intCol", 42); + /// ~~~ + /// See the description of the first Reduce overload for more information. + template ::ret_type> + RResultPtr Reduce(F f, std::string_view columnName, const T &redIdentity) { - const auto columnNames = GetColumnNames(); - const auto selectedColumns = RDFInternal::ConvertRegexToColumns(columnNames, columnNameRegexp, "Display"); - return Display(selectedColumns, nRows, nMaxCollectionElements); + return Aggregate(f, f, columnName, redIdentity); } - //////////////////////////////////////////////////////////////////////////// - /// \brief Provides a representation of the columns in the dataset. - /// \param[in] columnList Names of the columns to be displayed. - /// \param[in] nRows Number of events for each column to be displayed. - /// \param[in] nMaxCollectionElements Number of maximum elements in collection. - /// \return the `RDisplay` instance wrapped in a RResultPtr. - /// - /// See the previous overloads for further details. - RResultPtr - Display(std::initializer_list columnList, size_t nRows = 5, size_t nMaxCollectionElements = 10) - { - ColumnNames_t selectedColumns(columnList); - return Display(selectedColumns, nRows, nMaxCollectionElements); - } + /// \} + // End of the doxygen group for user-defined actions private: template ::ret_type> diff --git a/tree/dataframe/inc/ROOT/RDF/RMergeableValue.hxx b/tree/dataframe/inc/ROOT/RDF/RMergeableValue.hxx index 67bd607a8abcf..93756164c60bf 100644 --- a/tree/dataframe/inc/ROOT/RDF/RMergeableValue.hxx +++ b/tree/dataframe/inc/ROOT/RDF/RMergeableValue.hxx @@ -1,6 +1,5 @@ /** \file ROOT/RDF/RMergeableValue.hxx - \ingroup dataframe \author Vincenzo Eduardo Padulano \author Enrico Guiraud \date 2020-06 @@ -54,7 +53,6 @@ void MergeValues(RMergeableVariations &OutputMergeable, const RMergeableVaria /** \class ROOT::Detail::RDF::RMergeableValueBase \brief Base class of RMergeableValue. -\ingroup dataframe Base class of the mergeable RDataFrame results family of classes. Provides a non-templated custom type to allow passing a `std::unique_ptr` to the mergeable object along the call chain. This class is never used in the public API and has @@ -189,7 +187,6 @@ public: /** \class ROOT::Detail::RDF::RMergeableCount -\ingroup dataframe \brief Specialization of RMergeableValue for the [Count](classROOT_1_1RDF_1_1RInterface.html#a9678150c9c18cddd7b599690ba854734) action. @@ -239,7 +236,6 @@ public: /** \class ROOT::Detail::RDF::RMergeableFill -\ingroup dataframe \brief Specialization of RMergeableValue for histograms and statistics. This subclass is responsible for merging results coming from the following @@ -351,7 +347,6 @@ public: /** \class ROOT::Detail::RDF::RMergeableMean -\ingroup dataframe \brief Specialization of RMergeableValue for the [Mean](classROOT_1_1RDF_1_1RInterface.html#ade6b020284f2f4fe9d3b09246b5f376a) action. @@ -447,7 +442,6 @@ public: /** \class ROOT::Detail::RDF::RMergeableStdDev -\ingroup dataframe \brief Specialization of RMergeableValue for the [StdDev](classROOT_1_1RDF_1_1RInterface.html#a482c4e4f81fe1e421c016f89cd281572) action. @@ -561,7 +555,6 @@ public: }; /** -\ingroup dataframe \brief Specialization of RMergeableValue for the [Report](https://root.cern/doc/master/classROOT_1_1RDF_1_1RCutFlowReport.html) action. @@ -619,7 +612,6 @@ public: /** \class ROOT::Detail::RDF::RMergeableVariationsBase -\ingroup dataframe \brief A container for variation names and variation results. The class stores two vectors: one with the variation names, the other with @@ -677,7 +669,6 @@ public: /** \class ROOT::Detail::RDF::RMergeableVariations -\ingroup dataframe \brief A container for variation names and variation results that knows how to merge with others of the same type. \tparam T Type of the action result. diff --git a/tree/dataframe/inc/ROOT/RDF/SnapshotHelpers.hxx b/tree/dataframe/inc/ROOT/RDF/SnapshotHelpers.hxx index 781f6af0d141c..698d58f697a85 100644 --- a/tree/dataframe/inc/ROOT/RDF/SnapshotHelpers.hxx +++ b/tree/dataframe/inc/ROOT/RDF/SnapshotHelpers.hxx @@ -1,6 +1,5 @@ /** \file ROOT/RDF/SnapshotHelpers.hxx - \ingroup dataframe \author Enrico Guiraud, CERN \author Danilo Piparo, CERN \date 2016-12 diff --git a/tree/dataframe/inc/ROOT/RDataFrame.hxx b/tree/dataframe/inc/ROOT/RDataFrame.hxx index 0b2544e4f032b..ebac41c1a3c3a 100644 --- a/tree/dataframe/inc/ROOT/RDataFrame.hxx +++ b/tree/dataframe/inc/ROOT/RDataFrame.hxx @@ -10,7 +10,13 @@ /** \defgroup dataframe RDataFrame -ROOT's RDataFrame allows to analyse data stored in TTrees with a high level interface. +This is an overview of classes that are part of the RDataFrame package. +\note The main entry point for the RDataFrame API is \ref ROOT::RDataFrame. + +ROOT::RDataFrame allows to analyse data with a high-level interface. +It reads TTree, RNTuple, and various other inputs (see \ref ROOT::RDF::RDataSource and +its derived classes), and supports filtering events, computing new quantities, and producing +output such as histograms and new datasets. */ #ifndef ROOT_RDATAFRAME diff --git a/tree/dataframe/inc/ROOT/RTTreeDS.hxx b/tree/dataframe/inc/ROOT/RTTreeDS.hxx index 5a75a76f78008..31f00c60619ad 100644 --- a/tree/dataframe/inc/ROOT/RTTreeDS.hxx +++ b/tree/dataframe/inc/ROOT/RTTreeDS.hxx @@ -1,6 +1,5 @@ /** \file ROOT/RTTreeDS.hxx - \ingroup dataframe \author Vincenzo Eduardo Padulano \date 2024-12 */ diff --git a/tree/dataframe/src/RDFDisplay.cxx b/tree/dataframe/src/RDFDisplay.cxx index 51be7feed45c9..93a7e3f8a9a96 100644 --- a/tree/dataframe/src/RDFDisplay.cxx +++ b/tree/dataframe/src/RDFDisplay.cxx @@ -22,7 +22,6 @@ namespace RDF { /** * \class ROOT::Internal::RDF::RDisplayElement - * \ingroup dataframe * Helper class to let Display print compact tabular representations of the events * * This class is internal and not meant to be explicitly instantiated by the user. diff --git a/tree/dataframe/src/RDFSnapshotHelpers.cxx b/tree/dataframe/src/RDFSnapshotHelpers.cxx index 5477c9289df55..37b126cc8cb70 100644 --- a/tree/dataframe/src/RDFSnapshotHelpers.cxx +++ b/tree/dataframe/src/RDFSnapshotHelpers.cxx @@ -1,6 +1,5 @@ /** \file RDFSnapshotHelpers.cxx - \ingroup dataframe \author Enrico Guiraud, CERN \author Danilo Piparo, CERN \date 2016-12 diff --git a/tree/ntuple/inc/ROOT/RCluster.hxx b/tree/ntuple/inc/ROOT/RCluster.hxx index 5b88b8f006463..e10244774721b 100644 --- a/tree/ntuple/inc/ROOT/RCluster.hxx +++ b/tree/ntuple/inc/ROOT/RCluster.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RCluster.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2020-03-11 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/inc/ROOT/RClusterPool.hxx b/tree/ntuple/inc/ROOT/RClusterPool.hxx index 92e359e0fa87e..a5b7e9fd3f569 100644 --- a/tree/ntuple/inc/ROOT/RClusterPool.hxx +++ b/tree/ntuple/inc/ROOT/RClusterPool.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RClusterPool.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2020-03-11 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/inc/ROOT/RColumn.hxx b/tree/ntuple/inc/ROOT/RColumn.hxx index c872a3a726b0b..023452fe50418 100644 --- a/tree/ntuple/inc/ROOT/RColumn.hxx +++ b/tree/ntuple/inc/ROOT/RColumn.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RColumn.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-09 diff --git a/tree/ntuple/inc/ROOT/RColumnElementBase.hxx b/tree/ntuple/inc/ROOT/RColumnElementBase.hxx index b2d4bed5963d1..1807c31128baf 100644 --- a/tree/ntuple/inc/ROOT/RColumnElementBase.hxx +++ b/tree/ntuple/inc/ROOT/RColumnElementBase.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RColumnElementBase.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-09 diff --git a/tree/ntuple/inc/ROOT/RCreateFieldOptions.hxx b/tree/ntuple/inc/ROOT/RCreateFieldOptions.hxx index c2da68119d758..32a345401efa8 100644 --- a/tree/ntuple/inc/ROOT/RCreateFieldOptions.hxx +++ b/tree/ntuple/inc/ROOT/RCreateFieldOptions.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RCreateFieldOptions.hxx -/// \ingroup NTuple /// \author Giacomo Parolini /// \date 2024-12-17 diff --git a/tree/ntuple/inc/ROOT/RDaos.hxx b/tree/ntuple/inc/ROOT/RDaos.hxx index 7937c807b7026..0ef258392122f 100644 --- a/tree/ntuple/inc/ROOT/RDaos.hxx +++ b/tree/ntuple/inc/ROOT/RDaos.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RDaos.hxx -/// \ingroup NTuple /// \author Javier Lopez-Gomez /// \date 2020-11-14 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/inc/ROOT/REntry.hxx b/tree/ntuple/inc/ROOT/REntry.hxx index 845749be2f46e..33e5a8c2ab235 100644 --- a/tree/ntuple/inc/ROOT/REntry.hxx +++ b/tree/ntuple/inc/ROOT/REntry.hxx @@ -1,5 +1,4 @@ /// \file ROOT/REntry.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-07-19 diff --git a/tree/ntuple/inc/ROOT/RField.hxx b/tree/ntuple/inc/ROOT/RField.hxx index 0329c436f0654..031ef0d0bd854 100644 --- a/tree/ntuple/inc/ROOT/RField.hxx +++ b/tree/ntuple/inc/ROOT/RField.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RField.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-09 diff --git a/tree/ntuple/inc/ROOT/RField/RFieldFundamental.hxx b/tree/ntuple/inc/ROOT/RField/RFieldFundamental.hxx index 7e87c8203e7b9..9caf202bd0171 100644 --- a/tree/ntuple/inc/ROOT/RField/RFieldFundamental.hxx +++ b/tree/ntuple/inc/ROOT/RField/RFieldFundamental.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RField/Fundamental.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-09 diff --git a/tree/ntuple/inc/ROOT/RField/RFieldProxiedCollection.hxx b/tree/ntuple/inc/ROOT/RField/RFieldProxiedCollection.hxx index 9ee3724b58b23..ab30a4d61f589 100644 --- a/tree/ntuple/inc/ROOT/RField/RFieldProxiedCollection.hxx +++ b/tree/ntuple/inc/ROOT/RField/RFieldProxiedCollection.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RField/ProxiedCollection.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-09 diff --git a/tree/ntuple/inc/ROOT/RField/RFieldRecord.hxx b/tree/ntuple/inc/ROOT/RField/RFieldRecord.hxx index 873da2f3e5225..1b907fe45944e 100644 --- a/tree/ntuple/inc/ROOT/RField/RFieldRecord.hxx +++ b/tree/ntuple/inc/ROOT/RField/RFieldRecord.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RField/Fundamental.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-09 diff --git a/tree/ntuple/inc/ROOT/RField/RFieldSTLMisc.hxx b/tree/ntuple/inc/ROOT/RField/RFieldSTLMisc.hxx index eeeca91d20501..132e285a113c5 100644 --- a/tree/ntuple/inc/ROOT/RField/RFieldSTLMisc.hxx +++ b/tree/ntuple/inc/ROOT/RField/RFieldSTLMisc.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RField/STLMisc.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-09 diff --git a/tree/ntuple/inc/ROOT/RField/RFieldSequenceContainer.hxx b/tree/ntuple/inc/ROOT/RField/RFieldSequenceContainer.hxx index e4b152f0ccb49..f51bca26f213e 100644 --- a/tree/ntuple/inc/ROOT/RField/RFieldSequenceContainer.hxx +++ b/tree/ntuple/inc/ROOT/RField/RFieldSequenceContainer.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RField/SequenceContainer.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-09 diff --git a/tree/ntuple/inc/ROOT/RField/RFieldSoA.hxx b/tree/ntuple/inc/ROOT/RField/RFieldSoA.hxx index 5fdc3fc9a4583..6501be12e8f9d 100644 --- a/tree/ntuple/inc/ROOT/RField/RFieldSoA.hxx +++ b/tree/ntuple/inc/ROOT/RField/RFieldSoA.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RField/RFieldSoA.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2026-03-03 diff --git a/tree/ntuple/inc/ROOT/RFieldBase.hxx b/tree/ntuple/inc/ROOT/RFieldBase.hxx index 2761e391116ae..2f05c3d6b1723 100644 --- a/tree/ntuple/inc/ROOT/RFieldBase.hxx +++ b/tree/ntuple/inc/ROOT/RFieldBase.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RFieldBase.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-09 diff --git a/tree/ntuple/inc/ROOT/RFieldToken.hxx b/tree/ntuple/inc/ROOT/RFieldToken.hxx index 2b232c03979ba..289ce9287030e 100644 --- a/tree/ntuple/inc/ROOT/RFieldToken.hxx +++ b/tree/ntuple/inc/ROOT/RFieldToken.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RFieldToken.hxx -/// \ingroup NTuple /// \author Jonas Hahnfeld /// \date 2025-03-19 diff --git a/tree/ntuple/inc/ROOT/RFieldUtils.hxx b/tree/ntuple/inc/ROOT/RFieldUtils.hxx index 2ec4ff9bf5ade..3719ca06d0305 100644 --- a/tree/ntuple/inc/ROOT/RFieldUtils.hxx +++ b/tree/ntuple/inc/ROOT/RFieldUtils.hxx @@ -1,5 +1,4 @@ /// \file RFieldUtils.hxx -/// \ingroup NTuple /// \author Jonas Hahnfeld /// \date 2024-11-19 diff --git a/tree/ntuple/inc/ROOT/RFieldVisitor.hxx b/tree/ntuple/inc/ROOT/RFieldVisitor.hxx index 56521a1abad7d..d6905f1b7a03a 100644 --- a/tree/ntuple/inc/ROOT/RFieldVisitor.hxx +++ b/tree/ntuple/inc/ROOT/RFieldVisitor.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RFieldVisitor.hxx -/// \ingroup NTuple /// \author Simon Leisibach /// \date 2019-06-11 diff --git a/tree/ntuple/inc/ROOT/RMiniFile.hxx b/tree/ntuple/inc/ROOT/RMiniFile.hxx index b41380bf5261b..8c8b7404b93ca 100644 --- a/tree/ntuple/inc/ROOT/RMiniFile.hxx +++ b/tree/ntuple/inc/ROOT/RMiniFile.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RMiniFile.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2019-12-22 diff --git a/tree/ntuple/inc/ROOT/RNTuple.hxx b/tree/ntuple/inc/ROOT/RNTuple.hxx index 4ded76524b036..ae5a071030394 100644 --- a/tree/ntuple/inc/ROOT/RNTuple.hxx +++ b/tree/ntuple/inc/ROOT/RNTuple.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTuple.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2023-09-19 diff --git a/tree/ntuple/inc/ROOT/RNTupleAttrReading.hxx b/tree/ntuple/inc/ROOT/RNTupleAttrReading.hxx index e95824098f6ae..e75e4cbbbc88a 100644 --- a/tree/ntuple/inc/ROOT/RNTupleAttrReading.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleAttrReading.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleAttrReading.hxx -/// \ingroup NTuple /// \author Giacomo Parolini /// \date 2026-04-01 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/inc/ROOT/RNTupleAttrUtils.hxx b/tree/ntuple/inc/ROOT/RNTupleAttrUtils.hxx index 8997b6b85afc5..bf24e3db6d481 100644 --- a/tree/ntuple/inc/ROOT/RNTupleAttrUtils.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleAttrUtils.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleAttrUtils.hxx -/// \ingroup NTuple /// \author Giacomo Parolini /// \date 2026-03-10 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/inc/ROOT/RNTupleDescriptor.hxx b/tree/ntuple/inc/ROOT/RNTupleDescriptor.hxx index 9d4426af547af..c7b9c6eed1cda 100644 --- a/tree/ntuple/inc/ROOT/RNTupleDescriptor.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleDescriptor.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleDescriptor.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \author Javier Lopez-Gomez /// \date 2018-07-19 diff --git a/tree/ntuple/inc/ROOT/RNTupleFillContext.hxx b/tree/ntuple/inc/ROOT/RNTupleFillContext.hxx index adb0b5f9ecc7e..45ffdd61a7ca8 100644 --- a/tree/ntuple/inc/ROOT/RNTupleFillContext.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleFillContext.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleFillContext.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2024-02-22 diff --git a/tree/ntuple/inc/ROOT/RNTupleFillStatus.hxx b/tree/ntuple/inc/ROOT/RNTupleFillStatus.hxx index 6ff249e6e9179..7a3c2300f88b6 100644 --- a/tree/ntuple/inc/ROOT/RNTupleFillStatus.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleFillStatus.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleFillStatus.hxx -/// \ingroup NTuple /// \author Jonas Hahnfeld /// \date 2024-04-15 diff --git a/tree/ntuple/inc/ROOT/RNTupleImtTaskScheduler.hxx b/tree/ntuple/inc/ROOT/RNTupleImtTaskScheduler.hxx index 4728cbd9cfd43..9eb5bf2bf05be 100644 --- a/tree/ntuple/inc/ROOT/RNTupleImtTaskScheduler.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleImtTaskScheduler.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleImtTaskScheduler.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2024-02-19 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/inc/ROOT/RNTupleJoinTable.hxx b/tree/ntuple/inc/ROOT/RNTupleJoinTable.hxx index 17259f4a0f4dd..983d82f954209 100644 --- a/tree/ntuple/inc/ROOT/RNTupleJoinTable.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleJoinTable.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleJoinTable.hxx -/// \ingroup NTuple /// \author Florine de Geus /// \date 2024-04-02 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/inc/ROOT/RNTupleMerger.hxx b/tree/ntuple/inc/ROOT/RNTupleMerger.hxx index 10885c8406756..50b38a8fe3700 100644 --- a/tree/ntuple/inc/ROOT/RNTupleMerger.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleMerger.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleMerger.hxx -/// \ingroup NTuple /// \author Jakob Blomer , Max Orok , Alaettin Serhan Mete /// \date 2020-07-08 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/inc/ROOT/RNTupleMetrics.hxx b/tree/ntuple/inc/ROOT/RNTupleMetrics.hxx index d90da49c06f54..5137a4bde1e0c 100644 --- a/tree/ntuple/inc/ROOT/RNTupleMetrics.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleMetrics.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleMetrics.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2019-08-27 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/inc/ROOT/RNTupleModel.hxx b/tree/ntuple/inc/ROOT/RNTupleModel.hxx index ca2e5e0af569c..eb393b63bab54 100644 --- a/tree/ntuple/inc/ROOT/RNTupleModel.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleModel.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleModel.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-04 diff --git a/tree/ntuple/inc/ROOT/RNTupleParallelWriter.hxx b/tree/ntuple/inc/ROOT/RNTupleParallelWriter.hxx index 1b9fcf2a939bc..ddcc970b09282 100644 --- a/tree/ntuple/inc/ROOT/RNTupleParallelWriter.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleParallelWriter.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleParallelWriter.hxx -/// \ingroup NTuple /// \author Jonas Hahnfeld /// \date 2024-02-01 diff --git a/tree/ntuple/inc/ROOT/RNTupleProcessor.hxx b/tree/ntuple/inc/ROOT/RNTupleProcessor.hxx index 7b578cace2f03..06892a77c75f5 100644 --- a/tree/ntuple/inc/ROOT/RNTupleProcessor.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleProcessor.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleProcessor.hxx -/// \ingroup NTuple /// \author Florine de Geus /// \date 2024-03-26 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/inc/ROOT/RNTupleProcessorEntry.hxx b/tree/ntuple/inc/ROOT/RNTupleProcessorEntry.hxx index 3a9132c9c0649..e4bbf042e1c4a 100644 --- a/tree/ntuple/inc/ROOT/RNTupleProcessorEntry.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleProcessorEntry.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleProcessor.hxx -/// \ingroup NTuple /// \author Florine de Geus /// \date 2025-06-25 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/inc/ROOT/RNTupleRange.hxx b/tree/ntuple/inc/ROOT/RNTupleRange.hxx index fa2729c414dd7..462392e44d3a4 100644 --- a/tree/ntuple/inc/ROOT/RNTupleRange.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleRange.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleRange.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-05 diff --git a/tree/ntuple/inc/ROOT/RNTupleReadOptions.hxx b/tree/ntuple/inc/ROOT/RNTupleReadOptions.hxx index db30566524e8d..c2bb440e0c4a4 100644 --- a/tree/ntuple/inc/ROOT/RNTupleReadOptions.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleReadOptions.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleReadOptions.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2024-02-22 diff --git a/tree/ntuple/inc/ROOT/RNTupleReader.hxx b/tree/ntuple/inc/ROOT/RNTupleReader.hxx index 7d44eee12dbdd..8f3e8e191d3d2 100644 --- a/tree/ntuple/inc/ROOT/RNTupleReader.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleReader.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleReader.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2024-02-20 diff --git a/tree/ntuple/inc/ROOT/RNTupleSerialize.hxx b/tree/ntuple/inc/ROOT/RNTupleSerialize.hxx index 9e9f757e07dab..0f80b0e8c170d 100644 --- a/tree/ntuple/inc/ROOT/RNTupleSerialize.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleSerialize.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleSerialize.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \author Javier Lopez-Gomez /// \date 2021-08-02 diff --git a/tree/ntuple/inc/ROOT/RNTupleTypes.hxx b/tree/ntuple/inc/ROOT/RNTupleTypes.hxx index 9692a542cb017..70a0ade486291 100644 --- a/tree/ntuple/inc/ROOT/RNTupleTypes.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleTypes.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleTypes.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-04 diff --git a/tree/ntuple/inc/ROOT/RNTupleUtils.hxx b/tree/ntuple/inc/ROOT/RNTupleUtils.hxx index fc9f17f04a4ab..4d6b2fb60a590 100644 --- a/tree/ntuple/inc/ROOT/RNTupleUtils.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleUtils.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleUtils.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2025-07-31 diff --git a/tree/ntuple/inc/ROOT/RNTupleView.hxx b/tree/ntuple/inc/ROOT/RNTupleView.hxx index 3052b0e4b2f43..7dcf187e6f3c7 100644 --- a/tree/ntuple/inc/ROOT/RNTupleView.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleView.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleView.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-05 diff --git a/tree/ntuple/inc/ROOT/RNTupleWriteOptions.hxx b/tree/ntuple/inc/ROOT/RNTupleWriteOptions.hxx index b713e58e4a26e..aeb00fd8f90ac 100644 --- a/tree/ntuple/inc/ROOT/RNTupleWriteOptions.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleWriteOptions.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleWriteOptions.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2024-02-22 diff --git a/tree/ntuple/inc/ROOT/RNTupleWriteOptionsDaos.hxx b/tree/ntuple/inc/ROOT/RNTupleWriteOptionsDaos.hxx index f6d537da45ada..9bf245e4f458a 100644 --- a/tree/ntuple/inc/ROOT/RNTupleWriteOptionsDaos.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleWriteOptionsDaos.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleWriteOptionsDaos.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2024-02-22 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/inc/ROOT/RNTupleWriter.hxx b/tree/ntuple/inc/ROOT/RNTupleWriter.hxx index ef6098d5f3e31..fef31b7304684 100644 --- a/tree/ntuple/inc/ROOT/RNTupleWriter.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleWriter.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleWriter.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2024-02-20 diff --git a/tree/ntuple/inc/ROOT/RNTupleZip.hxx b/tree/ntuple/inc/ROOT/RNTupleZip.hxx index 7bbb3d0623987..a613f30bb46c8 100644 --- a/tree/ntuple/inc/ROOT/RNTupleZip.hxx +++ b/tree/ntuple/inc/ROOT/RNTupleZip.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleZip.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2019-11-21 diff --git a/tree/ntuple/inc/ROOT/RPage.hxx b/tree/ntuple/inc/ROOT/RPage.hxx index ed8ca19ca855b..1c45836312ac0 100644 --- a/tree/ntuple/inc/ROOT/RPage.hxx +++ b/tree/ntuple/inc/ROOT/RPage.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RPage.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-09 diff --git a/tree/ntuple/inc/ROOT/RPageAllocator.hxx b/tree/ntuple/inc/ROOT/RPageAllocator.hxx index 660c8a9c9d12c..59f49f83034ce 100644 --- a/tree/ntuple/inc/ROOT/RPageAllocator.hxx +++ b/tree/ntuple/inc/ROOT/RPageAllocator.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RPageAllocator.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2019-06-25 diff --git a/tree/ntuple/inc/ROOT/RPageNullSink.hxx b/tree/ntuple/inc/ROOT/RPageNullSink.hxx index e2bfe60e3402d..e46951cb3fb80 100644 --- a/tree/ntuple/inc/ROOT/RPageNullSink.hxx +++ b/tree/ntuple/inc/ROOT/RPageNullSink.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RPageNullSink.hxx -/// \ingroup NTuple /// \author Jonas Hahnfeld /// \date 2024-01-31 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/inc/ROOT/RPagePool.hxx b/tree/ntuple/inc/ROOT/RPagePool.hxx index 7ea00aae106bd..64b66aa2df4a4 100644 --- a/tree/ntuple/inc/ROOT/RPagePool.hxx +++ b/tree/ntuple/inc/ROOT/RPagePool.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RPagePool.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-09 diff --git a/tree/ntuple/inc/ROOT/RPageSinkBuf.hxx b/tree/ntuple/inc/ROOT/RPageSinkBuf.hxx index 43ea4ccac05e2..8cda1d843c71e 100644 --- a/tree/ntuple/inc/ROOT/RPageSinkBuf.hxx +++ b/tree/ntuple/inc/ROOT/RPageSinkBuf.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RPageSinkBuf.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \author Max Orok /// \author Javier Lopez-Gomez diff --git a/tree/ntuple/inc/ROOT/RPageStorage.hxx b/tree/ntuple/inc/ROOT/RPageStorage.hxx index a7c0441e3597e..3385244ad3262 100644 --- a/tree/ntuple/inc/ROOT/RPageStorage.hxx +++ b/tree/ntuple/inc/ROOT/RPageStorage.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RPageStorage.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-07-19 diff --git a/tree/ntuple/inc/ROOT/RPageStorageDaos.hxx b/tree/ntuple/inc/ROOT/RPageStorageDaos.hxx index 64b37e0fdd275..e58dc09dd8039 100644 --- a/tree/ntuple/inc/ROOT/RPageStorageDaos.hxx +++ b/tree/ntuple/inc/ROOT/RPageStorageDaos.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RPageStorageDaos.hxx -/// \ingroup NTuple /// \author Javier Lopez-Gomez /// \date 2020-11-03 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/inc/ROOT/RPageStorageFile.hxx b/tree/ntuple/inc/ROOT/RPageStorageFile.hxx index 578ab47a06a0b..44cb68be8fc74 100644 --- a/tree/ntuple/inc/ROOT/RPageStorageFile.hxx +++ b/tree/ntuple/inc/ROOT/RPageStorageFile.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RPageStorageFile.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2019-11-21 diff --git a/tree/ntuple/inc/ROOT/RRawPtrWriteEntry.hxx b/tree/ntuple/inc/ROOT/RRawPtrWriteEntry.hxx index d8d8dce7fa037..5590c82cd3da2 100644 --- a/tree/ntuple/inc/ROOT/RRawPtrWriteEntry.hxx +++ b/tree/ntuple/inc/ROOT/RRawPtrWriteEntry.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RRawPtrWriteEntry.hxx -/// \ingroup NTuple /// \author Jonas Hahnfeld /// \date 2025-03-19 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/src/RCluster.cxx b/tree/ntuple/src/RCluster.cxx index b9e0b479653b9..9cb2457121ff7 100644 --- a/tree/ntuple/src/RCluster.cxx +++ b/tree/ntuple/src/RCluster.cxx @@ -1,5 +1,4 @@ /// \file RCluster.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2020-03-11 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/src/RClusterPool.cxx b/tree/ntuple/src/RClusterPool.cxx index 2eeb4f4868eea..ff1f88b67e8c9 100644 --- a/tree/ntuple/src/RClusterPool.cxx +++ b/tree/ntuple/src/RClusterPool.cxx @@ -1,5 +1,4 @@ /// \file RClusterPool.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2020-03-11 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/src/RColumn.cxx b/tree/ntuple/src/RColumn.cxx index dd777c438fd66..ce964e4c8f992 100644 --- a/tree/ntuple/src/RColumn.cxx +++ b/tree/ntuple/src/RColumn.cxx @@ -1,5 +1,4 @@ /// \file RColumn.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-04 diff --git a/tree/ntuple/src/RColumnElement.cxx b/tree/ntuple/src/RColumnElement.cxx index fbba02d5ed681..d9142845fc986 100644 --- a/tree/ntuple/src/RColumnElement.cxx +++ b/tree/ntuple/src/RColumnElement.cxx @@ -1,5 +1,4 @@ /// \file RColumnElement.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2019-08-11 diff --git a/tree/ntuple/src/RDaos.cxx b/tree/ntuple/src/RDaos.cxx index aada7f9ec6204..4a7ac4ba2d50c 100644 --- a/tree/ntuple/src/RDaos.cxx +++ b/tree/ntuple/src/RDaos.cxx @@ -1,5 +1,4 @@ /// \file RDaos.cxx -/// \ingroup NTuple /// \author Javier Lopez-Gomez /// \date 2020-11-14 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/src/RField.cxx b/tree/ntuple/src/RField.cxx index dc41bd91023de..e994b3851b073 100644 --- a/tree/ntuple/src/RField.cxx +++ b/tree/ntuple/src/RField.cxx @@ -1,5 +1,4 @@ /// \file RField.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-15 diff --git a/tree/ntuple/src/RFieldBase.cxx b/tree/ntuple/src/RFieldBase.cxx index 0fd55c0183a67..8cd20cc69442b 100644 --- a/tree/ntuple/src/RFieldBase.cxx +++ b/tree/ntuple/src/RFieldBase.cxx @@ -1,5 +1,4 @@ /// \file RFieldBase.cxx -/// \ingroup NTuple /// \author Jonas Hahnfeld /// \date 2024-11-19 diff --git a/tree/ntuple/src/RFieldMeta.cxx b/tree/ntuple/src/RFieldMeta.cxx index 78d3d1aba7da7..2694e612c578c 100644 --- a/tree/ntuple/src/RFieldMeta.cxx +++ b/tree/ntuple/src/RFieldMeta.cxx @@ -1,5 +1,4 @@ /// \file RFieldMeta.cxx -/// \ingroup NTuple /// \author Jonas Hahnfeld /// \date 2024-11-19 diff --git a/tree/ntuple/src/RFieldSequenceContainer.cxx b/tree/ntuple/src/RFieldSequenceContainer.cxx index 9c96ee2990d03..de0e859ff920a 100644 --- a/tree/ntuple/src/RFieldSequenceContainer.cxx +++ b/tree/ntuple/src/RFieldSequenceContainer.cxx @@ -1,5 +1,4 @@ /// \file RFieldSequenceContainer.cxx -/// \ingroup NTuple /// \author Jonas Hahnfeld /// \date 2024-11-19 diff --git a/tree/ntuple/src/RFieldUtils.cxx b/tree/ntuple/src/RFieldUtils.cxx index 2ab0c9aded861..6420d43cc8c47 100644 --- a/tree/ntuple/src/RFieldUtils.cxx +++ b/tree/ntuple/src/RFieldUtils.cxx @@ -1,5 +1,4 @@ /// \file RFieldUtils.cxx -/// \ingroup NTuple /// \author Jonas Hahnfeld /// \date 2024-11-19 diff --git a/tree/ntuple/src/RFieldVisitor.cxx b/tree/ntuple/src/RFieldVisitor.cxx index 0fc0723ccf2e5..a6917bea5f7d5 100644 --- a/tree/ntuple/src/RFieldVisitor.cxx +++ b/tree/ntuple/src/RFieldVisitor.cxx @@ -1,5 +1,4 @@ /// \file RFieldVisitor.cxx -/// \ingroup NTuple /// \author Simon Leisibach /// \date 2019-06-11 diff --git a/tree/ntuple/src/RMiniFile.cxx b/tree/ntuple/src/RMiniFile.cxx index ce71ec7e203a6..35f28cb666b71 100644 --- a/tree/ntuple/src/RMiniFile.cxx +++ b/tree/ntuple/src/RMiniFile.cxx @@ -1,5 +1,4 @@ /// \file RMiniFile.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2019-12-22 diff --git a/tree/ntuple/src/RNTuple.cxx b/tree/ntuple/src/RNTuple.cxx index 0f9d30d626e09..9bcca6902a2be 100644 --- a/tree/ntuple/src/RNTuple.cxx +++ b/tree/ntuple/src/RNTuple.cxx @@ -1,5 +1,4 @@ /// \file RNTuple.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2023-09-19 diff --git a/tree/ntuple/src/RNTupleAttrReading.cxx b/tree/ntuple/src/RNTupleAttrReading.cxx index 533e942af0394..800586efa69e5 100644 --- a/tree/ntuple/src/RNTupleAttrReading.cxx +++ b/tree/ntuple/src/RNTupleAttrReading.cxx @@ -1,5 +1,4 @@ /// \file RNTupleAttrReading.cxx -/// \ingroup NTuple /// \author Giacomo Parolini /// \date 2026-04-01 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/src/RNTupleAttrWriting.cxx b/tree/ntuple/src/RNTupleAttrWriting.cxx index ed3fe69bbfb39..2bdebf3350ca2 100644 --- a/tree/ntuple/src/RNTupleAttrWriting.cxx +++ b/tree/ntuple/src/RNTupleAttrWriting.cxx @@ -1,5 +1,4 @@ /// \file RNTupleAttrWriting.cxx -/// \ingroup NTuple /// \author Giacomo Parolini /// \date 2026-01-27 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/src/RNTupleDescriptor.cxx b/tree/ntuple/src/RNTupleDescriptor.cxx index cd48ea0c9159a..b1e8407b86b68 100644 --- a/tree/ntuple/src/RNTupleDescriptor.cxx +++ b/tree/ntuple/src/RNTupleDescriptor.cxx @@ -1,5 +1,4 @@ /// \file RNTupleDescriptor.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \author Javier Lopez-Gomez /// \date 2018-10-04 diff --git a/tree/ntuple/src/RNTupleDescriptorFmt.cxx b/tree/ntuple/src/RNTupleDescriptorFmt.cxx index 355ef3c685f7c..db18b0265d3e3 100644 --- a/tree/ntuple/src/RNTupleDescriptorFmt.cxx +++ b/tree/ntuple/src/RNTupleDescriptorFmt.cxx @@ -1,5 +1,4 @@ /// \file RNTupleDescriptorFmt.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2019-08-25 diff --git a/tree/ntuple/src/RNTupleFillContext.cxx b/tree/ntuple/src/RNTupleFillContext.cxx index 825451f849ae5..03da350314b2b 100644 --- a/tree/ntuple/src/RNTupleFillContext.cxx +++ b/tree/ntuple/src/RNTupleFillContext.cxx @@ -1,5 +1,4 @@ /// \file RNTupleFillContext.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2024-02-22 diff --git a/tree/ntuple/src/RNTupleJoinTable.cxx b/tree/ntuple/src/RNTupleJoinTable.cxx index 7952faa2194d6..b8416c88156ab 100644 --- a/tree/ntuple/src/RNTupleJoinTable.cxx +++ b/tree/ntuple/src/RNTupleJoinTable.cxx @@ -1,5 +1,4 @@ /// \file RNTupleJoinTable.cxx -/// \ingroup NTuple /// \author Florine de Geus /// \date 2024-04-02 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/src/RNTupleMerger.cxx b/tree/ntuple/src/RNTupleMerger.cxx index 22d049339963c..6ff1ad0ac8679 100644 --- a/tree/ntuple/src/RNTupleMerger.cxx +++ b/tree/ntuple/src/RNTupleMerger.cxx @@ -1,5 +1,4 @@ /// \file RNTupleMerger.cxx -/// \ingroup NTuple /// \author Jakob Blomer , Max Orok , Alaettin Serhan Mete , /// Giacomo Parolini /// \date 2020-07-08 diff --git a/tree/ntuple/src/RNTupleMetrics.cxx b/tree/ntuple/src/RNTupleMetrics.cxx index 4cdfc842f45ad..c97146010f3a6 100644 --- a/tree/ntuple/src/RNTupleMetrics.cxx +++ b/tree/ntuple/src/RNTupleMetrics.cxx @@ -1,5 +1,4 @@ /// \file RNTupleMetrics.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2019-08-27 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/src/RNTupleModel.cxx b/tree/ntuple/src/RNTupleModel.cxx index e2fdeddd199fc..d326194e31af9 100644 --- a/tree/ntuple/src/RNTupleModel.cxx +++ b/tree/ntuple/src/RNTupleModel.cxx @@ -1,5 +1,4 @@ /// \file RNTupleModel.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-15 diff --git a/tree/ntuple/src/RNTupleParallelWriter.cxx b/tree/ntuple/src/RNTupleParallelWriter.cxx index f17afbe6b1c57..ce3ee96e3c557 100644 --- a/tree/ntuple/src/RNTupleParallelWriter.cxx +++ b/tree/ntuple/src/RNTupleParallelWriter.cxx @@ -1,5 +1,4 @@ /// \file RNTupleParallelWriter.cxx -/// \ingroup NTuple /// \author Jonas Hahnfeld /// \date 2024-02-01 diff --git a/tree/ntuple/src/RNTupleProcessor.cxx b/tree/ntuple/src/RNTupleProcessor.cxx index 03c9072dbf271..19f32e2cbc770 100644 --- a/tree/ntuple/src/RNTupleProcessor.cxx +++ b/tree/ntuple/src/RNTupleProcessor.cxx @@ -1,5 +1,4 @@ /// \file RNTupleProcessor.cxx -/// \ingroup NTuple /// \author Florine de Geus /// \date 2024-03-26 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/src/RNTupleReader.cxx b/tree/ntuple/src/RNTupleReader.cxx index 9dc174780146a..e26aaba93323b 100644 --- a/tree/ntuple/src/RNTupleReader.cxx +++ b/tree/ntuple/src/RNTupleReader.cxx @@ -1,5 +1,4 @@ /// \file RNTupleReader.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2024-02-20 diff --git a/tree/ntuple/src/RNTupleSerialize.cxx b/tree/ntuple/src/RNTupleSerialize.cxx index 5da2fa6a4f6b9..d0c3517781c4f 100644 --- a/tree/ntuple/src/RNTupleSerialize.cxx +++ b/tree/ntuple/src/RNTupleSerialize.cxx @@ -1,5 +1,4 @@ /// \file RNTupleSerialize.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \author Javier Lopez-Gomez /// \date 2021-08-02 diff --git a/tree/ntuple/src/RNTupleTypes.cxx b/tree/ntuple/src/RNTupleTypes.cxx index 1325e9ce702e6..363fcdf5e6655 100644 --- a/tree/ntuple/src/RNTupleTypes.cxx +++ b/tree/ntuple/src/RNTupleTypes.cxx @@ -1,5 +1,4 @@ /// \file RNTupleTypes.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2026-02-00 diff --git a/tree/ntuple/src/RNTupleUtils.cxx b/tree/ntuple/src/RNTupleUtils.cxx index 006ad8e7da4fc..f686bad5cf376 100644 --- a/tree/ntuple/src/RNTupleUtils.cxx +++ b/tree/ntuple/src/RNTupleUtils.cxx @@ -1,5 +1,4 @@ /// \file RNTupleUtils.cxx -/// \ingroup NTuple /// \author Jakob Blomer & Max Orok /// \date 2020-07-14 /// \author Vincenzo Eduardo Padulano, CERN diff --git a/tree/ntuple/src/RNTupleView.cxx b/tree/ntuple/src/RNTupleView.cxx index 3b51ceba0e262..8440b1dc94c07 100644 --- a/tree/ntuple/src/RNTupleView.cxx +++ b/tree/ntuple/src/RNTupleView.cxx @@ -1,5 +1,4 @@ /// \file RNTupleView.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2024-10-28 diff --git a/tree/ntuple/src/RNTupleWriteOptions.cxx b/tree/ntuple/src/RNTupleWriteOptions.cxx index d83f0eabfabe9..89cfb12e9a2e1 100644 --- a/tree/ntuple/src/RNTupleWriteOptions.cxx +++ b/tree/ntuple/src/RNTupleWriteOptions.cxx @@ -1,5 +1,4 @@ /// \file RNTupleWriteOptions.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2024-02-22 diff --git a/tree/ntuple/src/RNTupleWriter.cxx b/tree/ntuple/src/RNTupleWriter.cxx index fa0cbb48a569e..4f0cd2d57f0dc 100644 --- a/tree/ntuple/src/RNTupleWriter.cxx +++ b/tree/ntuple/src/RNTupleWriter.cxx @@ -1,5 +1,4 @@ /// \file RNTupleReader.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2024-02-20 diff --git a/tree/ntuple/src/RPage.cxx b/tree/ntuple/src/RPage.cxx index 5dd6baf9ac258..283cecdae3328 100644 --- a/tree/ntuple/src/RPage.cxx +++ b/tree/ntuple/src/RPage.cxx @@ -1,5 +1,4 @@ /// \file RPage.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-04 diff --git a/tree/ntuple/src/RPageAllocator.cxx b/tree/ntuple/src/RPageAllocator.cxx index adb634696d7c0..6e5d02e4e3316 100644 --- a/tree/ntuple/src/RPageAllocator.cxx +++ b/tree/ntuple/src/RPageAllocator.cxx @@ -1,5 +1,4 @@ /// \file RPageAllocator.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2019-06-25 diff --git a/tree/ntuple/src/RPagePool.cxx b/tree/ntuple/src/RPagePool.cxx index 5eaace3e6b0c7..ee6054b4cd54c 100644 --- a/tree/ntuple/src/RPagePool.cxx +++ b/tree/ntuple/src/RPagePool.cxx @@ -1,5 +1,4 @@ /// \file RPagePool.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-04 diff --git a/tree/ntuple/src/RPageSinkBuf.cxx b/tree/ntuple/src/RPageSinkBuf.cxx index 3d3f9c6896903..a4b715e99dcbf 100644 --- a/tree/ntuple/src/RPageSinkBuf.cxx +++ b/tree/ntuple/src/RPageSinkBuf.cxx @@ -1,5 +1,4 @@ /// \file RPageSinkBuf.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \author Max Orok /// \author Javier Lopez-Gomez diff --git a/tree/ntuple/src/RPageStorage.cxx b/tree/ntuple/src/RPageStorage.cxx index f5be9ec70af18..b1018152999d0 100644 --- a/tree/ntuple/src/RPageStorage.cxx +++ b/tree/ntuple/src/RPageStorage.cxx @@ -1,5 +1,4 @@ /// \file RPageStorage.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2018-10-04 diff --git a/tree/ntuple/src/RPageStorageDaos.cxx b/tree/ntuple/src/RPageStorageDaos.cxx index 29a0c423c2dbc..655529c3ab5fe 100644 --- a/tree/ntuple/src/RPageStorageDaos.cxx +++ b/tree/ntuple/src/RPageStorageDaos.cxx @@ -1,5 +1,4 @@ /// \file RPageStorageDaos.cxx -/// \ingroup NTuple /// \author Javier Lopez-Gomez /// \date 2020-11-03 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuple/src/RPageStorageFile.cxx b/tree/ntuple/src/RPageStorageFile.cxx index 6fb6d8ae99ac4..c3cb0d9320678 100644 --- a/tree/ntuple/src/RPageStorageFile.cxx +++ b/tree/ntuple/src/RPageStorageFile.cxx @@ -1,5 +1,4 @@ /// \file RPageStorageFile.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2019-11-25 diff --git a/tree/ntuple/src/libdaos_mock/libdaos_mock.cxx b/tree/ntuple/src/libdaos_mock/libdaos_mock.cxx index 7e786c5fa0269..20d4ce5cf196b 100644 --- a/tree/ntuple/src/libdaos_mock/libdaos_mock.cxx +++ b/tree/ntuple/src/libdaos_mock/libdaos_mock.cxx @@ -1,5 +1,4 @@ /// \file libdaos_mock.cxx -/// \ingroup NTuple /// \author Javier Lopez-Gomez /// \date 2021-01-20 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuplebrowse/inc/ROOT/RNTupleBrowseUtils.hxx b/tree/ntuplebrowse/inc/ROOT/RNTupleBrowseUtils.hxx index 9a7db3c0557c9..0f8cdbb8cd69d 100644 --- a/tree/ntuplebrowse/inc/ROOT/RNTupleBrowseUtils.hxx +++ b/tree/ntuplebrowse/inc/ROOT/RNTupleBrowseUtils.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleClassicBrowse.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2025-07-25 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuplebrowse/inc/ROOT/RNTupleClassicBrowse.hxx b/tree/ntuplebrowse/inc/ROOT/RNTupleClassicBrowse.hxx index b5aa0d4fd139b..1d138deb17db6 100644 --- a/tree/ntuplebrowse/inc/ROOT/RNTupleClassicBrowse.hxx +++ b/tree/ntuplebrowse/inc/ROOT/RNTupleClassicBrowse.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleClassicBrowse.hxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2025-06-60 diff --git a/tree/ntuplebrowse/inc/ROOT/RNTupleDrawVisitor.hxx b/tree/ntuplebrowse/inc/ROOT/RNTupleDrawVisitor.hxx index 7e4d5df56f1ee..f3fb00478bb35 100644 --- a/tree/ntuplebrowse/inc/ROOT/RNTupleDrawVisitor.hxx +++ b/tree/ntuplebrowse/inc/ROOT/RNTupleDrawVisitor.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleDrawVisitor.hxx -/// \ingroup NTuple /// \author Sergey Linev , Jakob Blomer /// \date 2025-07-24 diff --git a/tree/ntuplebrowse/inc/ROOT/RNTupleTreeMap.hxx b/tree/ntuplebrowse/inc/ROOT/RNTupleTreeMap.hxx index 561b300fa04e0..b30b0dc97ae68 100644 --- a/tree/ntuplebrowse/inc/ROOT/RNTupleTreeMap.hxx +++ b/tree/ntuplebrowse/inc/ROOT/RNTupleTreeMap.hxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleTreeMap.hxx -/// \ingroup NTuple /// \author Patryk Tymoteusz Pilichowski /// \date 2025-09-15 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/ntuplebrowse/src/RNTupleBrowseUtils.cxx b/tree/ntuplebrowse/src/RNTupleBrowseUtils.cxx index e3d4ebb72dc2c..106e8fdbcf91d 100644 --- a/tree/ntuplebrowse/src/RNTupleBrowseUtils.cxx +++ b/tree/ntuplebrowse/src/RNTupleBrowseUtils.cxx @@ -1,5 +1,4 @@ /// \file RNTupleBrowseUtils.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2025-07-25 diff --git a/tree/ntuplebrowse/src/RNTupleClassicBrowse.cxx b/tree/ntuplebrowse/src/RNTupleClassicBrowse.cxx index 184718076a4c8..ac2f0c9f11388 100644 --- a/tree/ntuplebrowse/src/RNTupleClassicBrowse.cxx +++ b/tree/ntuplebrowse/src/RNTupleClassicBrowse.cxx @@ -1,5 +1,4 @@ /// \file RNTupleClassicBrowse.cxx -/// \ingroup NTuple /// \author Jakob Blomer /// \date 2025-06-30 diff --git a/tree/ntuplebrowse/src/RNTupleDrawVisitor.cxx b/tree/ntuplebrowse/src/RNTupleDrawVisitor.cxx index 45e71126c3425..9f83fa5f99a6a 100644 --- a/tree/ntuplebrowse/src/RNTupleDrawVisitor.cxx +++ b/tree/ntuplebrowse/src/RNTupleDrawVisitor.cxx @@ -1,5 +1,4 @@ /// \file RNTupleDrawVisitor.cxx -/// \ingroup NTuple /// \author Sergey Linev , Jakob Blomer /// \date 2025-07-24 diff --git a/tree/ntuplebrowse/src/RNTupleTreeMap.cxx b/tree/ntuplebrowse/src/RNTupleTreeMap.cxx index dc8ea119817ac..9c575a1b951a7 100644 --- a/tree/ntuplebrowse/src/RNTupleTreeMap.cxx +++ b/tree/ntuplebrowse/src/RNTupleTreeMap.cxx @@ -1,5 +1,4 @@ /// \file ROOT/RNTupleTreeMap.cxx -/// \ingroup NTuple /// \author Patryk Tymoteusz Pilichowski /// \date 2025-09-15 /// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback diff --git a/tree/tree/inc/ROOT/InternalTreeUtils.hxx b/tree/tree/inc/ROOT/InternalTreeUtils.hxx index 7b62573b784cd..9196a5d996575 100644 --- a/tree/tree/inc/ROOT/InternalTreeUtils.hxx +++ b/tree/tree/inc/ROOT/InternalTreeUtils.hxx @@ -8,7 +8,6 @@ /** \file ROOT/InternalTreeUtils.hxx - \ingroup tree \author Enric Tejedor Saavedra \author Enrico Guiraud \author Vincenzo Eduardo Padulano diff --git a/tree/tree/inc/ROOT/RFriendInfo.hxx b/tree/tree/inc/ROOT/RFriendInfo.hxx index 7dfb6fef57bf1..6846f2cdd8a47 100644 --- a/tree/tree/inc/ROOT/RFriendInfo.hxx +++ b/tree/tree/inc/ROOT/RFriendInfo.hxx @@ -8,7 +8,6 @@ /** \file ROOT/RFriendInfo.hxx - \ingroup tree \author Ivan Kabadzhov \author Enrico Guiraud \author Vincenzo Eduardo Padulano diff --git a/tree/treeplayer/src/TTreePlayer.cxx b/tree/treeplayer/src/TTreePlayer.cxx index 4065337e4d956..587da14ec0694 100644 --- a/tree/treeplayer/src/TTreePlayer.cxx +++ b/tree/treeplayer/src/TTreePlayer.cxx @@ -10,7 +10,7 @@ *************************************************************************/ /** - * \defgroup treeplayer TTreePlayer + * \defgroup treeplayer TreePlayer * \ingroup tree * \brief It contains utilities to plot data stored in a TTree. * \note See also Tree package documentation