99// granted to it by virtue of its status as an Intergovernmental Organization
1010// or submit itself to any jurisdiction.
1111
12- // / \file jetmatchinghf.cxx
13- // / \brief Match jets containing the same D0s
12+ // / \file jetmatching.cxx
13+ // / \brief Unified implementation of jet matching based on different criteria
14+ // / expanding on previously separate implementations of geometric matching
15+ // / (by Raymond Ehlers) and heavy-flavour matching
1416// /
17+ // / \author Raymond Ehlers <raymond.ehlers@cern.ch>, ORNL
1518// / \author Jochen Klein <jochen.klein@cern.ch>
1619
1720#include " Framework/AnalysisTask.h"
@@ -39,8 +42,9 @@ struct JetMatchingHF {
3942 Produces<TagToBaseMatchingTable> jetsTagToBase;
4043
4144 // preslicing jet collections, only for MC-based collection
42- // Preslice<BaseJetCollection> baseJetsPerCollision = aod::jet::mcCollisionId;
43- Preslice<TagJetCollection> tagJetsPerCollision = aod::jet::mcCollisionId;
45+
46+ Preslice<BaseJetCollection> baseJetsPerCollision = []{ if constexpr (o2::soa::relatedByIndex<aod::McCollisions, BaseJetCollection>()) return aod::jet::mcCollisionId; else return aod::jet::collisionId; }();
47+ Preslice<TagJetCollection> tagJetsPerCollision = []{ if constexpr (o2::soa::relatedByIndex<aod::McCollisions, TagJetCollection>()) return aod::jet::mcCollisionId; else return aod::jet::collisionId; }();
4448
4549 using Collisions = soa::Join<aod::Collisions, aod::McCollisionLabels>;
4650 using Tracks = soa::Join<aod::Tracks, aod::McTrackLabels>;
@@ -55,25 +59,19 @@ struct JetMatchingHF {
5559 Tracks const & tracks, McParticles const & particlesMC,
5660 HfCandidates const & hfcandidates)
5761 {
58- // slicing base jets, only for MC-based collection
59- auto jetsBasePerColl = jetsBase;
60- constexpr bool jetsBaseIsMC = o2::soa::is_binding_compatible_v<BaseJetCollection, std::decay_t <aod::McCollisions>>();
61- if constexpr (jetsBaseIsMC) {
62- LOGF (info, " slicing base jet collection by MC collision" );
63- } else {
64- LOGF (info, " not slicing base jet collection by MC collision" );
65- }
66- // jetsBasePerColl = jetsBase.sliceBy(baseJetsPerCollision, collision.mcCollisionId());
62+ constexpr bool jetsBaseIsMC = o2::soa::relatedByIndex<aod::McCollisions, BaseJetCollection>();
63+ constexpr bool jetsTagIsMC = o2::soa::relatedByIndex<aod::McCollisions, TagJetCollection>();
6764
68- // slicing tag jets, only for MC-based collection
69- constexpr bool jetsTagIsMC = o2::soa::is_binding_compatible_v<TagJetCollection, std::decay_t <aod::McCollisions>>();
65+ // slicing jets if MC collection
7066 // decltype(jetsTag.sliceBy(tagJetsPerCollision, collision.mcCollisionId())) jetsTagPerColl;
71- if (jetsTagIsMC) {
72- LOGF (info, " slicing tag jet collection by MC collision" );
73- } else {
74- LOGF (info, " not slicing tag jet collection by MC collision" );
75- }
76- const auto jetsTagPerColl = jetsTag.sliceBy (tagJetsPerCollision, collision.mcCollisionId ());
67+ // std::remove_const<TagJetCollection>::type jetsTagPerColl;
68+ // const auto jetsTagPerColl = jetsTag;
69+ // auto jetsTagPerColl = [&] -> TagJetCollection const& { if (jetsTagIsMC) return jetsTag.sliceBy(tagJetsPerCollision, collision.mcCollisionId()); else return jetsTag; }();
70+ // if (jetsTagIsMC) jetsTagPerColl = jetsTag.sliceBy(tagJetsPerCollision, collision.mcCollisionId());
71+ // const auto jetsTagPerColl = jetsTagIsMC ? const jetsTag.sliceBy(tagJetsPerCollision, collision.mcCollisionId()) : jetsTag;
72+
73+ const auto jetsBasePerColl = jetsBase.sliceBy (baseJetsPerCollision, jetsBaseIsMC ? collision.mcCollisionId () : collision.globalIndex ());
74+ const auto jetsTagPerColl = jetsTag.sliceBy (tagJetsPerCollision, jetsTagIsMC ? collision.mcCollisionId () : collision.globalIndex ());
7775
7876 // geometric matching
7977 std::vector<double > jetsBasePhi (jetsBase.size ());
0 commit comments