Skip to content

Commit 80a3d27

Browse files
authored
DPL Analysis: helper to transfer index bindings (#4990)
1 parent 7e7fea8 commit 80a3d27

File tree

2 files changed

+79
-2
lines changed

2 files changed

+79
-2
lines changed

Analysis/Tutorials/src/associatedExample.cxx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ struct ZTask {
9898
for (auto& col : multbin0_10) {
9999
auto groupedTracks = tracks.select(aod::track::collisionId == col.globalIndex());
100100
LOGF(INFO, "Collision %d; Ntrk = %d vs %d", col.globalIndex(), col.mult(), groupedTracks.size());
101+
if (groupedTracks.size() > 0) {
102+
auto track = groupedTracks.begin();
103+
LOGF(INFO, "Track 0 belongs to collision %d at Z = %f", track.collisionId(), track.collision_as<myCol>().posZ());
104+
}
101105
}
102106

103107
LOGF(INFO, "Bin 10-30");

Framework/Core/include/Framework/ASoA.h

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -742,12 +742,40 @@ struct RowViewCore : public IP, C... {
742742
(CL::setCurrent(current), ...);
743743
}
744744

745+
template <typename CL>
746+
auto getCurrent() const
747+
{
748+
return CL::getCurrentRaw();
749+
}
750+
751+
template <typename... Cs>
752+
auto getIndexBindingsImpl(framework::pack<Cs...>) const
753+
{
754+
return std::vector<void*>{static_cast<Cs const&>(*this).getCurrentRaw()...};
755+
}
756+
757+
auto getIndexBindings() const
758+
{
759+
return getIndexBindingsImpl(external_index_columns_t{});
760+
}
761+
745762
template <typename... TA>
746763
void bindExternalIndices(TA*... current)
747764
{
748765
(doSetCurrentIndex(external_index_columns_t{}, current), ...);
749766
}
750767

768+
template <typename... Cs>
769+
void doSetCurrentIndexRaw(framework::pack<Cs...> p, std::vector<void*>&& ptrs)
770+
{
771+
(Cs::setCurrentRaw(ptrs[framework::has_type_at_v<Cs>(p)]), ...);
772+
}
773+
774+
void bindExternalIndicesRaw(std::vector<void*>&& ptrs)
775+
{
776+
doSetCurrentIndexRaw(external_index_columns_t{}, std::forward<std::vector<void*>>(ptrs));
777+
}
778+
751779
private:
752780
/// Helper to move to the correct chunk, if needed.
753781
/// FIXME: not needed?
@@ -848,6 +876,7 @@ class Table
848876
using columns = framework::pack<C...>;
849877
using column_types = framework::pack<typename C::type...>;
850878
using persistent_columns_t = framework::selected_pack<is_persistent_t, C...>;
879+
using external_index_columns_t = framework::selected_pack<is_external_index_t, C...>;
851880

852881
template <typename IP, typename Parent, typename... T>
853882
struct RowViewBase : public RowViewCore<IP, C...> {
@@ -1030,9 +1059,28 @@ class Table
10301059
mBegin.bindExternalIndices(current...);
10311060
}
10321061

1062+
void bindExternalIndicesRaw(std::vector<void*>&& ptrs)
1063+
{
1064+
mBegin.bindExternalIndicesRaw(std::forward<std::vector<void*>>(ptrs));
1065+
}
1066+
1067+
template <typename T, typename... Cs>
1068+
void doCopyIndexBindings(framework::pack<Cs...>, T& dest) const
1069+
{
1070+
dest.bindExternalIndicesRaw(mBegin.getIndexBindings());
1071+
}
1072+
1073+
template <typename T>
1074+
void copyIndexBindings(T& dest) const
1075+
{
1076+
doCopyIndexBindings(external_index_columns_t{}, dest);
1077+
}
1078+
10331079
auto select(framework::expressions::Filter&& f) const
10341080
{
1035-
return o2::soa::select(*this, std::forward<framework::expressions::Filter>(f));
1081+
auto t = o2::soa::select(*this, std::forward<framework::expressions::Filter>(f));
1082+
copyIndexBindings(t);
1083+
return t;
10361084
}
10371085

10381086
private:
@@ -1300,7 +1348,14 @@ constexpr auto is_binding_compatible_v()
13001348
} \
13011349
return false; \
13021350
} \
1303-
binding_t* getCurrent() { return static_cast<binding_t*>(mBinding); } \
1351+
\
1352+
bool setCurrentRaw(void* current) \
1353+
{ \
1354+
this->mBinding = current; \
1355+
return true; \
1356+
} \
1357+
binding_t* getCurrent() const { return static_cast<binding_t*>(mBinding); } \
1358+
void* getCurrentRaw() const { return mBinding; } \
13041359
void* mBinding = nullptr; \
13051360
}; \
13061361
static const o2::framework::expressions::BindingNode _Getter_##Id { _Label_, \
@@ -1535,6 +1590,7 @@ class FilteredPolicy : public T
15351590
using originals = originals_pack_t<T>;
15361591
using table_t = typename T::table_t;
15371592
using persistent_columns_t = typename T::persistent_columns_t;
1593+
using external_index_columns_t = typename T::external_index_columns_t;
15381594

15391595
template <typename P, typename... Os>
15401596
constexpr static auto make_it(framework::pack<Os...> const&)
@@ -1625,6 +1681,23 @@ class FilteredPolicy : public T
16251681
mFilteredBegin.bindExternalIndices(current...);
16261682
}
16271683

1684+
void bindExternalIndicesRaw(std::vector<void*>&& ptrs)
1685+
{
1686+
mFilteredBegin.bindExternalIndicesRaw(std::forward<std::vector<void*>>(ptrs));
1687+
}
1688+
1689+
template <typename T1, typename... Cs>
1690+
void doCopyIndexBindings(framework::pack<Cs...>, T1& dest) const
1691+
{
1692+
dest.bindExternalIndicesRaw(mFilteredBegin.getIndexBindings());
1693+
}
1694+
1695+
template <typename T1>
1696+
void copyIndexBindings(T1& dest) const
1697+
{
1698+
doCopyIndexBindings(external_index_columns_t{}, dest);
1699+
}
1700+
16281701
protected:
16291702
void sumWithSelection(SelectionVector const& selection)
16301703
{

0 commit comments

Comments
 (0)