@@ -83,12 +83,12 @@ struct skimmerPrimaryMuon {
8383 Configurable<float> minRabs{"minRabs", 17.6, "min. R at absorber end"};
8484 Configurable<float> midRabs{"midRabs", 26.5, "middle R at absorber end for pDCA cut"};
8585 Configurable<float> maxRabs{"maxRabs", 89.5, "max. R at absorber end"};
86- Configurable<float> maxDCAxy{"maxDCAxy", 1 , "max. DCAxy for global muons"};
86+ Configurable<float> maxDCAxy{"maxDCAxy", 0.2 , "max. DCAxy for global muons"};
8787 Configurable<float> maxPDCAforLargeR{"maxPDCAforLargeR", 324.f, "max. pDCA for large R at absorber end"};
8888 Configurable<float> maxPDCAforSmallR{"maxPDCAforSmallR", 594.f, "max. pDCA for small R at absorber end"};
8989 Configurable<float> maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 50.f, "max. chi2 for MCH-MFT matching"};
9090 Configurable<float> maxChi2SA{"maxChi2SA", 1e+10, "max. chi2 for standalone muon"};
91- Configurable<float> maxChi2GL{"maxChi2GL", 10 , "max. chi2 for global muon"};
91+ Configurable<float> maxChi2GL{"maxChi2GL", 12 , "max. chi2 for global muon"};
9292 Configurable<bool> refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"};
9393 Configurable<float> matchingZ{"matchingZ", -77.5, "z position where matching is performed"};
9494 Configurable<int> minNmuon{"minNmuon", 0, "min number of muon candidates per collision"};
@@ -172,8 +172,8 @@ struct skimmerPrimaryMuon {
172172 hMuonType->GetXaxis()->SetBinLabel(5, "MCH standalone");
173173
174174 fRegistry.add("MFTMCHMID/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{100, 0.0f, 10}}, false);
175- fRegistry.add("MFTMCHMID/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {60 , -5 .f, -2.f}}, false);
176- fRegistry.add("MFTMCHMID/hEtaPhi_MatchedMCHMID", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {60 , -5 .f, -2.f}}, false);
175+ fRegistry.add("MFTMCHMID/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {80 , -4 .f, -2.f}}, false);
176+ fRegistry.add("MFTMCHMID/hEtaPhi_MatchedMCHMID", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {80 , -4 .f, -2.f}}, false);
177177 fRegistry.add("MFTMCHMID/hDeltaPt_Pt", "#Deltap_{T}/p_{T} vs. p_{T};p_{T}^{gl} (GeV/c);(p_{T}^{sa} - p_{T}^{gl})/p_{T}^{gl}", kTH2F, {{100, 0, 10}, {200, -0.5, +0.5}}, false);
178178 fRegistry.add("MFTMCHMID/hDeltaEta_Pt", "#Delta#eta vs. p_{T};p_{T}^{gl} (GeV/c);#Delta#eta", kTH2F, {{100, 0, 10}, {200, -0.5, +0.5}}, false);
179179 fRegistry.add("MFTMCHMID/hDeltaPhi_Pt", "#Delta#varphi vs. p_{T};p_{T}^{gl} (GeV/c);#Delta#varphi (rad.)", kTH2F, {{100, 0, 10}, {200, -0.5, +0.5}}, false);
@@ -184,10 +184,10 @@ struct skimmerPrimaryMuon {
184184 fRegistry.add("MFTMCHMID/hNclustersMFT", "NclustersMFT;Nclusters MFT", kTH1F, {{11, -0.5f, 10.5}}, false);
185185 fRegistry.add("MFTMCHMID/hRatAbsorberEnd", "R at absorber end;R at absorber end (cm)", kTH1F, {{100, 0.0f, 100}}, false);
186186 fRegistry.add("MFTMCHMID/hPDCA_Rabs", "pDCA vs. Rabs;R at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false);
187- fRegistry.add("MFTMCHMID/hChi2", "chi2;chi2/ndf", kTH1F, {{100 , 0.0f, 10 }}, false);
188- fRegistry.add("MFTMCHMID/hChi2MFT", "chi2 MFT;chi2 MFT/ndf", kTH1F, {{100 , 0.0f, 10 }}, false);
189- fRegistry.add("MFTMCHMID/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100 , 0.0f, 100 }}, false);
190- fRegistry.add("MFTMCHMID/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100 , 0.0f, 100}}, false);
187+ fRegistry.add("MFTMCHMID/hChi2", "chi2;chi2/ndf", kTH1F, {{200 , 0.0f, 20 }}, false);
188+ fRegistry.add("MFTMCHMID/hChi2MFT", "chi2 MFT;chi2 MFT/ndf", kTH1F, {{200 , 0.0f, 20 }}, false);
189+ fRegistry.add("MFTMCHMID/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{200 , 0.0f, 20 }}, false);
190+ fRegistry.add("MFTMCHMID/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{200 , 0.0f, 100}}, false);
191191 fRegistry.add("MFTMCHMID/hDCAxy2D", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -1, 1}, {200, -1, +1}}, false);
192192 fRegistry.add("MFTMCHMID/hDCAxy2DinSigma", "DCA x vs. y in sigma;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false);
193193 fRegistry.add("MFTMCHMID/hDCAxy", "DCAxy;DCA_{xy} (cm);", kTH1F, {{100, 0, 1}}, false);
@@ -219,6 +219,9 @@ struct skimmerPrimaryMuon {
219219 if (rAtAbsorberEnd < midRabs ? pDCA > maxPDCAforSmallR : pDCA > maxPDCAforLargeR) {
220220 return false;
221221 }
222+ if (chi2_per_ndf < 0.f) {
223+ return false;
224+ }
222225
223226 if (trackType == static_cast<uint8_t>(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) {
224227 if (eta < minEtaGL || maxEtaGL < eta) {
@@ -250,10 +253,6 @@ struct skimmerPrimaryMuon {
250253 template <bool isMC, bool withMFTCov, typename TFwdTracks, typename TMFTTracks, bool fillTable, typename TCollision, typename TFwdTrack, typename TMFTTracksCov>
251254 bool fillFwdTrackTable(TCollision const& collision, TFwdTrack fwdtrack, TMFTTracksCov const& mftCovs, const bool isAmbiguous)
252255 {
253- if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.chi2MatchMCHMFT() > maxMatchingChi2MCHMFT) {
254- return false;
255- } // Users have to decide the best match between MFT and MCH-MID at analysis level. The same global muon is repeatedly stored.
256-
257256 if (fwdtrack.chi2MatchMCHMID() < 0.f) { // this should never happen. only for protection.
258257 return false;
259258 }
@@ -311,6 +310,10 @@ struct skimmerPrimaryMuon {
311310 bool isCorrectMatchMFTMCH = true; // by default, it is true. it is evaluated for global muons in MC.
312311
313312 if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
313+ if (fwdtrack.chi2MatchMCHMFT() < 0.f || maxMatchingChi2MCHMFT < fwdtrack.chi2MatchMCHMFT()) {
314+ return false;
315+ } // Users have to decide the best match between MFT and MCH-MID at analysis level. The same global muon is repeatedly stored.
316+
314317 // apply r-absorber cut here to minimize the number of calling propagateMuon.
315318 if (fwdtrack.rAtAbsorberEnd() < minRabsGL || maxRabs < fwdtrack.rAtAbsorberEnd()) {
316319 return false;
@@ -323,6 +326,9 @@ struct skimmerPrimaryMuon {
323326
324327 auto mchtrack = fwdtrack.template matchMCHTrack_as<TFwdTracks>(); // MCH-MID
325328 auto mfttrack = fwdtrack.template matchMFTTrack_as<TMFTTracks>(); // MFTsa
329+ if (mfttrack.chi2() < 0.f) {
330+ return false;
331+ }
326332
327333 if constexpr (isMC) {
328334 if (!mfttrack.has_mcParticle() || !mchtrack.has_mcParticle() || !fwdtrack.has_mcParticle()) {
@@ -574,6 +580,11 @@ struct skimmerPrimaryMuon {
574580 auto mchtrack = muon_tmp.template matchMCHTrack_as<TFwdTracks>(); // MCH-MID
575581 auto mfttrack = muon_tmp.template matchMFTTrack_as<TMFTTracks>(); // MFTsa
576582
583+ if (muon_tmp.chi2() < 0.f || muon_tmp.chi2MatchMCHMFT() < 0.f || muon_tmp.chi2MatchMCHMID() < 0.f || mfttrack.chi2() < 0.f) { // reject negative chi2, i.e. wrong.
584+ // LOGF(info, "reject: muon_tmp.globalIndex() = %d, muon_tmp.chi2MatchMCHMFT() = %f, muon_tmp.chi2MatchMCHMID() = %f, muon_tmp.chi2() = %f, mfttrack.chi2() = %f", muon_tmp.globalIndex(), muon_tmp.chi2MatchMCHMFT(), muon_tmp.chi2MatchMCHMID(), muon_tmp.chi2(), mfttrack.chi2());
585+ continue;
586+ }
587+
577588 o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(muon_tmp, muon_tmp, collision, propagationPoint::kToVertex, matchingZ, mBz, mZShift);
578589 float pt = propmuonAtPV.getPt();
579590 float eta = propmuonAtPV.getEta();
@@ -593,8 +604,6 @@ struct skimmerPrimaryMuon {
593604 float dcaY = propmuonAtPV.getY() - collision.posY();
594605 float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY);
595606
596- // 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());
597-
598607 if (cfgApplyPreselectionInBestMatch) {
599608 if (!isSelected(pt, eta, muon_tmp.rAtAbsorberEnd(), pDCA, muon_tmp.chi2() / ndf, muon_tmp.trackType(), dcaXY)) {
600609 continue;
@@ -608,7 +617,7 @@ struct skimmerPrimaryMuon {
608617 }
609618
610619 if (0.f < muon_tmp.chi2MatchMCHMFT() && muon_tmp.chi2MatchMCHMFT() < min_chi2MatchMCHMFT) {
611- min_chi2MatchMCHMFT = std::sqrt( muon_tmp.chi2MatchMCHMFT() );
620+ min_chi2MatchMCHMFT = muon_tmp.chi2MatchMCHMFT();
612621 tupleIds_at_min_chi2mftmch = tupleId;
613622 }
614623 }
0 commit comments