@@ -183,7 +183,7 @@ struct skimmerPrimaryMuon {
183183 if (maxDCAxy < dcaXY) {
184184 return false ;
185185 }
186- if (chi2_per_ndf < 0 . f || maxChi2GL < chi2_per_ndf) {
186+ if (maxChi2GL < chi2_per_ndf) {
187187 return false ;
188188 }
189189 if (rAtAbsorberEnd < minRabsGL || maxRabs < rAtAbsorberEnd) {
@@ -193,7 +193,7 @@ struct skimmerPrimaryMuon {
193193 if (eta < minEtaSA || maxEtaSA < eta) {
194194 return false ;
195195 }
196- if (chi2_per_ndf < 0 . f || maxChi2SA < chi2_per_ndf) {
196+ if (maxChi2SA < chi2_per_ndf) {
197197 return false ;
198198 }
199199 } else {
@@ -214,14 +214,17 @@ struct skimmerPrimaryMuon {
214214 return ;
215215 }
216216
217- o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon (fwdtrack, collision, propagationPoint::kToVertex );
218- o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon (fwdtrack, collision, propagationPoint::kToDCA );
217+ if (fwdtrack.chi2 () < 0 .f ) { // this should never happen. only for protection.
218+ return ;
219+ }
219220
221+ o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon (fwdtrack, collision, propagationPoint::kToVertex );
220222 float pt = propmuonAtPV.getPt ();
221223 float eta = propmuonAtPV.getEta ();
222224 float phi = propmuonAtPV.getPhi ();
223225 o2::math_utils::bringTo02Pi (phi);
224226
227+ o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon (fwdtrack, collision, propagationPoint::kToDCA );
225228 float cXXatDCA = propmuonAtDCA.getSigma2X ();
226229 float cYYatDCA = propmuonAtDCA.getSigma2Y ();
227230 float cXYatDCA = propmuonAtDCA.getSigmaXY ();
@@ -255,24 +258,41 @@ struct skimmerPrimaryMuon {
255258 int ndf_mchmft = 1 ;
256259
257260 if (fwdtrack.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
261+ // apply r-absorber cut here to minimize the number of calling propagateMuon.
262+ if (fwdtrack.rAtAbsorberEnd () < minRabsGL || maxRabs < fwdtrack.rAtAbsorberEnd ()) {
263+ return ;
264+ }
265+
266+ // apply dca cut here to minimize the number of calling propagateMuon.
267+ if (maxDCAxy < dcaXY) {
268+ return ;
269+ }
270+
258271 const auto & mchtrack = fwdtrack.template matchMCHTrack_as <TFwdTracks>(); // MCH-MID
272+ const auto & mfttrack = fwdtrack.template matchMFTTrack_as <TMFTTracks>(); // MFTsa
273+ nClustersMFT = mfttrack.nClusters ();
274+ mftClusterSizesAndTrackFlags = mfttrack.mftClusterSizesAndTrackFlags ();
275+ ndf_mchmft = 2 .f * (mchtrack.nClusters () + nClustersMFT) - 5 .f ;
276+ chi2mft = mfttrack.chi2 ();
277+ // chi2mft = mfttrack.chi2() / (2.f * nClustersMFT - 5.f);
278+
279+ // apply chi2/ndf cut here to minimize the number of calling propagateMuon.
280+ if (maxChi2GL < fwdtrack.chi2 () / ndf_mchmft) {
281+ return ;
282+ }
283+
259284 o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon (mchtrack, collision, propagationPoint::kToVertex );
260285 ptMatchedMCHMID = propmuonAtPV_Matched.getPt ();
261286 etaMatchedMCHMID = propmuonAtPV_Matched.getEta ();
262287 phiMatchedMCHMID = propmuonAtPV_Matched.getPhi ();
263288 o2::math_utils::bringTo02Pi (phiMatchedMCHMID);
289+
264290 o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon (mchtrack, collision, propagationPoint::kToDCA );
265291 float dcaX_Matched = propmuonAtDCA_Matched.getX () - collision.posX ();
266292 float dcaY_Matched = propmuonAtDCA_Matched.getY () - collision.posY ();
267293 float dcaXY_Matched = std::sqrt (dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched);
268294 pDCA = mchtrack.p () * dcaXY_Matched;
269295
270- const auto & mfttrack = fwdtrack.template matchMFTTrack_as <TMFTTracks>();
271- nClustersMFT = mfttrack.nClusters ();
272- mftClusterSizesAndTrackFlags = mfttrack.mftClusterSizesAndTrackFlags ();
273- chi2mft = mfttrack.chi2 () / (2 .f * nClustersMFT - 5 .f );
274- ndf_mchmft = 2 .f * (mchtrack.nClusters () + nClustersMFT) - 5 .f ;
275-
276296 if (refitGlobalMuon) {
277297 eta = mfttrack.eta ();
278298 phi = mfttrack.phi ();
0 commit comments