Creating new tables
In order to create new collections of objects, you need two things. First of all you need to define a data type for it, then you need to specify that your analysis task will create such an object. Notice that in a given workflow, only one task is allowed to create a given type of object.
Introducing a new data type
In order to define the data type you need to use DEFINE_SOA_COLUMN
and DEFINE_SOA_TABLE
helpers, defined in ASoA.h
. Assuming you want to extend the standard AOD format you will also need Framework/AnalysisDataModel.h
. For example, to define an extra table where to define phi and eta, you first need to define the two columns:
#include "Framework/ASoA.h"
#include "Framework/AnalysisDataModel.h"
namespace o2::aod {
namespace etaphi {
DECLARE_SOA_COLUMN(Eta, eta, float, "fEta");
DECLARE_SOA_COLUMN(Phi, phi, float, "fPhi");
}
}
and then you put them together in a table:
namespace o2::aod {
DECLARE_SOA_TABLE(EtaPhi, "AOD", "ETAPHI",
etaphi::Eta, etaphi::Phi);
}
Notice that tables are actually just a collections of columns.
Creating objects for a new data type
Once you have the new data type defined, you can have a task producing it, by using the Produces
helper:
struct MyTask : AnalysisTask {
Produces<o2::aod::EtaPhi> etaphi;
void process(o2::aod::Track const& track) {
etaphi(calculateEta(track), calculatePhi(track));
}
};
The etaphi
object is a functor that will effectively act as a cursor which allows to populate the EtaPhi
table. Each invocation of the functor will create a new row in the table, using the arguments as contents of the given column. By default the arguments must be given in order, but one can give them in any order by using the correct column type. E.g. in the example above:
etaphi(track::Phi(calculatePhi(track), track::Eta(calculateEta(track)));
See also tutorial Creating Tables.
Adding dynamic columns to a data type
Sometimes columns are not backed by actual persistent data, but they are merely
derived from it. For example you might want to have different representations
(e.g. spherical, cylindrical) for a given persistent representation. You can
do that by using the DECLARE_SOA_DYNAMIC_COLUMN
macro.
namespace point {
DECLARE_SOA_COLUMN(X, x, float, "fX");
DECLARE_SOA_COLUMN(Y, y, float, "fY");
}
DECLARE_SOA_DYNAMIC_COLUMN(R2, r2, [](float x, float y) { return x*x + y+y; });
DECLARE_SOA_TABLE(Point, "MISC", "POINT", X, Y, (R2<X,Y>));
Notice how the dynamic column is defined as a stand alone column and binds to X and Y only when you attach it as part of a table.
Expression columns
Creating new columns in a declarative way
Besides the Produces
helper, which allows you to create a new table which can be reused by others, there is another way to define a single column, via the Defines
helper.
struct MyTask : AnalysisTask {
Defines<track::Eta> eta = track::alpha;
};
- Description of expression columns
- Indices: declaration and usage
- Complete list of column and table declarations
See also tutorial Extending Tables.