@@ -88,6 +88,9 @@ struct globalDimuonFilter {
8888 Configurable<float > matchingZ{" matchingZ" , -77.5 , " z position where matching is performed" };
8989 Configurable<float > maxDEta{" maxDEta" , 0.15 , " max. deta between MFT-MCH-MID and MCH-MID" };
9090 Configurable<float > maxDPhi{" maxDPhi" , 0.15 , " max. dphi between MFT-MCH-MID and MCH-MID" };
91+ Configurable<bool > cfgApplyPreselectionInBestMatch{" cfgApplyPreselectionInBestMatch" , false , " flag to apply preselection in find best match function" };
92+ Configurable<float > cfgSlope_dr_chi2MatchMFTMCH{" cfgSlope_dr_chi2MatchMFTMCH" , -0.15 / 30 , " slope of chiMatchMCHMFT vs. dR" };
93+ Configurable<float > cfgIntercept_dr_chi2MatchMFTMCH{" cfgIntercept_dr_chi2MatchMFTMCH" , 1e+10f , " intercept of chiMatchMCHMFT vs. dR" };
9194 } glMuonCutGroup;
9295
9396 struct : ConfigurableGroup { // tight cut
@@ -130,11 +133,17 @@ struct globalDimuonFilter {
130133 Configurable<float > maxDPhi{" maxDPhi" , 1e+10 , " max. dphi between MFT-MCH-MID and MCH-MID" };
131134 } probeMuonCutGroup;
132135
136+ // for z shift for propagation
137+ Configurable<bool > cfgApplyZShiftFromCCDB{" cfgApplyZShiftFromCCDB" , false , " flag to apply z shift" };
138+ Configurable<std::string> cfgZShiftPath{" cfgZShiftPath" , " Users/m/mcoquet/ZShift" , " CCDB path for z shift to apply to forward tracks" };
139+ Configurable<float > cfgManualZShift{" cfgManualZShift" , 0 , " manual z-shift for propagation of global muon to PV" };
140+
133141 HistogramRegistry fRegistry {" output" , {}, OutputObjHandlingPolicy::AnalysisObject, false , false };
134142 o2::ccdb::CcdbApi ccdbApi;
135143 Service<o2::ccdb::BasicCCDBManager> ccdb;
136144 int mRunNumber = 0 ;
137145 float mBz = 0 ;
146+ float mZShift = 0 ;
138147
139148 void init (o2::framework::InitContext&)
140149 {
@@ -145,6 +154,7 @@ struct globalDimuonFilter {
145154 ccdbApi.init (ccdburl);
146155 mRunNumber = 0 ;
147156 mBz = 0 ;
157+ mZShift = 0 ;
148158
149159 addHistograms ();
150160 }
@@ -170,6 +180,20 @@ struct globalDimuonFilter {
170180 o2::field::MagneticField* field = static_cast <o2::field::MagneticField*>(TGeoGlobalMagField::Instance ()->GetField ());
171181 mBz = field->getBz (centerMFT); // Get field at centre of MFT
172182 LOGF (info, " Bz at center of MFT = %f kZG" , mBz );
183+
184+ if (cfgApplyZShiftFromCCDB) {
185+ auto * zShift = ccdb->getForTimeStamp <std::vector<float >>(cfgZShiftPath, bc.timestamp ());
186+ if (zShift != nullptr && !zShift->empty ()) {
187+ LOGF (info, " reading z shift %f from %s" , (*zShift)[0 ], cfgZShiftPath.value );
188+ mZShift = (*zShift)[0 ];
189+ } else {
190+ LOGF (info, " z shift is not found in ccdb path %s. set to 0 cm" , cfgZShiftPath.value );
191+ mZShift = 0 ;
192+ }
193+ } else {
194+ LOGF (info, " z shift is manually set to %f cm" , cfgManualZShift.value );
195+ mZShift = cfgManualZShift;
196+ }
173197 }
174198
175199 void addHistograms ()
@@ -213,6 +237,9 @@ struct globalDimuonFilter {
213237 fRegistry .add (" MFTMCHMID/hDCAy_PosZ" , " DCAy vs. posZ;Z_{vtx} (cm);DCA_{y} (cm)" , kTH2F , {{200 , -10 , +10 }, {400 , -0.2 , +0.2 }}, false );
214238 fRegistry .add (" MFTMCHMID/hDCAx_Phi" , " DCAx vs. #varphi;#varphi (rad.);DCA_{x} (cm)" , kTH2F , {{90 , 0 , 2 * M_PI}, {400 , -0.2 , +0.2 }}, false );
215239 fRegistry .add (" MFTMCHMID/hDCAy_Phi" , " DCAy vs. #varphi;#varphi (rad.);DCA_{y} (cm)" , kTH2F , {{90 , 0 , 2 * M_PI}, {400 , -0.2 , +0.2 }}, false );
240+ fRegistry .add (" MFTMCHMID/hdR_Chi2MatchMCHMFT" , " dr vs. matching chi2 MCH-MFT;chi2 match MCH-MFT;#DeltaR" , kTH2F , {{200 , 0 , 50 }, {200 , 0 , 0.5 }}, false );
241+ fRegistry .add (" MFTMCHMID/hdR_Chi2" , " dr vs. chi2;global chi2/ndf;#DeltaR" , kTH2F , {{100 , 0 , 10 }, {200 , 0 , 0.5 }}, false );
242+ fRegistry .add (" MFTMCHMID/hChi2_Chi2MatchMCHMFT" , " chi2 vs. matching chi2 MCH-MFT;chi2 match MCH-MFT;global chi2/ndf" , kTH2F , {{200 , 0 , 50 }, {100 , 0 , 10 }}, false );
216243
217244 const AxisSpec axisMll{{0.20, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.70, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.80, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.90, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.00, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.10, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.10, 2.20, 2.30, 2.40, 2.50, 2.60, 2.70, 2.75, 2.80, 2.85, 2.90, 2.95, 3.00, 3.05, 3.10, 3.15, 3.20, 3.25, 3.30, 3.35, 3.40, 3.45, 3.50, 3.55, 3.60, 3.65, 3.70, 3.75, 3.80, 3.85, 3.90, 3.95, 4.00, 4.50, 5.00, 5.50, 6.00, 6.50, 7.00, 7.50, 8.00, 8.1, 8.2, 8.3, 8.4, 8.50, 8.60, 8.70, 8.80, 8.90, 9.00, 9.10, 9.20, 9.30, 9.40, 9.50, 9.60, 9.70, 9.80, 9.90, 10.00, 10.10, 10.20, 10.30, 10.40, 10.50, 10.60, 10.70, 10.80, 10.90, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.5, 11.6, 11.7, 11.8, 11.9, 12.0}, "m_{#mu#mu} (GeV/c^{2})"};
218245 const AxisSpec axisPtll{{0 , 0.1 , 0.2 , 0.3 , 0.4 , 0.5 , 0.6 , 0.7 , 0.8 , 0.9 , 1 , 1.1 , 1.2 , 1.3 , 1.4 , 1.5 , 1.6 , 1.7 , 1.8 , 1.9 , 2 , 2.5 , 3 , 3.5 , 4 , 4.5 , 5 , 6 , 7 , 8 , 9 , 10 }, " p_{T,#mu#mu} (GeV/c)" };
@@ -245,31 +272,64 @@ struct globalDimuonFilter {
245272 }
246273
247274 std::vector<std::tuple<int , int , int >> vec_min_chi2MatchMCHMFT; // std::pair<globalIndex of global muon, globalIndex of matched MCH-MID, globalIndex of MFT> -> chi2MatchMCHMFT;
248- template <typename TMuons >
249- void findBestMatchPerMCHMID (TMuons const & muons )
275+ template <bool isMC, typename TCollision, typename TFwdTrack, typename TFwdTracks, typename TMFTTracks >
276+ void findBestMatchPerMCHMID (TCollision const & collision, TFwdTrack const & fwdtrack, TFwdTracks const & fwdtracks, TMFTTracks const & )
250277 {
251- vec_min_chi2MatchMCHMFT.reserve (muons.size ());
252- for (const auto & muon : muons) {
253- if (muon.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
254- const auto & muons_per_MCHMID = muons.sliceBy (fwdtracksPerMCHTrack, muon.globalIndex ());
255- // LOGF(info, "stanadalone: muon.globalIndex() = %d, muon.chi2MatchMCHMFT() = %f", muon.globalIndex(), muon.chi2MatchMCHMFT());
256- // LOGF(info, "muons_per_MCHMID.size() = %d", muons_per_MCHMID.size());
257-
258- float min_chi2MatchMCHMFT = 1e+10 ;
259- std::tuple<int , int , int > tupleIds_at_min;
260- for (const auto & muon_tmp : muons_per_MCHMID) {
261- if (muon_tmp.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
262- // LOGF(info, "muon_tmp.globalIndex() = %d, muon_tmp.matchMCHTrackId() = %d, muon_tmp.matchMFTTrackId() = %d, muon_tmp.chi2MatchMCHMFT() = %f", muon_tmp.globalIndex(), muon_tmp.matchMCHTrackId(), muon_tmp.matchMFTTrackId(), muon_tmp.chi2MatchMCHMFT());
263- if (0 .f < muon_tmp.chi2MatchMCHMFT () && muon_tmp.chi2MatchMCHMFT () < min_chi2MatchMCHMFT) {
264- min_chi2MatchMCHMFT = muon_tmp.chi2MatchMCHMFT ();
265- tupleIds_at_min = std::make_tuple (muon_tmp.globalIndex (), muon_tmp.matchMCHTrackId (), muon_tmp.matchMFTTrackId ());
266- }
267- }
278+ if (fwdtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) {
279+ return ;
280+ }
281+ if constexpr (isMC) {
282+ if (!fwdtrack.has_mcParticle ()) {
283+ return ;
284+ }
285+ }
286+
287+ const auto & muons_per_MCHMID = fwdtracks.sliceBy (fwdtracksPerMCHTrack, fwdtrack.globalIndex ());
288+ // LOGF(info, "stanadalone: muon.globalIndex() = %d, muon.chi2MatchMCHMFT() = %f", muon.globalIndex(), muon.chi2MatchMCHMFT());
289+ // LOGF(info, "muons_per_MCHMID.size() = %d", muons_per_MCHMID.size());
290+
291+ o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon (fwdtrack, fwdtrack, collision, propagationPoint::kToVertex , glMuonCutGroup.matchingZ , mBz , mZShift );
292+ float etaMatchedMCHMID = propmuonAtPV_Matched.getEta ();
293+ float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi ();
294+ o2::math_utils::bringTo02Pi (phiMatchedMCHMID);
295+
296+ float min_chi2MatchMCHMFT = 1e+10 , min_dr = 1e+10 ;
297+ std::tuple<int , int , int > tupleIds_at_min_chi2mftmch;
298+ std::tuple<int , int , int > tupleIds_at_min_dr;
299+ for (const auto & muon_tmp : muons_per_MCHMID) {
300+ if (muon_tmp.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
301+ auto tupleId = std::make_tuple (muon_tmp.globalIndex (), muon_tmp.matchMCHTrackId (), muon_tmp.matchMFTTrackId ());
302+ // auto mchtrack = muon_tmp.template matchMCHTrack_as<TFwdTracks>(); // MCH-MID
303+ // auto mfttrack = muon_tmp.template matchMFTTrack_as<TMFTTracks>(); // MFTsa
304+
305+ o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon (muon_tmp, muon_tmp, collision, propagationPoint::kToVertex , glMuonCutGroup.matchingZ , mBz , mZShift );
306+ float eta = propmuonAtPV.getEta ();
307+ float phi = propmuonAtPV.getPhi ();
308+ o2::math_utils::bringTo02Pi (phi);
309+
310+ float deta = etaMatchedMCHMID - eta;
311+ float dphi = phiMatchedMCHMID - phi;
312+ o2::math_utils::bringToPMPi (dphi);
313+ float dr = std::sqrt (deta * deta + dphi * dphi);
314+
315+ if (glMuonCutGroup.cfgApplyPreselectionInBestMatch && glMuonCutGroup.cfgSlope_dr_chi2MatchMFTMCH * muon_tmp.chi2MatchMCHMFT () + glMuonCutGroup.cfgIntercept_dr_chi2MatchMFTMCH < dr) {
316+ continue ;
317+ }
318+
319+ // LOGF(info, "muon_tmp.globalIndex() = %d, muon_tmp.matchMCHTrackId() = %d, muon_tmp.matchMFTTrackId() = %d, muon_tmp.chi2MatchMCHMFT() = %f", muon_tmp.globalIndex(), muon_tmp.matchMCHTrackId(), muon_tmp.matchMFTTrackId(), muon_tmp.chi2MatchMCHMFT());
320+ if (0 .f < muon_tmp.chi2MatchMCHMFT () && muon_tmp.chi2MatchMCHMFT () < min_chi2MatchMCHMFT) {
321+ min_chi2MatchMCHMFT = muon_tmp.chi2MatchMCHMFT ();
322+ tupleIds_at_min_chi2mftmch = std::make_tuple (muon_tmp.globalIndex (), muon_tmp.matchMCHTrackId (), muon_tmp.matchMFTTrackId ());
323+ }
324+
325+ if (dr < min_dr) {
326+ min_dr = dr;
327+ tupleIds_at_min_dr = tupleId;
268328 }
269- vec_min_chi2MatchMCHMFT.emplace_back (tupleIds_at_min);
270- // LOGF(info, "min: muon_tmp.globalIndex() = %d, muon_tmp.matchMCHTrackId() = %d, muon_tmp.matchMFTTrackId() = %d, muon_tmp.chi2MatchMCHMFT() = %f", std::get<0>(tupleIds_at_min), std::get<1>(tupleIds_at_min), std::get<2>(tupleIds_at_min), min_chi2MatchMCHMFT);
271329 }
272- } // end of muon loop
330+ }
331+ vec_min_chi2MatchMCHMFT.emplace_back (tupleIds_at_min_chi2mftmch);
332+ // LOGF(info, "min: muon_tmp.globalIndex() = %d, muon_tmp.matchMCHTrackId() = %d, muon_tmp.matchMFTTrackId() = %d, muon_tmp.chi2MatchMCHMFT() = %f", std::get<0>(tupleIds_at_min), std::get<1>(tupleIds_at_min), std::get<2>(tupleIds_at_min), min_chi2MatchMCHMFT);
273333 }
274334
275335 PresliceUnsorted<aod::FwdTracks> perMFTTrack = o2::aod::fwdtrack::matchMFTTrackId;
@@ -358,7 +418,7 @@ struct globalDimuonFilter {
358418 return false ;
359419 }
360420
361- o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon (mchtrack, mchtrack, collision, propagationPoint::kToVertex , glMuonCutGroup.matchingZ , mBz );
421+ o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon (mchtrack, mchtrack, collision, propagationPoint::kToVertex , glMuonCutGroup.matchingZ , mBz , mZShift );
362422 // float ptMatchedMCHMID = propmuonAtPV_Matched.getPt();
363423 float etaMatchedMCHMID = propmuonAtPV_Matched.getEta ();
364424 float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi ();
@@ -369,7 +429,7 @@ struct globalDimuonFilter {
369429 // o2::dataformats::GlobalFwdTrack globalMuonRefit = o2::aod::fwdtrackutils::refitGlobalMuonCov(propmuonAtPV_Matched, mftsa); // this is track at IU.
370430 // auto globalMuon = o2::aod::fwdtrackutils::propagateTrackParCovFwd(globalMuonRefit, fwdtrack.trackType(), collision, propagationPoint::kToVertex, glMuonCutGroup.matchingZ, mBz);
371431
372- o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon (fwdtrack, fwdtrack, collision, propagationPoint::kToVertex , glMuonCutGroup.matchingZ , mBz );
432+ o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon (fwdtrack, fwdtrack, collision, propagationPoint::kToVertex , glMuonCutGroup.matchingZ , mBz , mZShift );
373433 pt = propmuonAtPV.getPt ();
374434 eta = propmuonAtPV.getEta ();
375435 phi = propmuonAtPV.getPhi ();
@@ -381,11 +441,15 @@ struct globalDimuonFilter {
381441 float deta = etaMatchedMCHMID - eta;
382442 float dphi = phiMatchedMCHMID - phi;
383443 o2::math_utils::bringToPMPi (dphi);
384-
385444 if (std::sqrt (std::pow (deta / glMuonCutGroup.maxDEta , 2 ) + std::pow (dphi / glMuonCutGroup.maxDPhi , 2 )) > 1 .f ) {
386445 return false ;
387446 }
388447
448+ float dr = std::sqrt (deta * deta + dphi * dphi);
449+ if (glMuonCutGroup.cfgSlope_dr_chi2MatchMFTMCH * fwdtrack.chi2MatchMCHMFT () + glMuonCutGroup.cfgIntercept_dr_chi2MatchMFTMCH < dr) {
450+ return false ;
451+ }
452+
389453 float dcaX = propmuonAtPV.getX () - collision.posX ();
390454 float dcaY = propmuonAtPV.getY () - collision.posY ();
391455 float dcaZ = propmuonAtPV.getZ () - collision.posZ ();
@@ -406,7 +470,7 @@ struct globalDimuonFilter {
406470 }
407471 float sigma_dcaXY = dcaXY / dcaXYinSigma;
408472
409- o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon (mchtrack, mchtrack, collision, propagationPoint::kToDCA , glMuonCutGroup.matchingZ , mBz );
473+ o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon (mchtrack, mchtrack, collision, propagationPoint::kToDCA , glMuonCutGroup.matchingZ , mBz , mZShift );
410474 float dcaX_Matched = propmuonAtDCA_Matched.getX () - collision.posX ();
411475 float dcaY_Matched = propmuonAtDCA_Matched.getY () - collision.posY ();
412476 float dcaXY_Matched = std::sqrt (dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched);
@@ -446,6 +510,9 @@ struct globalDimuonFilter {
446510 fRegistry .fill (HIST (" MFTMCHMID/hDCAy_PosZ" ), collision.posZ (), dcaY);
447511 fRegistry .fill (HIST (" MFTMCHMID/hDCAx_Phi" ), phi, dcaX);
448512 fRegistry .fill (HIST (" MFTMCHMID/hDCAy_Phi" ), phi, dcaY);
513+ fRegistry .fill (HIST (" MFTMCHMID/hdR_Chi2MatchMCHMFT" ), fwdtrack.chi2MatchMCHMFT (), dr);
514+ fRegistry .fill (HIST (" MFTMCHMID/hdR_Chi2" ), chi2, dr);
515+ fRegistry .fill (HIST (" MFTMCHMID/hChi2_Chi2MatchMCHMFT" ), fwdtrack.chi2MatchMCHMFT (), chi2);
449516 }
450517
451518 return true ;
@@ -496,7 +563,7 @@ struct globalDimuonFilter {
496563 return false ;
497564 }
498565
499- o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon (mchtrack, mchtrack, collision, propagationPoint::kToVertex , tagMuonCutGroup.matchingZ , mBz );
566+ o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon (mchtrack, mchtrack, collision, propagationPoint::kToVertex , tagMuonCutGroup.matchingZ , mBz , mZShift );
500567 float etaMatchedMCHMID = propmuonAtPV_Matched.getEta ();
501568 float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi ();
502569 o2::math_utils::bringTo02Pi (phiMatchedMCHMID);
@@ -506,7 +573,7 @@ struct globalDimuonFilter {
506573 // o2::dataformats::GlobalFwdTrack globalMuonRefit = o2::aod::fwdtrackutils::refitGlobalMuonCov(propmuonAtPV_Matched, mftsa); // this is track at IU.
507574 // auto globalMuon = o2::aod::fwdtrackutils::propagateTrackParCovFwd(globalMuonRefit, fwdtrack.trackType(), collision, propagationPoint::kToVertex, tagMuonCutGroup.matchingZ, mBz);
508575
509- o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon (fwdtrack, fwdtrack, collision, propagationPoint::kToVertex , tagMuonCutGroup.matchingZ , mBz );
576+ o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon (fwdtrack, fwdtrack, collision, propagationPoint::kToVertex , tagMuonCutGroup.matchingZ , mBz , mZShift );
510577 pt = propmuonAtPV.getPt ();
511578 eta = propmuonAtPV.getEta ();
512579 phi = propmuonAtPV.getPhi ();
@@ -607,7 +674,7 @@ struct globalDimuonFilter {
607674 return false ;
608675 }
609676
610- o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon (mchtrack, mchtrack, collision, propagationPoint::kToVertex , probeMuonCutGroup.matchingZ , mBz );
677+ o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon (mchtrack, mchtrack, collision, propagationPoint::kToVertex , probeMuonCutGroup.matchingZ , mBz , mZShift );
611678 float etaMatchedMCHMID = propmuonAtPV_Matched.getEta ();
612679 float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi ();
613680 o2::math_utils::bringTo02Pi (phiMatchedMCHMID);
@@ -617,7 +684,7 @@ struct globalDimuonFilter {
617684 // o2::dataformats::GlobalFwdTrack globalMuonRefit = o2::aod::fwdtrackutils::refitGlobalMuonCov(propmuonAtPV_Matched, mftsa); // this is track at IU.
618685 // auto globalMuon = o2::aod::fwdtrackutils::propagateTrackParCovFwd(globalMuonRefit, fwdtrack.trackType(), collision, propagationPoint::kToVertex, probeMuonCutGroup.matchingZ, mBz);
619686
620- o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon (fwdtrack, fwdtrack, collision, propagationPoint::kToVertex , probeMuonCutGroup.matchingZ , mBz );
687+ o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon (fwdtrack, fwdtrack, collision, propagationPoint::kToVertex , probeMuonCutGroup.matchingZ , mBz , mZShift );
621688 pt = propmuonAtPV.getPt ();
622689 eta = propmuonAtPV.getEta ();
623690 phi = propmuonAtPV.getPhi ();
@@ -653,7 +720,7 @@ struct globalDimuonFilter {
653720 // }
654721 // float sigma_dcaXY = dcaXY / dcaXYinSigma;
655722
656- o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon (mchtrack, mchtrack, collision, propagationPoint::kToDCA , probeMuonCutGroup.matchingZ , mBz );
723+ o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon (mchtrack, mchtrack, collision, propagationPoint::kToDCA , probeMuonCutGroup.matchingZ , mBz , mZShift );
657724 float dcaX_Matched = propmuonAtDCA_Matched.getX () - collision.posX ();
658725 float dcaY_Matched = propmuonAtDCA_Matched.getY () - collision.posY ();
659726 float dcaXY_Matched = std::sqrt (dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched);
@@ -920,7 +987,15 @@ struct globalDimuonFilter {
920987 for (const auto & mfttrackConv : mftCovs) {
921988 map_mfttrackcovs[mfttrackConv.matchMFTTrackId ()] = mfttrackConv.globalIndex ();
922989 }
923- findBestMatchPerMCHMID (fwdtracks);
990+ vec_min_chi2MatchMCHMFT.reserve (fwdtracks.size ());
991+ for (const auto & collision : collisions) {
992+ auto bc = collision.template bc_as <MyBCs>();
993+ initCCDB (bc);
994+ const auto & fwdtracks_per_coll = fwdtracks.sliceBy (perCollision, collision.globalIndex ());
995+ for (const auto & fwdtrack : fwdtracks_per_coll) {
996+ findBestMatchPerMCHMID<false >(collision, fwdtrack, fwdtracks, mfttracks);
997+ } // end of fwdtrack loop
998+ } // end of collision loop
924999
9251000 for (const auto & fwdtrack : fwdtracks) {
9261001 // LOGF(info, "fwdtrack.globalIndex() = %d, fwdtrack.trackType() = %d, fwdtrack.matchMCHTrackId() = %d, fwdtrack.matchMFTTrackId() = %d", fwdtrack.globalIndex(), fwdtrack.trackType(), fwdtrack.matchMCHTrackId(), fwdtrack.matchMFTTrackId());
@@ -1061,7 +1136,16 @@ struct globalDimuonFilter {
10611136 for (const auto & mfttrackConv : mftCovs) {
10621137 map_mfttrackcovs[mfttrackConv.matchMFTTrackId ()] = mfttrackConv.globalIndex ();
10631138 }
1064- findBestMatchPerMCHMID (fwdtracks);
1139+ vec_min_chi2MatchMCHMFT.reserve (fwdtracks.size ());
1140+ for (const auto & collision : collisions) {
1141+ auto bc = collision.template bc_as <MyBCs>();
1142+ initCCDB (bc);
1143+ auto fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy (fwdtrackIndicesPerCollision, collision.globalIndex ());
1144+ for (const auto & fwdtrackId : fwdtrackIdsThisCollision) {
1145+ auto fwdtrack = fwdtrackId.template fwdtrack_as <MyFwdTracks>();
1146+ findBestMatchPerMCHMID<false >(collision, fwdtrack, fwdtracks, mfttracks);
1147+ } // end of fwdtrack loop
1148+ } // end of collision loop
10651149
10661150 for (const auto & fwdtrack : fwdtracks) {
10671151 // LOGF(info, "fwdtrack.globalIndex() = %d, fwdtrack.trackType() = %d, fwdtrack.matchMCHTrackId() = %d, fwdtrack.matchMFTTrackId() = %d", fwdtrack.globalIndex(), fwdtrack.trackType(), fwdtrack.matchMCHTrackId(), fwdtrack.matchMFTTrackId());
0 commit comments