Skip to content

Commit 9a174d2

Browse files
authored
[Trigger,PWGEM] update globalDimuonFilter.cxx (#14760)
1 parent f473157 commit 9a174d2

File tree

1 file changed

+117
-33
lines changed

1 file changed

+117
-33
lines changed

EventFiltering/PWGEM/globalDimuonFilter.cxx

Lines changed: 117 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)