2222#include " PWGDQ/Core/MCSignalLibrary.h"
2323#include " PWGDQ/Core/VarManager.h"
2424
25+ #include " Common/Core/trackUtilities.h"
26+ #include " Common/DataModel/CollisionAssociationTables.h"
27+
2528#include < Framework/ASoA.h>
2629#include < Framework/AnalysisDataModel.h>
2730#include < Framework/AnalysisHelpers.h>
@@ -41,9 +44,15 @@ using namespace o2::aod;
4144using MyEventsBasic = o2::soa::Join<o2::aod::ReducedEvents, o2::aod::ReducedEventsExtended>;
4245using MyBarrelTracks = o2::soa::Join<o2::aod::ReducedTracks, o2::aod::ReducedTracksBarrel, o2::aod::ReducedTracksBarrelCov, o2::aod::ReducedTracksBarrelPID>;
4346
47+ using MyEventsDirect = o2::soa::Join<aod::Collisions, aod::EvSels>;
48+ using MyTracksDirect = o2::soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksCov, aod::TracksDCA>;
49+
4450constexpr static uint32_t GkEventFillMap = VarManager::ObjTypes::ReducedEvent | VarManager::ObjTypes::ReducedEventExtended;
4551constexpr static uint32_t GkTrackFillMap = VarManager::ObjTypes::ReducedTrackBarrel | VarManager::ObjTypes::ReducedTrackBarrelCov;
4652
53+ constexpr static uint32_t GkEventDirectFillMap = VarManager::ObjTypes::Collision;
54+ constexpr static uint32_t GkTrackDirectFillMap = VarManager::ObjTypes::Track | VarManager::ObjTypes::TrackExtra | VarManager::ObjTypes::TrackCov | VarManager::ObjTypes::TrackDCA;
55+
4756struct GlobalTrackEstimator {
4857 Produces<o2::aod::ReducedEventsGlobalTrk> reducedEventsGlobalTrk;
4958 Produces<o2::aod::ReducedEventsMultAzimuth> reducedEventsMultAzimuth;
@@ -62,28 +71,77 @@ struct GlobalTrackEstimator {
6271 Configurable<bool > cfgRecalculateDCA{" cfgRecalculateDCA" , true , " Recalculate DCA vector with associations" };
6372
6473 o2::framework::Preslice<o2::aod::ReducedTracksAssoc> preslice = o2::aod::reducedtrack_association::reducedeventId;
74+ o2::framework::Preslice<o2::aod::TrackAssoc> presliceDirect = o2::aod::track_association::collisionId;
6575
6676 o2::framework::expressions::Filter trackFilter = (o2::aod::reducedtrack::pt >= cfgMinPt) && (nabs(o2::aod::reducedtrack::eta) <= cfgEtaRange) && (o2::aod::track::tpcChi2NCl <= cfgMaxChi2TPC) && (o2::aod::track::itsChi2NCl <= cfgMaxChi2ITS);
77+ o2::framework::expressions::Filter trackDirectFilter = (o2::aod::track::pt >= cfgMinPt) && (nabs(o2::aod::track::eta) <= cfgEtaRange) && (o2::aod::track::tpcChi2NCl <= cfgMaxChi2TPC) && (o2::aod::track::itsChi2NCl <= cfgMaxChi2ITS);
6778
6879 void init (InitContext& context)
6980 {
70- LOGF (info, " Started global track counting" );
71-
72- bool isAnyProcessEnabled = context.mOptions .get <bool >(" processGlobalTracksSkimmed" ) || context.mOptions .get <bool >(" processGlobalTracksSkimmed" );
81+ bool isSkimmedEnabled = context.mOptions .get <bool >(" processGlobalTracksSkimmed" );
82+ bool isDirectEnabled = context.mOptions .get <bool >(" processGlobalTracksDirect" );
7383 bool isDummyEnabled = context.mOptions .get <bool >(" processDummy" );
7484
7585 if (isDummyEnabled) {
76- if (isAnyProcessEnabled ) {
77- LOG (fatal) << " You have enabled both the dummy process and at least one normal process function! Check your config! " ;
86+ if (isSkimmedEnabled || isDirectEnabled ) {
87+ LOG (fatal) << " You have enabled both the dummy process and at least one normal process function. " ;
7888 }
7989 return ;
8090 }
8191
82- if (!isAnyProcessEnabled) {
92+ if (!isSkimmedEnabled && !isDirectEnabled && !isDummyEnabled) {
93+ LOG (fatal) << " No process function activated." ;
94+ return ;
95+ }
96+
97+ if (isSkimmedEnabled && isDirectEnabled) {
98+ LOG (fatal) << " Process functions for skimmed data model and direct data model can not run simultaneously." ;
8399 return ;
84100 }
85101 }
86102
103+ template <uint32_t fillMap, typename T, typename C>
104+ bool isTrackSelected (T& track, C const & event)
105+ {
106+ VarManager::ResetValues (VarManager::kNBarrelTrackVariables , VarManager::kNBarrelTrackVariables );
107+ VarManager::FillTrack<fillMap>(track);
108+
109+ if (cfgRecalculateDCA) {
110+ VarManager::FillTrackCollision<fillMap>(track, event);
111+ }
112+
113+ const int nFindable = track.tpcNClsFindable ();
114+ const int nCrossedRows = track.tpcNClsCrossedRows ();
115+
116+ if (nCrossedRows < static_cast <int >(cfgMinTPCCluster.value )) {
117+ return false ;
118+ }
119+
120+ if (nFindable <= 0 ) {
121+ return false ;
122+ }
123+
124+ const float crossedOverFindable = static_cast <float >(nCrossedRows) / static_cast <float >(nFindable);
125+
126+ if (crossedOverFindable < cfgRatioTPCClusterOverFindableCluster.value ) {
127+ return false ;
128+ }
129+
130+ if (cfgRequireITSibAny.value && ((track.itsClusterMap () & 0x7 ) == 0 )) {
131+ return false ;
132+ }
133+
134+ if (std::abs (VarManager::fgValues[VarManager::kTrackDCAz ]) > cfgMaxDCAz.value ) {
135+ return false ;
136+ }
137+
138+ if (std::abs (VarManager::fgValues[VarManager::kTrackDCAxy ]) > cfgShiftDCAxy + cfgPtMagnitudeDCAxy / pow (track.pt (), cfgExponentDCAxy)) {
139+ return false ;
140+ }
141+
142+ return true ;
143+ }
144+
87145 void processGlobalTracksSkimmed (MyEventsBasic const & events, o2::aod::ReducedTracksAssoc const & assocs, o2::soa::Filtered<MyBarrelTracks> const & tracks)
88146 {
89147 std::unordered_set<int64_t > selectedTrackIds;
@@ -108,38 +166,44 @@ struct GlobalTrackEstimator {
108166
109167 auto track = assoc.template reducedtrack_as <o2::soa::Filtered<MyBarrelTracks>>();
110168
111- VarManager::FillTrack<GkTrackFillMap>(track);
112-
113- if (cfgRecalculateDCA) {
114- VarManager::FillTrackCollision<GkTrackFillMap>(track, event);
169+ if (!isTrackSelected<GkTrackFillMap>(track, event)) {
170+ continue ;
115171 }
116172
117- const int nFindable = track. tpcNClsFindable () ;
118- const int nCrossedRows = track. tpcNClsCrossedRows ();
173+ ++nTrkGlobal ;
174+ }
119175
120- if (nCrossedRows < static_cast < int >(cfgMinTPCCluster. value )) {
121- continue ;
122- }
176+ reducedEventsGlobalTrk (nTrkGlobal);
177+ }
178+ }
123179
124- if (nFindable <= 0 ) {
125- continue ;
126- }
180+ PROCESS_SWITCH (GlobalTrackEstimator, processGlobalTracksSkimmed, " Count global tracks from skimmed data model" , false );
127181
128- const float crossedOverFindable = static_cast <float >(nCrossedRows) / static_cast <float >(nFindable);
182+ void processGlobalTracksDirect (MyEventsDirect const & events, TrackAssoc const & assocs, o2::soa::Filtered<MyTracksDirect> const & tracks)
183+ {
184+ std::unordered_set<int64_t > selectedTrackIds;
185+ selectedTrackIds.reserve (tracks.size ());
129186
130- if (crossedOverFindable < cfgRatioTPCClusterOverFindableCluster. value ) {
131- continue ;
132- }
187+ for ( auto const & track : tracks ) {
188+ selectedTrackIds. insert (track. globalIndex ()) ;
189+ }
133190
134- if (cfgRequireITSibAny.value && ((track.itsClusterMap () & 0x7 ) == 0 )) {
135- continue ;
136- }
191+ for (const auto & event : events) {
192+ VarManager::ResetValues (0 , VarManager::kNBarrelTrackVariables );
193+ VarManager::FillEvent<GkEventDirectFillMap>(event);
194+
195+ auto groupedAssocs = assocs.sliceBy (presliceDirect, event.globalIndex ());
196+
197+ int nTrkGlobal = 0 ;
137198
138- if (std::abs (VarManager::fgValues[VarManager::kTrackDCAz ]) > cfgMaxDCAz.value ) {
199+ for (auto const & assoc : groupedAssocs) {
200+ if (selectedTrackIds.find (assoc.trackId ()) == selectedTrackIds.end ()) {
139201 continue ;
140202 }
141203
142- if (std::abs (VarManager::fgValues[VarManager::kTrackDCAxy ]) > cfgShiftDCAxy + cfgPtMagnitudeDCAxy / pow (track.pt (), cfgExponentDCAxy)) {
204+ auto track = assoc.template track_as <o2::soa::Filtered<MyTracksDirect>>();
205+
206+ if (!isTrackSelected<GkTrackDirectFillMap>(track, event)) {
143207 continue ;
144208 }
145209
@@ -150,7 +214,7 @@ struct GlobalTrackEstimator {
150214 }
151215 }
152216
153- PROCESS_SWITCH (GlobalTrackEstimator, processGlobalTracksSkimmed , " Count global tracks from skimmed data model " , false );
217+ PROCESS_SWITCH (GlobalTrackEstimator, processGlobalTracksDirect , " Count global tracks from unskimmed data" , false );
154218
155219 void processDummy (MyEventsBasic const &)
156220 {
0 commit comments