diff --git a/Analysis/Tutorials/src/associatedExample.cxx b/Analysis/Tutorials/src/associatedExample.cxx index 1219a56b55526..c767456c7a042 100644 --- a/Analysis/Tutorials/src/associatedExample.cxx +++ b/Analysis/Tutorials/src/associatedExample.cxx @@ -23,6 +23,14 @@ DECLARE_SOA_TABLE(EtaPhi, "AOD", "ETAPHI", etaphi::Eta, etaphi::Phi); DECLARE_SOA_TABLE(EtaPhiPt, "AOD", "ETAPHIPT", etaphi::Eta, etaphi::Phi, etaphi::Pt); + +namespace collision +{ +DECLARE_SOA_COLUMN(Mult, mult, int32_t); +} // namespace collision + +DECLARE_SOA_TABLE(CollisionsExtra, "AOD", "COLEXTRA", + collision::Mult); } // namespace o2::aod using namespace o2; @@ -48,11 +56,20 @@ struct ATask { } }; +struct MTask { + Produces colextra; + + void process(aod::Collision const& collision, aod::Tracks const& tracks) + { + colextra(tracks.size()); + } +}; + struct BTask { void process(aod::Collision const& collision, soa::Join const& extTracks) { - // LOG(INFO) << "TF: " << collision.timeframeID() << std::endl; - LOG(INFO) << "Rows: " << extTracks.asArrowTable()->num_rows() << std::endl; + LOGF(INFO, "ID: %d", collision.globalIndex()); + LOGF(INFO, "Tracks: %d", extTracks.size()); for (auto& track : extTracks) { LOGF(INFO, "(%f, %f) - (%f, %f)", track.eta(), track.phi(), track.etas(), track.phis()); } @@ -62,8 +79,15 @@ struct BTask { struct CTask { void process(aod::Collision const& collision, soa::Concat const& concatenated) { - // LOG(INFO) << "TF: " << collision.timeframeID() << std::endl; - LOG(INFO) << "Rows: " << concatenated.asArrowTable()->num_rows() << std::endl; + LOGF(INFO, "ID: %d", collision.globalIndex()); + LOGF(INFO, "Tracks: %d", concatenated.size()); + } +}; + +struct TTask { + void process(soa::Join::iterator const& col, aod::Tracks const& tracks) + { + LOGF(INFO, "ID: %d; %d == %d", col.globalIndex(), col.mult(), tracks.size()); } }; @@ -72,5 +96,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const&) return WorkflowSpec{ adaptAnalysisTask("produce-etaphi"), adaptAnalysisTask("consume-etaphi"), - adaptAnalysisTask("consume-etaphi-twice")}; + adaptAnalysisTask("consume-etaphi-twice"), + adaptAnalysisTask("produce-mult"), + adaptAnalysisTask("consume-mult")}; } diff --git a/Framework/Core/include/Framework/AnalysisTask.h b/Framework/Core/include/Framework/AnalysisTask.h index 3a010da149b2e..07abe4857b6a6 100644 --- a/Framework/Core/include/Framework/AnalysisTask.h +++ b/Framework/Core/include/Framework/AnalysisTask.h @@ -489,7 +489,13 @@ struct AnalysisDataProcessorBuilder { constexpr bool isIndexTo() { if constexpr (soa::is_type_with_binding_v) { - return std::is_same_v; + if constexpr (soa::is_type_with_originals_v>) { + using TT = typename framework::pack_element_t<0, typename std::decay_t::originals>; + return std::is_same_v; + } else { + using TT = std::decay_t; + return std::is_same_v; + } } return false; } @@ -601,7 +607,7 @@ struct AnalysisDataProcessorBuilder { static_assert(((soa::is_soa_iterator_t>::value == false) && ...), "Associated arguments of process() should not be iterators"); auto associatedTables = AnalysisDataProcessorBuilder::bindAssociatedTables(inputs, &C::process, infos); - if constexpr (soa::is_soa_iterator_t::value) { + if constexpr (soa::is_soa_iterator_t>::value) { // grouping case (groupingTable.bindExternalIndices(&std::get>(associatedTables)), ...); auto slicer = GroupSlicer(groupingTable, associatedTables);