Skip to content

Commit 4fd3147

Browse files
authored
DPL Analysis: easy way to filter a table on the fly (#4929)
1 parent 176183c commit 4fd3147

3 files changed

Lines changed: 49 additions & 9 deletions

File tree

Analysis/Tutorials/src/associatedExample.cxx

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ struct BTask {
7575
struct TTask {
7676
using myCol = soa::Join<aod::Collisions, aod::CollisionsExtra>;
7777
expressions::Filter multfilter = aod::collision::mult > 10;
78-
void process(soa::Filtered<soa::Join<aod::Collisions, aod::CollisionsExtra>>::iterator const& col, aod::Tracks const& tracks)
78+
void process(soa::Filtered<myCol>::iterator const& col, aod::Tracks const& tracks)
7979
{
8080
LOGF(INFO, "[direct] ID: %d; %d == %d", col.globalIndex(), col.mult(), tracks.size());
8181
if (tracks.size() > 0) {
@@ -85,11 +85,41 @@ struct TTask {
8585
}
8686
};
8787

88+
struct ZTask {
89+
using myCol = soa::Join<aod::Collisions, aod::CollisionsExtra>;
90+
91+
void process(myCol const& collisions, aod::Tracks const& tracks)
92+
{
93+
auto multbin0_10 = collisions.select(aod::collision::mult >= 0 && aod::collision::mult < 10);
94+
auto multbin10_30 = collisions.select(aod::collision::mult >= 10 && aod::collision::mult < 30);
95+
auto multbin30_100 = collisions.select(aod::collision::mult >= 30 && aod::collision::mult < 100);
96+
97+
LOGF(INFO, "Bin 0-10");
98+
for (auto& col : multbin0_10) {
99+
auto groupedTracks = tracks.select(aod::track::collisionId == col.globalIndex());
100+
LOGF(INFO, "Collision %d; Ntrk = %d vs %d", col.globalIndex(), col.mult(), groupedTracks.size());
101+
}
102+
103+
LOGF(INFO, "Bin 10-30");
104+
for (auto& col : multbin10_30) {
105+
auto groupedTracks = tracks.select(aod::track::collisionId == col.globalIndex());
106+
LOGF(INFO, "Collision %d; Ntrk = %d vs %d", col.globalIndex(), col.mult(), groupedTracks.size());
107+
}
108+
109+
LOGF(INFO, "Bin 30-100");
110+
for (auto& col : multbin30_100) {
111+
auto groupedTracks = tracks.select(aod::track::collisionId == col.globalIndex());
112+
LOGF(INFO, "Collision %d; Ntrk = %d vs %d", col.globalIndex(), col.mult(), groupedTracks.size());
113+
}
114+
}
115+
};
116+
88117
WorkflowSpec defineDataProcessing(ConfigContext const&)
89118
{
90119
return WorkflowSpec{
91120
adaptAnalysisTask<ATask>("produce-etaphi"),
92121
adaptAnalysisTask<BTask>("consume-etaphi"),
93122
adaptAnalysisTask<MTask>("produce-mult"),
94-
adaptAnalysisTask<TTask>("consume-mult")};
123+
adaptAnalysisTask<TTask>("consume-mult"),
124+
adaptAnalysisTask<ZTask>("partition-mult")};
95125
}

Analysis/Tutorials/src/histogramsFullTracks.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ using namespace o2::framework;
1919
using namespace o2::framework::expressions;
2020

2121
struct ATask {
22-
OutputObj<TH2F> etaClsH{TH2F("eta_vs_cls", "eta_vs_cls", 102, -2.01, 2.01, 160, -0.5, 159.5)};
22+
OutputObj<TH2F> etaClsH{TH2F("eta_vs_cls", "#eta vs N_{cls}", 102, -2.01, 2.01, 160, -0.5, 159.5)};
2323

2424
void process(aod::FullTracks const& tracks)
2525
{

Framework/Core/include/Framework/ASoA.h

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,17 @@ static constexpr auto extractBindings(framework::pack<Is...>)
808808
return framework::pack<typename Is::binding_t...>{};
809809
}
810810

811+
template <typename T>
812+
class Filtered;
813+
814+
template <typename T>
815+
auto select(T const& t, framework::expressions::Filter&& f)
816+
{
817+
return Filtered<T>({t.asArrowTable()}, framework::expressions::createExpressionTree(
818+
framework::expressions::createOperations(f),
819+
t.asArrowTable()->schema()));
820+
}
821+
811822
/// A Table class which observes an arrow::Table and provides
812823
/// It is templated on a set of Column / DynamicColumn types.
813824
template <typename... C>
@@ -1000,6 +1011,11 @@ class Table
10001011
mBegin.bindExternalIndices(current...);
10011012
}
10021013

1014+
auto select(framework::expressions::Filter&& f) const
1015+
{
1016+
return o2::soa::select(*this, std::forward<framework::expressions::Filter>(f));
1017+
}
1018+
10031019
private:
10041020
template <typename T>
10051021
arrow::ChunkedArray* lookupColumn()
@@ -1762,12 +1778,6 @@ class Filtered<Filtered<T>> : public FilteredPolicy<typename T::table_t>
17621778
template <typename T>
17631779
using is_soa_filtered_t = typename framework::is_base_of_template<soa::FilteredPolicy, T>;
17641780

1765-
template <typename T>
1766-
auto filter(T&& t, framework::expressions::Filter const& expr)
1767-
{
1768-
return Filtered<T>(t.asArrowTable(), expr);
1769-
}
1770-
17711781
/// Template for building an index table to access matching rows from non-
17721782
/// joinable, but compatible tables, e.g. Collisions and ZDCs.
17731783
/// First argument is the key table (BCs for the Collisions+ZDCs case), the rest

0 commit comments

Comments
 (0)