@@ -771,6 +771,26 @@ struct Dilepton {
771771 }
772772 }
773773
774+ std::map<std::tuple<int , int , int >, float > map_eta_geom; // map <dfId, collisionId, trackId> -> geometrical eta position at propagated point
775+ std::map<std::tuple<int , int , int >, float > map_phi_geom; // map <dfId, collisionId, trackId> -> geometrical phi position at propagated point
776+
777+ template <typename TTracks>
778+ void propagateElectron (TTracks const & tracks)
779+ {
780+ // this has to be called after initCCDB for bz.
781+ for (auto & track : tracks) {
782+ auto track_par_cov = getTrackParCov (track);
783+ track_par_cov.setPID (o2::track::PID::Electron);
784+ o2::base::Propagator::Instance ()->propagateToX (track_par_cov, dielectroncuts.cfg_x_to_go , d_bz, o2::base::PropagatorImpl<float >::MAX_SIN_PHI, o2::base::PropagatorImpl<float >::MAX_STEP, matCorr);
785+ auto xyz = track_par_cov.getXYZGlo ();
786+ float eta = RecoDecay::eta (std::array{xyz.X (), xyz.Y (), xyz.Z ()});
787+ float phi = RecoDecay::phi (std::array{xyz.X (), xyz.Y ()});
788+ o2::math_utils::bringTo02Pi (phi);
789+ map_eta_geom[std::make_tuple (ndf, track.emeventId (), track.globalIndex ())] = eta;
790+ map_phi_geom[std::make_tuple (ndf, track.emeventId (), track.globalIndex ())] = phi;
791+ }
792+ }
793+
774794 template <int ev_id, typename TCollision, typename TTrack1, typename TTrack2, typename TCut>
775795 bool fillPairInfo (TCollision const & collision, TTrack1 const & t1, TTrack2 const & t2, TCut const & cut)
776796 {
@@ -816,35 +836,22 @@ struct Dilepton {
816836 }
817837 }
818838
819- float deta_geom = 999 .f ;
820- float dphi_geom = 999 .f ;
839+ float deta_geom = 999 .f , dphi_geom = 999 .f ;
821840 if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron ) {
822841 if (!cut.template IsSelectedPair (t1, t2, d_bz)) {
823842 return false ;
824843 }
825- if (dielectroncuts.cfg_x_to_go ) {
826- auto track_par_cov1 = getTrackParCov (t1);
827- track_par_cov1.setPID (o2::track::PID::Electron);
828- o2::base::Propagator::Instance ()->propagateToX (track_par_cov1, dielectroncuts.cfg_x_to_go , d_bz, o2::base::PropagatorImpl<float >::MAX_SIN_PHI, o2::base::PropagatorImpl<float >::MAX_STEP, matCorr);
829- auto xyz1 = track_par_cov1.getXYZGlo ();
830- float eta1 = RecoDecay::eta (std::array{xyz1.X (), xyz1.Y (), xyz1.Z ()});
831- float phi1 = RecoDecay::phi (std::array{xyz1.X (), xyz1.Y ()});
832- o2::math_utils::bringTo02Pi (phi1);
833-
834- auto track_par_cov2 = getTrackParCov (t2);
835- track_par_cov2.setPID (o2::track::PID::Electron);
836- o2::base::Propagator::Instance ()->propagateToX (track_par_cov2, dielectroncuts.cfg_x_to_go , d_bz, o2::base::PropagatorImpl<float >::MAX_SIN_PHI, o2::base::PropagatorImpl<float >::MAX_STEP, matCorr);
837- auto xyz2 = track_par_cov2.getXYZGlo ();
838- float eta2 = RecoDecay::eta (std::array{xyz2.X (), xyz2.Y (), xyz2.Z ()});
839- float phi2 = RecoDecay::phi (std::array{xyz2.X (), xyz2.Y ()});
840- o2::math_utils::bringTo02Pi (phi2);
841-
842- deta_geom = t1.sign () * t1.pt () > t2.sign () * t2.pt () ? eta1 - eta2 : eta2 - eta1;
843- dphi_geom = t1.sign () * t1.pt () > t2.sign () * t2.pt () ? phi1 - phi2 : phi2 - phi1;
844- o2::math_utils::bringToPMPi (dphi_geom);
845- if (dielectroncuts.cfg_apply_detadphi_geom && std::pow (deta_geom / dielectroncuts.cfg_min_deta_geom , 2 ) + std::pow (dphi_geom / dielectroncuts.cfg_min_dphi_geom , 2 ) < 1 .f ) {
846- return false ;
847- }
844+
845+ if constexpr (ev_id == 0 ) {
846+ deta_geom = t1.sign () * t1.pt () > t2.sign () * t2.pt () ? map_eta_geom[std::make_tuple (ndf, t1.emeventId (), t1.globalIndex ())] - map_eta_geom[std::make_tuple (ndf, t2.emeventId (), t2.globalIndex ())] : map_eta_geom[std::make_tuple (ndf, t2.emeventId (), t2.globalIndex ())] - map_eta_geom[std::make_tuple (ndf, t1.emeventId (), t1.globalIndex ())];
847+ dphi_geom = t1.sign () * t1.pt () > t2.sign () * t2.pt () ? map_phi_geom[std::make_tuple (ndf, t1.emeventId (), t1.globalIndex ())] - map_phi_geom[std::make_tuple (ndf, t2.emeventId (), t2.globalIndex ())] : map_phi_geom[std::make_tuple (ndf, t2.emeventId (), t2.globalIndex ())] - map_phi_geom[std::make_tuple (ndf, t1.emeventId (), t1.globalIndex ())];
848+ } else { // mixed event
849+ deta_geom = t1.sign () * t1.pt () > t2.sign () * t2.pt () ? map_eta_geom[std::make_tuple (t1.dfId (), t1.collisionId (), t1.globalIndex ())] - map_eta_geom[std::make_tuple (t2.dfId (), t2.collisionId (), t2.globalIndex ())] : map_eta_geom[std::make_tuple (t2.dfId (), t2.collisionId (), t2.globalIndex ())] - map_eta_geom[std::make_tuple (t1.dfId (), t1.collisionId (), t1.globalIndex ())];
850+ dphi_geom = t1.sign () * t1.pt () > t2.sign () * t2.pt () ? map_phi_geom[std::make_tuple (t1.dfId (), t1.collisionId (), t1.globalIndex ())] - map_phi_geom[std::make_tuple (t2.dfId (), t2.collisionId (), t2.globalIndex ())] : map_phi_geom[std::make_tuple (t2.dfId (), t2.collisionId (), t2.globalIndex ())] - map_phi_geom[std::make_tuple (t1.dfId (), t1.collisionId (), t1.globalIndex ())];
851+ }
852+ o2::math_utils::bringToPMPi (dphi_geom);
853+ if (dielectroncuts.cfg_x_to_go > 0 .f && dielectroncuts.cfg_apply_detadphi_geom && std::pow (deta_geom / dielectroncuts.cfg_min_deta_geom , 2 ) + std::pow (dphi_geom / dielectroncuts.cfg_min_dphi_geom , 2 ) < 1 .f ) {
854+ return false ;
848855 }
849856 } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon ) {
850857 if (!cut.template IsSelectedPair (t1, t2)) {
@@ -1200,6 +1207,13 @@ struct Dilepton {
12001207 auto negTracks_per_coll = negTracks.sliceByCached (perCollision, collision.globalIndex (), cache);
12011208 // LOGF(info, "collision.globalIndex() = %d , collision.posZ() = %f , collision.numContrib() = %d, centrality = %f , posTracks_per_coll.size() = %d, negTracks_per_coll.size() = %d", collision.globalIndex(), collision.posZ(), collision.numContrib(), centralities[cfgCentEstimator], posTracks_per_coll.size(), negTracks_per_coll.size());
12021209
1210+ if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron ) {
1211+ if (dielectroncuts.cfg_x_to_go > 0 .f ) {
1212+ propagateElectron (posTracks_per_coll);
1213+ propagateElectron (negTracks_per_coll);
1214+ }
1215+ }
1216+
12031217 int nuls = 0 , nlspp = 0 , nlsmm = 0 ;
12041218 for (auto & [pos, neg] : combinations (CombinationsFullIndexPolicy (posTracks_per_coll, negTracks_per_coll))) { // ULS
12051219 bool is_pair_ok = fillPairInfo<0 >(collision, pos, neg, cut);
@@ -1325,7 +1339,6 @@ struct Dilepton {
13251339
13261340 } // end of collision loop
13271341
1328- ndf++;
13291342 } // end of DF
13301343
13311344 template <typename TCollision, typename TTrack1, typename TTrack2, typename TCut>
@@ -1351,31 +1364,11 @@ struct Dilepton {
13511364 if (!cut.template IsSelectedPair (t1, t2, d_bz)) {
13521365 return false ;
13531366 }
1354-
1355- if (dielectroncuts.cfg_x_to_go ) {
1356- auto track_par_cov1 = getTrackParCov (t1);
1357- track_par_cov1.setPID (o2::track::PID::Electron);
1358- o2::base::Propagator::Instance ()->propagateToX (track_par_cov1, dielectroncuts.cfg_x_to_go , d_bz, o2::base::PropagatorImpl<float >::MAX_SIN_PHI, o2::base::PropagatorImpl<float >::MAX_STEP, matCorr);
1359- auto xyz1 = track_par_cov1.getXYZGlo ();
1360- float eta1 = RecoDecay::eta (std::array{xyz1.X (), xyz1.Y (), xyz1.Z ()});
1361- float phi1 = RecoDecay::phi (std::array{xyz1.X (), xyz1.Y ()});
1362- o2::math_utils::bringTo02Pi (phi1);
1363-
1364- auto track_par_cov2 = getTrackParCov (t2);
1365- track_par_cov2.setPID (o2::track::PID::Electron);
1366- o2::base::Propagator::Instance ()->propagateToX (track_par_cov2, dielectroncuts.cfg_x_to_go , d_bz, o2::base::PropagatorImpl<float >::MAX_SIN_PHI, o2::base::PropagatorImpl<float >::MAX_STEP, matCorr);
1367- auto xyz2 = track_par_cov2.getXYZGlo ();
1368- float eta2 = RecoDecay::eta (std::array{xyz2.X (), xyz2.Y (), xyz2.Z ()});
1369- float phi2 = RecoDecay::phi (std::array{xyz2.X (), xyz2.Y ()});
1370- o2::math_utils::bringTo02Pi (phi2);
1371-
1372- float deta_geom = t1.sign () * t1.pt () > t2.sign () * t2.pt () ? eta1 - eta2 : eta2 - eta1;
1373- float dphi_geom = t1.sign () * t1.pt () > t2.sign () * t2.pt () ? phi1 - phi2 : phi2 - phi1;
1374- o2::math_utils::bringToPMPi (dphi_geom);
1375-
1376- if (dielectroncuts.cfg_apply_detadphi_geom && std::pow (deta_geom / dielectroncuts.cfg_min_deta_geom , 2 ) + std::pow (dphi_geom / dielectroncuts.cfg_min_dphi_geom , 2 ) < 1 .f ) {
1377- return false ;
1378- }
1367+ float deta_geom = t1.sign () * t1.pt () > t2.sign () * t2.pt () ? map_eta_geom[std::make_tuple (ndf, t1.emeventId (), t1.globalIndex ())] - map_eta_geom[std::make_tuple (ndf, t2.emeventId (), t2.globalIndex ())] : map_eta_geom[std::make_tuple (ndf, t2.emeventId (), t2.globalIndex ())] - map_eta_geom[std::make_tuple (ndf, t1.emeventId (), t1.globalIndex ())];
1368+ float dphi_geom = t1.sign () * t1.pt () > t2.sign () * t2.pt () ? map_phi_geom[std::make_tuple (ndf, t1.emeventId (), t1.globalIndex ())] - map_phi_geom[std::make_tuple (ndf, t2.emeventId (), t2.globalIndex ())] : map_phi_geom[std::make_tuple (ndf, t2.emeventId (), t2.globalIndex ())] - map_phi_geom[std::make_tuple (ndf, t1.emeventId (), t1.globalIndex ())];
1369+ o2::math_utils::bringToPMPi (dphi_geom);
1370+ if (dielectroncuts.cfg_x_to_go > 0 .f && dielectroncuts.cfg_apply_detadphi_geom && std::pow (deta_geom / dielectroncuts.cfg_min_deta_geom , 2 ) + std::pow (dphi_geom / dielectroncuts.cfg_min_dphi_geom , 2 ) < 1 .f ) {
1371+ return false ;
13791372 }
13801373 } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon ) {
13811374 if (!cut.template IsSelectedPair (t1, t2)) {
@@ -1435,6 +1428,12 @@ struct Dilepton {
14351428
14361429 auto posTracks_per_coll = posTracks.sliceByCached (perCollision, collision.globalIndex (), cache);
14371430 auto negTracks_per_coll = negTracks.sliceByCached (perCollision, collision.globalIndex (), cache);
1431+ if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron ) {
1432+ if (dielectroncuts.cfg_x_to_go > 0 .f ) {
1433+ propagateElectron (posTracks_per_coll);
1434+ propagateElectron (negTracks_per_coll);
1435+ }
1436+ }
14381437
14391438 for (auto & [pos, neg] : combinations (CombinationsFullIndexPolicy (posTracks_per_coll, negTracks_per_coll))) { // ULS
14401439 if (isPairOK (collision, pos, neg, cut)) {
@@ -1505,6 +1504,7 @@ struct Dilepton {
15051504 runPairing<false >(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut );
15061505 }
15071506 map_weight.clear ();
1507+ ndf++;
15081508 }
15091509 PROCESS_SWITCH (Dilepton, processAnalysis, " run dilepton analysis" , true );
15101510
@@ -1525,6 +1525,7 @@ struct Dilepton {
15251525 runPairing<true >(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut );
15261526 }
15271527 map_weight.clear ();
1528+ ndf++;
15281529 }
15291530 PROCESS_SWITCH (Dilepton, processTriggerAnalysis, " run dilepton analysis on triggered data" , false );
15301531
0 commit comments