@@ -146,17 +146,22 @@ struct FilterTracks {
146146 Produces<aod::GenParticles> selectedGenParticles;
147147 Produces<aod::FilterColl> filterCollTable;
148148
149+ SliceCache cache;
149150 // Configurable<int> dummy{"dummy", 0, "dummy"};
150151 Configurable<float > minTrackPt{" minTrackPt" , 0.25 , " min track pt" };
151152 Configurable<float > trackDcaXyMax{" trackDcaXyMax" , 0.5 , " max track pt" };
152153 Configurable<int > trackPtSampling{" trackPtSampling" , 0 , " track sampling mode" };
153154 Configurable<float > trackPtWeightLowPt{" trackPtWeightLowPt" , 0 .01f , " trackPtWeightLowPt" };
154155 Configurable<float > trackPtWeightMidPt{" trackPtWeightMidPt" , 0 .10f , " trackPtWeightMidPt" };
156+ Configurable<float > collFilterFraction{" collFilterFraction" , 0 .05f , " collFilterFraction" };
155157
156158 Filter trackFilter = requireGlobalTrackWoDCAInFilter() && aod::track::pt > minTrackPt&& nabs(aod::track::dcaXY) < trackDcaXyMax;
159+ Filter collFilter = nabs(aod::collision::posZ * 10000 .f - nround(aod::collision::posZ * 10000 .f)) < collFilterFraction.node() * 2 .f;
157160 using CollisionsWithEvSel = soa::Join<aod::Collisions, aod::EvSels>;
158161 using TracksWithSelAndDca = soa::Join<aod::Tracks, aod::TracksCov, aod::TracksDCA, aod::TracksDCACov, aod::TracksExtra, aod::TrackSelection, aod::pidTPCFullPi, aod::pidTOFFullPi, aod::pidTPCFullKa, aod::pidTOFFullKa, aod::pidTPCFullPr, aod::pidTOFFullPr>;
159162 using TracksWithSelAndDcaMc = soa::Join<TracksWithSelAndDca, aod::McTrackLabels>;
163+ using FilterCollisionsWithEvSel = soa::Filtered<CollisionsWithEvSel>;
164+
160165 Partition<soa::Filtered<TracksWithSelAndDca>> lowPtTracks = aod::track::pt < 2 .f && (nabs(aod::track::pt * 10000 .f - nround(aod::track::pt * 10000 .f)) < trackPtWeightLowPt.node() * 2 .f);
161166 Partition<soa::Filtered<TracksWithSelAndDca>> midPtTracks = aod::track::pt > 2 .f && aod::track::pt < 5 .f && (nabs(aod::track::pt * 10000 .f - nround(aod::track::pt * 10000 .f)) < trackPtWeightMidPt.node() * 2 .f);
162167 Partition<soa::Filtered<TracksWithSelAndDca>> highPtTracks = aod::track::pt > 5 .f;
@@ -254,45 +259,53 @@ struct FilterTracks {
254259 filteredTracksMC (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
255260 }
256261 }
257- void processData (soa::Filtered<TracksWithSelAndDca> const & tracks)
262+ void processData (FilterCollisionsWithEvSel::iterator const & collision, soa::Filtered<TracksWithSelAndDca> const & tracks)
258263 {
264+ float zvtz = collision.posZ (); // dummy to silent compilation error about unused variable
259265 if (trackPtSampling == 0 ) {
260266 for (auto & track : tracks) {
261267 fillTableData (track);
262268 }
263269 } else {
264- for (auto & track : lowPtTracks) {
270+ auto lowPtTracksThisColl = lowPtTracks->sliceByCached (aod::track::collisionId, collision.globalIndex (), cache);
271+ for (auto & track : lowPtTracksThisColl) {
265272 fillTableData (track);
266273 }
267- for (auto & track : midPtTracks) {
274+ auto midPtTracksThisColl = midPtTracks->sliceByCached (aod::track::collisionId, collision.globalIndex (), cache);
275+ for (auto & track : midPtTracksThisColl) {
268276 fillTableData (track);
269277 }
270- for (auto & track : highPtTracks) {
278+ auto highPtTracksThisColl = highPtTracks->sliceByCached (aod::track::collisionId, collision.globalIndex (), cache);
279+ for (auto & track : highPtTracksThisColl) {
271280 fillTableData (track);
272281 }
273282 }
274283 }
275284 PROCESS_SWITCH (FilterTracks, processData, " process data" , true );
276- void processCollisions (CollisionsWithEvSel ::iterator const & collision)
285+ void processCollisions (FilterCollisionsWithEvSel ::iterator const & collision)
277286 {
278287 filterCollTable (collision.bcId (), collision.posX (), collision.posY (), collision.posZ (), collision.covXX (), collision.covXY (), collision.covYY (), collision.covXZ (), collision.covYZ (), collision.covZZ (), collision.flags (), collision.chi2 (), collision.numContrib (), collision.collisionTime (), collision.collisionTimeRes ());
279288 }
280289 PROCESS_SWITCH (FilterTracks, processCollisions, " process collisions" , true );
281290
282- void processMC (soa::Filtered<TracksWithSelAndDcaMc> const & tracks, aod::McParticles const & mcParticles)
291+ void processMC (FilterCollisionsWithEvSel::iterator const & collision, soa::Filtered<TracksWithSelAndDcaMc> const & tracks, aod::McParticles const & mcParticles)
283292 {
293+ float zvtz = collision.posZ (); // dummy to silent compilation error about unused variable
284294 if (trackPtSampling == 0 ) {
285295 for (auto & track : tracks) {
286296 fillTableDataMC (track, mcParticles);
287297 }
288298 } else {
289- for (auto & track : lowPtTracksMC) {
299+ auto lowPtTracksMCThisColl = lowPtTracksMC->sliceByCached (aod::track::collisionId, collision.globalIndex (), cache);
300+ for (auto & track : lowPtTracksMCThisColl) {
290301 fillTableDataMC (track, mcParticles);
291302 }
292- for (auto & track : midPtTracksMC) {
303+ auto midPtTracksMCThisColl = midPtTracksMC->sliceByCached (aod::track::collisionId, collision.globalIndex (), cache);
304+ for (auto & track : midPtTracksMCThisColl) {
293305 fillTableDataMC (track, mcParticles);
294306 }
295- for (auto & track : highPtTracksMC) {
307+ auto highPtTracksMCThisColl = highPtTracksMC->sliceByCached (aod::track::collisionId, collision.globalIndex (), cache);
308+ for (auto & track : highPtTracksMCThisColl) {
296309 fillTableDataMC (track, mcParticles);
297310 }
298311 }
0 commit comments