diff --git a/Analysis/Tutorials/src/associatedExample.cxx b/Analysis/Tutorials/src/associatedExample.cxx index 19c171fb6fba7..a9f9ccf925747 100644 --- a/Analysis/Tutorials/src/associatedExample.cxx +++ b/Analysis/Tutorials/src/associatedExample.cxx @@ -98,6 +98,10 @@ struct ZTask { for (auto& col : multbin0_10) { auto groupedTracks = tracks.select(aod::track::collisionId == col.globalIndex()); LOGF(INFO, "Collision %d; Ntrk = %d vs %d", col.globalIndex(), col.mult(), groupedTracks.size()); + if (groupedTracks.size() > 0) { + auto track = groupedTracks.begin(); + LOGF(INFO, "Track 0 belongs to collision %d at Z = %f", track.collisionId(), track.collision_as().posZ()); + } } LOGF(INFO, "Bin 10-30"); diff --git a/Framework/Core/include/Framework/ASoA.h b/Framework/Core/include/Framework/ASoA.h index 5262f42247f05..e57c7a08eaec8 100644 --- a/Framework/Core/include/Framework/ASoA.h +++ b/Framework/Core/include/Framework/ASoA.h @@ -742,12 +742,40 @@ struct RowViewCore : public IP, C... { (CL::setCurrent(current), ...); } + template + auto getCurrent() const + { + return CL::getCurrentRaw(); + } + + template + auto getIndexBindingsImpl(framework::pack) const + { + return std::vector{static_cast(*this).getCurrentRaw()...}; + } + + auto getIndexBindings() const + { + return getIndexBindingsImpl(external_index_columns_t{}); + } + template void bindExternalIndices(TA*... current) { (doSetCurrentIndex(external_index_columns_t{}, current), ...); } + template + void doSetCurrentIndexRaw(framework::pack p, std::vector&& ptrs) + { + (Cs::setCurrentRaw(ptrs[framework::has_type_at_v(p)]), ...); + } + + void bindExternalIndicesRaw(std::vector&& ptrs) + { + doSetCurrentIndexRaw(external_index_columns_t{}, std::forward>(ptrs)); + } + private: /// Helper to move to the correct chunk, if needed. /// FIXME: not needed? @@ -848,6 +876,7 @@ class Table using columns = framework::pack; using column_types = framework::pack; using persistent_columns_t = framework::selected_pack; + using external_index_columns_t = framework::selected_pack; template struct RowViewBase : public RowViewCore { @@ -1030,9 +1059,28 @@ class Table mBegin.bindExternalIndices(current...); } + void bindExternalIndicesRaw(std::vector&& ptrs) + { + mBegin.bindExternalIndicesRaw(std::forward>(ptrs)); + } + + template + void doCopyIndexBindings(framework::pack, T& dest) const + { + dest.bindExternalIndicesRaw(mBegin.getIndexBindings()); + } + + template + void copyIndexBindings(T& dest) const + { + doCopyIndexBindings(external_index_columns_t{}, dest); + } + auto select(framework::expressions::Filter&& f) const { - return o2::soa::select(*this, std::forward(f)); + auto t = o2::soa::select(*this, std::forward(f)); + copyIndexBindings(t); + return t; } private: @@ -1300,7 +1348,14 @@ constexpr auto is_binding_compatible_v() } \ return false; \ } \ - binding_t* getCurrent() { return static_cast(mBinding); } \ + \ + bool setCurrentRaw(void* current) \ + { \ + this->mBinding = current; \ + return true; \ + } \ + binding_t* getCurrent() const { return static_cast(mBinding); } \ + void* getCurrentRaw() const { return mBinding; } \ void* mBinding = nullptr; \ }; \ static const o2::framework::expressions::BindingNode _Getter_##Id { _Label_, \ @@ -1535,6 +1590,7 @@ class FilteredPolicy : public T using originals = originals_pack_t; using table_t = typename T::table_t; using persistent_columns_t = typename T::persistent_columns_t; + using external_index_columns_t = typename T::external_index_columns_t; template constexpr static auto make_it(framework::pack const&) @@ -1625,6 +1681,23 @@ class FilteredPolicy : public T mFilteredBegin.bindExternalIndices(current...); } + void bindExternalIndicesRaw(std::vector&& ptrs) + { + mFilteredBegin.bindExternalIndicesRaw(std::forward>(ptrs)); + } + + template + void doCopyIndexBindings(framework::pack, T1& dest) const + { + dest.bindExternalIndicesRaw(mFilteredBegin.getIndexBindings()); + } + + template + void copyIndexBindings(T1& dest) const + { + doCopyIndexBindings(external_index_columns_t{}, dest); + } + protected: void sumWithSelection(SelectionVector const& selection) {