@@ -117,6 +117,14 @@ struct DerivedDataCreatorD0Calibration {
117117 std::string prefix = " ml" ;
118118 } cfgMl;
119119
120+ struct SelectedTrack {
121+ int globalIndex;
122+ o2::dataformats::DCA dca;
123+ o2::track::TrackParametrizationWithError<float > trackParCov;
124+ int pidPion;
125+ int pidKaon;
126+ };
127+
120128 using TracksWCovExtraPid = soa::Join<aod::Tracks, aod::TracksDCA, aod::TracksCov, aod::TracksExtra, aod::TrackSelection, aod::pidTPCFullPi, aod::pidTOFFullPi, aod::pidTPCFullKa, aod::pidTOFFullKa>;
121129 using TracksWCovExtraTmoPid = soa::Join<aod::Tracks, aod::TracksDCA, aod::TrackToTmo, aod::TracksCov, aod::TracksExtra, aod::TrackSelection, aod::pidTPCFullPi, aod::pidTOFFullPi, aod::pidTPCFullKa, aod::pidTOFFullKa>;
122130 using TracksWCovExtraTmoPidAndQa = soa::Join<aod::Tracks, aod::TracksDCA, aod::TrackToTmo, aod::TrackToTracksQA, aod::TracksCov, aod::TracksExtra, aod::TrackSelection, aod::pidTPCFullPi, aod::pidTOFFullPi, aod::pidTPCFullKa, aod::pidTOFFullKa>;
@@ -187,7 +195,7 @@ struct DerivedDataCreatorD0Calibration {
187195 template <bool withTrackQa, bool withTrackOcc, typename TTrackQa, typename TTracks, typename TTrackMeanOccs>
188196 void runDataCreation (CollisionsWEvSel const & collisions,
189197 aod::TrackAssoc const & trackIndices,
190- TTracks const &,
198+ TTracks const & tracks ,
191199 aod::BCsWithTimestamps const &,
192200 TTrackMeanOccs const &,
193201 TTrackQa const &)
@@ -227,87 +235,65 @@ struct DerivedDataCreatorD0Calibration {
227235 eventIR.setFromLong (bc.globalBC ());
228236
229237 auto groupedTrackIndices = trackIndices.sliceBy (trackIndicesPerCollision, collision.globalIndex ());
230- std::vector<o2::dataformats:: DCA > dcaNeg; // we cache the negative track, to avoid the same computation for each positive track
231- dcaNeg. resize (groupedTrackIndices. size ()) ;
232- std::vector<bool > isSelectedNeg (groupedTrackIndices. size (), true ) ;
233- std::vector< bool > isPropagatedNeg (groupedTrackIndices.size (), false );
234- std::vector< int > pidTrackNegKaon (groupedTrackIndices.size (), - 1 );
235- std::vector< int > pidTrackNegPion (groupedTrackIndices. size (), - 1 );
236-
237- for (auto const & trackIndexPos : groupedTrackIndices) {
238- auto trackPos = trackIndexPos .template track_as <TTracks>();
238+ // we cache tracks
239+ std::vector<SelectedTrack> tracksSelectedPos ;
240+ std::vector<SelectedTrack> tracksSelectedNeg ;
241+ tracksSelectedPos. reserve (groupedTrackIndices.size () / 2 );
242+ tracksSelectedNeg. reserve (groupedTrackIndices.size () / 2 );
243+
244+ // first loop on tracks to find the selected ones
245+ for (auto const & trackIndex : groupedTrackIndices) {
246+ auto track = trackIndex .template track_as <TTracks>();
239247 // track selections
240- if (trackPos.sign () < 0 ) { // first positive track
241- continue ;
242- }
243- if (!trackPos.isGlobalTrackWoDCA ()) {
248+ if (!track.isGlobalTrackWoDCA ()) {
244249 continue ;
245250 }
246- if (trackPos .pt () < cfgTrackCuts.ptMin ) {
251+ if (track .pt () < cfgTrackCuts.ptMin ) {
247252 continue ;
248253 }
249- if (std::abs (trackPos .eta ()) > cfgTrackCuts.absEtaMax ) {
254+ if (std::abs (track .eta ()) > cfgTrackCuts.absEtaMax ) {
250255 continue ;
251256 }
252- auto trackParCovPos = getTrackParCov (trackPos );
253- o2::dataformats::DCA dcaPos (trackPos .dcaXY (), trackPos .dcaZ (), trackPos .cYY (), trackPos .cZY (), trackPos .cZZ ());
254- if (trackPos .collisionId () != collision.globalIndex ()) {
255- trackParCovPos .propagateToDCA (primaryVertex, bz, &dcaPos );
257+ auto trackParCov = getTrackParCov (track );
258+ auto dcaTmp = o2::dataformats::DCA (track .dcaXY (), track .dcaZ (), track .cYY (), track .cZY (), track .cZZ ());
259+ if (track .collisionId () != collision.globalIndex ()) {
260+ trackParCov .propagateToDCA (primaryVertex, bz, &dcaTmp );
256261 }
257- if (!isSelectedTrackDca (cfgTrackCuts.binsPt , cfgTrackCuts.limitsDca , trackParCovPos .getPt (), dcaPos .getY (), dcaPos .getZ ())) {
262+ if (!isSelectedTrackDca (cfgTrackCuts.binsPt , cfgTrackCuts.limitsDca , trackParCov .getPt (), dcaTmp .getY (), dcaTmp .getZ ())) {
258263 continue ;
259264 }
260-
261- int pidTrackPosKaon{-1 };
262- int pidTrackPosPion{-1 };
265+ int pidTrackKaon{-1 };
266+ int pidTrackPion{-1 };
263267 if (cfgTrackCuts.usePidTpcOnly ) {
264268 // / kaon TPC PID positive daughter
265- pidTrackPosKaon = selectorKaon.statusTpc (trackPos );
269+ pidTrackKaon = selectorKaon.statusTpc (track );
266270 // / pion TPC PID positive daughter
267- pidTrackPosPion = selectorPion.statusTpc (trackPos );
271+ pidTrackPion = selectorPion.statusTpc (track );
268272 } else {
269273 // / kaon TPC, TOF PID positive daughter
270- pidTrackPosKaon = selectorKaon.statusTpcAndTof (trackPos );
274+ pidTrackKaon = selectorKaon.statusTpcAndTof (track );
271275 // / pion TPC, TOF PID positive daughter
272- pidTrackPosPion = selectorPion.statusTpcAndTof (trackPos);
276+ pidTrackPion = selectorPion.statusTpcAndTof (track);
277+ }
278+ if (track.sign () > 0 ) { // first positive track
279+ tracksSelectedPos.push_back ({trackIndex.trackId (),
280+ dcaTmp,
281+ trackParCov,
282+ pidTrackPion,
283+ pidTrackKaon});
284+ } else if (track.sign () < 0 ) {
285+ tracksSelectedNeg.push_back ({trackIndex.trackId (),
286+ dcaTmp,
287+ trackParCov,
288+ pidTrackPion,
289+ pidTrackKaon});
273290 }
291+ }
274292
275- int iTrack{-1 };
276- for (auto const & trackIndexNeg : groupedTrackIndices) {
277- iTrack++;
278- if (!isSelectedNeg[iTrack]) {
279- continue ;
280- }
281- auto trackNeg = trackIndexNeg.template track_as <TTracks>();
282- // track selections
283- if (trackNeg.sign () > 0 ) { // second negative track
284- isSelectedNeg[iTrack] = false ;
285- continue ;
286- }
287- if (!trackNeg.isGlobalTrackWoDCA ()) {
288- isSelectedNeg[iTrack] = false ;
289- continue ;
290- }
291- if (trackNeg.pt () < cfgTrackCuts.ptMin ) {
292- isSelectedNeg[iTrack] = false ;
293- continue ;
294- }
295- if (std::abs (trackNeg.eta ()) > cfgTrackCuts.absEtaMax ) {
296- isSelectedNeg[iTrack] = false ;
297- continue ;
298- }
299- auto trackParCovNeg = getTrackParCov (trackNeg);
300- if (!isPropagatedNeg[iTrack]) {
301- dcaNeg[iTrack] = o2::dataformats::DCA (trackNeg.dcaXY (), trackNeg.dcaZ (), trackNeg.cYY (), trackNeg.cZY (), trackNeg.cZZ ());
302- if (trackNeg.collisionId () != collision.globalIndex ()) {
303- trackParCovNeg.propagateToDCA (primaryVertex, bz, &dcaNeg[iTrack]);
304- }
305- isPropagatedNeg[iTrack] = true ;
306- }
307- if (!isSelectedTrackDca (cfgTrackCuts.binsPt , cfgTrackCuts.limitsDca , trackParCovNeg.getPt (), dcaNeg[iTrack].getY (), dcaNeg[iTrack].getZ ())) {
308- isSelectedNeg[iTrack] = false ;
309- continue ;
310- }
293+ for (auto const & trackSelPos : tracksSelectedPos) {
294+ auto trackPos = tracks.rawIteratorAt (trackSelPos.globalIndex );
295+ for (auto const & trackSelNeg : tracksSelectedNeg) {
296+ auto trackNeg = tracks.rawIteratorAt (trackSelNeg.globalIndex );
311297
312298 // preselections
313299 // pt
@@ -337,32 +323,20 @@ struct DerivedDataCreatorD0Calibration {
337323 }
338324 }
339325
340- if (cfgTrackCuts.usePidTpcOnly ) {
341- // / kaon TPC PID negative daughter
342- pidTrackNegKaon[iTrack] = selectorKaon.statusTpc (trackNeg);
343- // / pion TPC PID negative daughter
344- pidTrackNegPion[iTrack] = selectorPion.statusTpc (trackNeg);
345- } else {
346- // / kaon TPC, TOF PID negative daughter
347- pidTrackNegKaon[iTrack] = selectorKaon.statusTpcAndTof (trackNeg);
348- // / pion TPC, TOF PID negative daughter
349- pidTrackNegPion[iTrack] = selectorPion.statusTpcAndTof (trackNeg);
350- }
351-
352326 // PID
353327 uint8_t massHypo{D0MassHypo::D0AndD0Bar}; // both mass hypotheses a priori
354- if (pidTrackPosPion == TrackSelectorPID::Rejected || pidTrackNegKaon[iTrack] == TrackSelectorPID::Rejected) {
328+ if (trackSelPos. pidPion == TrackSelectorPID::Rejected || trackSelNeg. pidKaon == TrackSelectorPID::Rejected) {
355329 massHypo -= D0MassHypo::D0 ; // exclude D0
356330 }
357- if (pidTrackNegPion[iTrack] == TrackSelectorPID::Rejected || pidTrackPosKaon == TrackSelectorPID::Rejected) {
331+ if (trackSelNeg. pidPion == TrackSelectorPID::Rejected || trackSelPos. pidKaon == TrackSelectorPID::Rejected) {
358332 massHypo -= D0MassHypo::D0Bar; // exclude D0Bar
359333 }
360334 if (massHypo == 0 ) {
361335 continue ;
362336 }
363337
364338 // d0xd0
365- if (dcaPos. getY () * dcaNeg[iTrack] .getY () > cuts->get (ptBinNoVtxD0, CutsIds::MaxD0D0)) {
339+ if (trackSelPos. dca . getY () * trackSelNeg. dca .getY () > cuts->get (ptBinNoVtxD0, CutsIds::MaxD0D0)) {
366340 continue ;
367341 }
368342
@@ -384,7 +358,7 @@ struct DerivedDataCreatorD0Calibration {
384358 }
385359
386360 // reconstruct vertex
387- if (df.process (trackParCovPos, trackParCovNeg ) == 0 ) {
361+ if (df.process (trackSelPos. trackParCov , trackSelNeg. trackParCov ) == 0 ) {
388362 continue ;
389363 }
390364 const auto & secondaryVertex = df.getPCACandidate ();
@@ -411,7 +385,7 @@ struct DerivedDataCreatorD0Calibration {
411385 }
412386
413387 // d0xd0
414- if (dcaPos. getY () * dcaNeg[iTrack] .getY () > cuts->get (ptBinD0, CutsIds::MaxD0D0)) {
388+ if (trackSelPos. dca . getY () * trackSelNeg. dca .getY () > cuts->get (ptBinD0, CutsIds::MaxD0D0)) {
415389 continue ;
416390 }
417391 // cospa
@@ -476,7 +450,7 @@ struct DerivedDataCreatorD0Calibration {
476450 } else {
477451 // apply BDT models
478452 if (cfgMl.apply ) {
479- featuresCandD0 = {dcaPos. getY (), dcaNeg[iTrack]. getY (), chi2PCA, cosPaD0, cosPaXYD0, decLenXYD0, decLenD0, dcaPos. getY () * dcaNeg[iTrack] .getY (), aod::pid_tpc_tof_utils::combineNSigma<false >(trackPos.tpcNSigmaPi (), trackPos.tofNSigmaPi ()), aod::pid_tpc_tof_utils::combineNSigma<false >(trackNeg.tpcNSigmaKa (), trackNeg.tofNSigmaKa ()), trackPos.tpcNSigmaPi (), trackPos.tpcNSigmaKa (), aod::pid_tpc_tof_utils::combineNSigma<false >(trackPos.tpcNSigmaKa (), trackPos.tofNSigmaKa ()), trackNeg.tpcNSigmaPi (), trackNeg.tpcNSigmaKa (), aod::pid_tpc_tof_utils::combineNSigma<false >(trackNeg.tpcNSigmaPi (), trackNeg.tofNSigmaPi ())};
453+ featuresCandD0 = {trackSelPos. dca . getY (), trackSelNeg. dca . getY (), chi2PCA, cosPaD0, cosPaXYD0, decLenXYD0, decLenD0, trackSelPos. dca . getY () * trackSelNeg. dca .getY (), aod::pid_tpc_tof_utils::combineNSigma<false >(trackPos.tpcNSigmaPi (), trackPos.tofNSigmaPi ()), aod::pid_tpc_tof_utils::combineNSigma<false >(trackNeg.tpcNSigmaKa (), trackNeg.tofNSigmaKa ()), trackPos.tpcNSigmaPi (), trackPos.tpcNSigmaKa (), aod::pid_tpc_tof_utils::combineNSigma<false >(trackPos.tpcNSigmaKa (), trackPos.tofNSigmaKa ()), trackNeg.tpcNSigmaPi (), trackNeg.tpcNSigmaKa (), aod::pid_tpc_tof_utils::combineNSigma<false >(trackNeg.tpcNSigmaPi (), trackNeg.tofNSigmaPi ())};
480454 if (!mlResponse.isSelectedMl (featuresCandD0, ptD0, bdtScoresD0)) {
481455 massHypo -= D0MassHypo::D0 ;
482456 } else { // selected, we compute cost*
@@ -501,7 +475,7 @@ struct DerivedDataCreatorD0Calibration {
501475 } else {
502476 // apply BDT models
503477 if (cfgMl.apply ) {
504- featuresCandD0bar = {dcaPos. getY (), dcaNeg[iTrack]. getY (), chi2PCA, cosPaD0, cosPaXYD0, decLenXYD0, decLenD0, dcaPos. getY () * dcaNeg[iTrack] .getY (), aod::pid_tpc_tof_utils::combineNSigma<false >(trackPos.tpcNSigmaPi (), trackPos.tofNSigmaPi ()), aod::pid_tpc_tof_utils::combineNSigma<false >(trackNeg.tpcNSigmaKa (), trackNeg.tofNSigmaKa ()), trackPos.tpcNSigmaPi (), trackPos.tpcNSigmaKa (), aod::pid_tpc_tof_utils::combineNSigma<false >(trackPos.tpcNSigmaKa (), trackPos.tofNSigmaKa ()), trackNeg.tpcNSigmaPi (), trackNeg.tpcNSigmaKa (), aod::pid_tpc_tof_utils::combineNSigma<false >(trackNeg.tpcNSigmaPi (), trackNeg.tofNSigmaPi ())};
478+ featuresCandD0bar = {trackSelPos. dca . getY (), trackSelNeg. dca . getY (), chi2PCA, cosPaD0, cosPaXYD0, decLenXYD0, decLenD0, trackSelPos. dca . getY () * trackSelNeg. dca .getY (), aod::pid_tpc_tof_utils::combineNSigma<false >(trackPos.tpcNSigmaPi (), trackPos.tofNSigmaPi ()), aod::pid_tpc_tof_utils::combineNSigma<false >(trackNeg.tpcNSigmaKa (), trackNeg.tofNSigmaKa ()), trackPos.tpcNSigmaPi (), trackPos.tpcNSigmaKa (), aod::pid_tpc_tof_utils::combineNSigma<false >(trackPos.tpcNSigmaKa (), trackPos.tofNSigmaKa ()), trackNeg.tpcNSigmaPi (), trackNeg.tpcNSigmaKa (), aod::pid_tpc_tof_utils::combineNSigma<false >(trackNeg.tpcNSigmaPi (), trackNeg.tofNSigmaPi ())};
505479 if (!mlResponse.isSelectedMl (featuresCandD0bar, ptD0, bdtScoresD0bar)) {
506480 massHypo -= D0MassHypo::D0Bar;
507481 } else { // selected, we compute cost*
@@ -694,8 +668,8 @@ struct DerivedDataCreatorD0Calibration {
694668 deltaRefGloParamQ2Pt,
695669 deltaTOFdX,
696670 deltaTOFdZ,
697- o2::math_utils::detail::truncateFloatFraction (dcaPos .getY (), precisionDcaMask),
698- o2::math_utils::detail::truncateFloatFraction (dcaPos .getZ (), precisionDcaMask),
671+ o2::math_utils::detail::truncateFloatFraction (trackSelPos. dca .getY (), precisionDcaMask),
672+ o2::math_utils::detail::truncateFloatFraction (trackSelPos. dca .getZ (), precisionDcaMask),
699673 getCompressedNumSigmaPid (trackPos.tpcNSigmaPi ()),
700674 getCompressedNumSigmaPid (trackPos.tpcNSigmaKa ()),
701675 getCompressedNumSigmaPid (trackPos.tofNSigmaPi ()),
@@ -861,8 +835,8 @@ struct DerivedDataCreatorD0Calibration {
861835 deltaRefGloParamQ2Pt,
862836 deltaTOFdX,
863837 deltaTOFdZ,
864- o2::math_utils::detail::truncateFloatFraction (dcaNeg[iTrack] .getY (), precisionDcaMask),
865- o2::math_utils::detail::truncateFloatFraction (dcaNeg[iTrack] .getZ (), precisionDcaMask),
838+ o2::math_utils::detail::truncateFloatFraction (trackSelNeg. dca .getY (), precisionDcaMask),
839+ o2::math_utils::detail::truncateFloatFraction (trackSelNeg. dca .getZ (), precisionDcaMask),
866840 getCompressedNumSigmaPid (trackNeg.tpcNSigmaPi ()),
867841 getCompressedNumSigmaPid (trackNeg.tpcNSigmaKa ()),
868842 getCompressedNumSigmaPid (trackNeg.tofNSigmaPi ()),
0 commit comments