1818#include " PWGCF/Femto/Core/closePairRejection.h"
1919#include " PWGCF/Femto/Core/collisionBuilder.h"
2020#include " PWGCF/Femto/Core/collisionHistManager.h"
21+ #include " PWGCF/Femto/Core/collisionTagger.h"
2122#include " PWGCF/Femto/Core/modes.h"
2223#include " PWGCF/Femto/Core/pairBuilder.h"
2324#include " PWGCF/Femto/Core/pairCleaner.h"
3334#include < Framework/AnalysisTask.h>
3435#include < Framework/BinningPolicy.h>
3536#include < Framework/Configurable.h>
37+ #include < Framework/DeviceSpec.h>
3638#include < Framework/Expressions.h>
3739#include < Framework/HistogramRegistry.h>
3840#include < Framework/HistogramSpec.h>
3941#include < Framework/InitContext.h>
4042#include < Framework/OutputObjHeader.h>
43+ #include < Framework/RunningWorkflowInfo.h>
4144#include < Framework/runDataProcessing.h>
4245
4346#include < map>
@@ -56,6 +59,10 @@ struct FemtoPairTrackCascade {
5659 using FilteredFemtoCollisionsWithLabel = o2::soa::Filtered<FemtoCollisionsWithLabel>;
5760 using FilteredFemtoCollisionWithLabel = FilteredFemtoCollisionsWithLabel::iterator;
5861
62+ // opt-in FColTags , only needed by processXiMixedEventWithTagging/processOmegaMixedEventWithTagging
63+ using FemtoCollisionsWithTags = o2::soa::Join<FemtoCollisions, o2::aod::FColTags>;
64+ using FilteredFemtoCollisionsWithTags = o2::soa::Filtered<FemtoCollisionsWithTags>;
65+
5966 using FemtoTracks = o2::soa::Join<o2::aod::FTracks, o2::aod::FTrackMasks>;
6067 using FemtoXis = o2::soa::Join<o2::aod::FXis, o2::aod::FXiMasks>;
6168 using FemtoOmegas = o2::soa::Join<o2::aod::FOmegas, o2::aod::FOmegaMasks>;
@@ -78,6 +85,11 @@ struct FemtoPairTrackCascade {
7885 o2::framework::expressions::Filter collisionFilter = MAKE_COLLISION_FILTER (collisionSelection);
7986 colhistmanager::ConfCollisionBinning confCollisionBinning;
8087
88+ // opt-in, only needed by processXiMixedEventWithTagging/processOmegaMixedEventWithTagging --
89+ // two separate instances since Xi and Omega are tagged independently (see init()).
90+ collisiontagger::ConfTagging<collisiontagger::role::TrackXiPair> confTaggingXi;
91+ collisiontagger::ConfTagging<collisiontagger::role::TrackOmegaPair> confTaggingOmega;
92+
8193 // setup tracks
8294 trackbuilder::ConfTrackSelection1 confTrackSelection;
8395 trackhistmanager::ConfTrackBinning1 confTrackBinning;
@@ -185,18 +197,43 @@ struct FemtoPairTrackCascade {
185197 closepairrejection::ConfCprTrackCascadeBachelor confCprBachelor;
186198 closepairrejection::ConfCprTrackV0Daughter confCprV0Daughter;
187199
188- void init (o2::framework::InitContext&)
200+ void init (o2::framework::InitContext& context )
189201 {
190- bool processData = doprocessXiSameEvent || doprocessXiMixedEvent || doprocessOmegaSameEvent || doprocessOmegaMixedEvent;
202+ bool processData = doprocessXiSameEvent || doprocessXiMixedEvent || doprocessOmegaSameEvent || doprocessOmegaMixedEvent || doprocessXiMixedEventWithTagging || doprocessOmegaMixedEventWithTagging ;
191203 bool processFitVars = doprocessXiSameEventWithFitVars || doprocessXiMixedEventWithFitVars || doprocessOmegaSameEventWithFitVars || doprocessOmegaMixedEventWithFitVars;
192204 bool processMc = doprocessXiSameEventMc || doprocessXiMixedEventMc || doprocessOmegaSameEventMc || doprocessOmegaMixedEventMc;
193205
194206 if (static_cast <int >(processData) + static_cast <int >(processFitVars) + static_cast <int >(processMc) > 1 ) {
195207 LOG (fatal) << " More than one of data, FitVars or mc processing is activated. Breaking..." ;
196208 }
197209
198- bool processXi = doprocessXiSameEvent || doprocessXiSameEventWithFitVars || doprocessXiSameEventMc || doprocessXiMixedEvent || doprocessXiMixedEventWithFitVars || doprocessXiMixedEventMc;
199- bool processOmega = doprocessOmegaSameEvent || doprocessOmegaSameEventWithFitVars || doprocessOmegaSameEventMc || doprocessOmegaMixedEvent || doprocessOmegaMixedEventWithFitVars || doprocessOmegaMixedEventMc;
210+ bool processXi = doprocessXiSameEvent || doprocessXiSameEventWithFitVars || doprocessXiSameEventMc || doprocessXiMixedEvent || doprocessXiMixedEventWithFitVars || doprocessXiMixedEventMc || doprocessXiMixedEventWithTagging;
211+ bool processOmega = doprocessOmegaSameEvent || doprocessOmegaSameEventWithFitVars || doprocessOmegaSameEventMc || doprocessOmegaMixedEvent || doprocessOmegaMixedEventWithFitVars || doprocessOmegaMixedEventMc || doprocessOmegaMixedEventWithTagging;
212+
213+ // Each species discovers its own tag bit independently (see Core/collisionTagger.h).
214+ if (doprocessXiMixedEventWithTagging || doprocessOmegaMixedEventWithTagging) {
215+ auto const & workflows = context.services ().get <o2::framework::RunningWorkflowInfo const >();
216+ auto const & ownDevice = context.services ().get <o2::framework::DeviceSpec const >();
217+ auto roles = collisiontagger::discoverTaggedRoles (workflows);
218+ if (doprocessXiMixedEventWithTagging) {
219+ int bit = collisiontagger::findOwnBit (roles, ownDevice.name , confTaggingXi.Role );
220+ if (bit < 0 ) {
221+ LOG (fatal) << " processXiMixedEventWithTagging is enabled, but no femto-collision-tagger device "
222+ << " (with processTrackCascade enabled) tagging this device (" << ownDevice.name << " ) was found in this workflow." ;
223+ }
224+ confTaggingXi.internalTagMask .value = static_cast <datatypes::CollisionTagType>(1 ) << bit;
225+ LOG (info) << " Collision tagger bit for " << ownDevice.name << " (Xi): " << bit;
226+ }
227+ if (doprocessOmegaMixedEventWithTagging) {
228+ int bit = collisiontagger::findOwnBit (roles, ownDevice.name , confTaggingOmega.Role );
229+ if (bit < 0 ) {
230+ LOG (fatal) << " processOmegaMixedEventWithTagging is enabled, but no femto-collision-tagger device "
231+ << " (with processTrackCascade enabled) tagging this device (" << ownDevice.name << " ) was found in this workflow." ;
232+ }
233+ confTaggingOmega.internalTagMask .value = static_cast <datatypes::CollisionTagType>(1 ) << bit;
234+ LOG (info) << " Collision tagger bit for " << ownDevice.name << " (Omega): " << bit;
235+ }
236+ }
200237
201238 if (processXi && processOmega) {
202239 LOG (fatal) << " Both xi-track and omega-track processing is enabled. Breaking..." ;
@@ -280,6 +317,17 @@ struct FemtoPairTrackCascade {
280317 }
281318 PROCESS_SWITCH (FemtoPairTrackCascade, processXiSameEventMc, " Enable processing same event processing for tracks and xis with mc information" , false );
282319
320+ // Opt-in counterpart of processXiMixedEvent() below -- same "Partition declared and bound
321+ // inside process()" idiom as femtoPairTrackTrack.cxx's processMixedEventWithTagging. Requires
322+ // a femto-collision-tagger device (processTrackCascade enabled) in the same workflow -- see init().
323+ void processXiMixedEventWithTagging (FilteredFemtoCollisionsWithTags const & cols, FemtoTracks const & tracks, FemtoXis const & /* xis*/ )
324+ {
325+ o2::framework::Partition<FilteredFemtoCollisionsWithTags> taggedCollisions = ncheckbit (o2::aod::femtocollisions::collisionTag, confTaggingXi.internalTagMask );
326+ taggedCollisions.bindTable (cols);
327+ pairTrackXiBuilder.processMixedEvent <modes::Mode::kMe_Reco >(taggedCollisions, tracks, trackPartition, xiPartition, cache, mixBinsVtxMult, mixBinsVtxCent, mixBinsVtxMultCent);
328+ }
329+ PROCESS_SWITCH (FemtoPairTrackCascade, processXiMixedEventWithTagging, " Enable processing mixed event processing for tracks and xis, pre-filtered using the collision tagger" , false );
330+
283331 void processXiMixedEvent (FilteredFemtoCollisions const & cols, FemtoTracks const & tracks, FemtoXis const & /* xis*/ )
284332 {
285333 pairTrackXiBuilder.processMixedEvent <modes::Mode::kMe_Reco >(cols, tracks, trackPartition, xiPartition, cache, mixBinsVtxMult, mixBinsVtxCent, mixBinsVtxMultCent);
@@ -316,6 +364,15 @@ struct FemtoPairTrackCascade {
316364 }
317365 PROCESS_SWITCH (FemtoPairTrackCascade, processOmegaSameEventMc, " Enable processing same event processing for tracks and omegas with mc information" , false );
318366
367+ // Opt-in counterpart of processOmegaMixedEvent() below -- same idiom as processXiMixedEventWithTagging above.
368+ void processOmegaMixedEventWithTagging (FilteredFemtoCollisionsWithTags const & cols, FemtoTracks const & tracks, FemtoOmegas const & /* omegas*/ )
369+ {
370+ o2::framework::Partition<FilteredFemtoCollisionsWithTags> taggedCollisions = ncheckbit (o2::aod::femtocollisions::collisionTag, confTaggingOmega.internalTagMask );
371+ taggedCollisions.bindTable (cols);
372+ pairTrackOmegaBuilder.processMixedEvent <modes::Mode::kMe_Reco >(taggedCollisions, tracks, trackPartition, omegaPartition, cache, mixBinsVtxMult, mixBinsVtxCent, mixBinsVtxMultCent);
373+ }
374+ PROCESS_SWITCH (FemtoPairTrackCascade, processOmegaMixedEventWithTagging, " Enable processing mixed event processing for tracks and omegas, pre-filtered using the collision tagger" , false );
375+
319376 void processOmegaMixedEvent (FilteredFemtoCollisions const & cols, FemtoTracks const & tracks, FemtoOmegas const & /* omegas*/ )
320377 {
321378 pairTrackOmegaBuilder.processMixedEvent <modes::Mode::kMe_Reco >(cols, tracks, trackPartition, omegaPartition, cache, mixBinsVtxMult, mixBinsVtxCent, mixBinsVtxMultCent);
0 commit comments