@@ -70,11 +70,8 @@ struct FwdTrackPropagation {
7070 Configurable<float > maxPDCAforSmallR{" maxPDCAforSmallR" , 594 .f , " max. pDCA for small R at absorber end" };
7171 Configurable<float > maxMatchingChi2MCHMFT{" maxMatchingChi2MCHMFT" , 50 .f , " max. chi2 for MCH-MFT matching" };
7272 Configurable<float > maxChi2SA{" maxChi2SA" , 1e+6 , " max. chi2 for standalone muon" };
73- Configurable<float > maxChi2GL{" maxChi2GL" , 1e+6 , " max. chi2 for global muon" };
73+ Configurable<float > maxChi2GL{" maxChi2GL" , 50 . f , " max. chi2 for global muon" };
7474 Configurable<bool > refitGlobalMuon{" refitGlobalMuon" , true , " flag to refit global muon" };
75- Configurable<bool > applyDEtaDPhi{" cfgApplyDEtaDPhi" , false , " flag to apply deta-dphi elliptic cut" };
76- Configurable<float > minDEta{" minDEta" , 0.1 , " min deta between MFT-MCH-MID and its attached MID-MCH at PV" };
77- Configurable<float > minDPhi{" minDPhi" , 0.1 , " min dphi between MFT-MCH-MID and its attached MID-MCH at PV" };
7875
7976 HistogramRegistry fRegistry {" fRegistry" };
8077 static constexpr std::string_view muon_types[5 ] = {" MFTMCHMID/" , " MFTMCHMIDOtherMatch/" , " MFTMCH/" , " MCHMID/" , " MCH/" };
@@ -193,89 +190,16 @@ struct FwdTrackPropagation {
193190 return true ;
194191 }
195192
196- template <typename TFwdTracks , typename TMFTTracks , typename TCollision , typename TTarget, typename TCandidates >
197- bool isBestMatch (TCollision const & collision, TTarget const & target, TCandidates const & candidates )
193+ template <typename TCollision , typename TFwdTrack , typename TFwdTracks , typename TMFTTracks >
194+ void fillFwdTrackTable (TCollision const & collision, TFwdTrack fwdtrack, TFwdTracks const &, TMFTTracks const &, const bool isAmbiguous )
198195 {
199- std::map<int64_t , float > map_chi2MFTMCH;
200- for (const auto & matchedtrack : candidates) { // MFT-MCH-MID or MFT-MCH
201- if (matchedtrack.trackType () != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
202- continue ;
203- }
204- o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon (matchedtrack, collision, propagationPoint::kToVertex );
205- float eta = propmuonAtPV.getEta ();
206- float phi = propmuonAtPV.getPhi ();
207- if (refitGlobalMuon) {
208- const auto & mfttrack = matchedtrack.template matchMFTTrack_as <TMFTTracks>();
209- eta = mfttrack.eta ();
210- phi = mfttrack.phi ();
211- }
212- o2::math_utils::bringTo02Pi (phi);
213- if (eta < minEtaGL || maxEtaGL < eta) {
214- continue ;
215- }
216-
217- const auto & mchtrack = matchedtrack.template matchMCHTrack_as <TFwdTracks>(); // MCH-MID
218- o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon (mchtrack, collision, propagationPoint::kToVertex );
219- float etaMatchedMCHMID = propmuonAtPV_Matched.getEta ();
220- float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi ();
221- o2::math_utils::bringTo02Pi (phiMatchedMCHMID);
222-
223- float deta = etaMatchedMCHMID - eta;
224- float dphi = phiMatchedMCHMID - phi;
225- o2::math_utils::bringToPMPi (dphi);
226- if (applyDEtaDPhi && std::sqrt (std::pow (deta / minDEta, 2 ) + std::pow (dphi / minDPhi, 2 )) > 1 .f ) {
227- continue ;
228- }
229-
230- if (matchedtrack.chi2 () < 0 .f || maxChi2GL < matchedtrack.chi2 ()) {
231- continue ;
232- }
233-
234- float rAtAbsorberEnd = matchedtrack.rAtAbsorberEnd (); // this works only for GlobalMuonTrack
235- if (rAtAbsorberEnd < minRabsGL || maxRabs < rAtAbsorberEnd) {
236- continue ;
237- }
238- o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon (matchedtrack, collision, propagationPoint::kToDCA );
239- float dcaX = propmuonAtDCA.getX () - collision.posX ();
240- float dcaY = propmuonAtDCA.getY () - collision.posY ();
241- float dcaXY = std::sqrt (dcaX * dcaX + dcaY * dcaY);
242- if (maxDCAxy < dcaXY) {
243- continue ;
244- }
245-
246- o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon (mchtrack, collision, propagationPoint::kToDCA );
247- float dcaX_Matched = propmuonAtDCA_Matched.getX () - collision.posX ();
248- float dcaY_Matched = propmuonAtDCA_Matched.getY () - collision.posY ();
249- float dcaXY_Matched = std::sqrt (dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched);
250- float pDCA = mchtrack.p () * dcaXY_Matched;
251-
252- if (rAtAbsorberEnd < midRabs ? pDCA > maxPDCAforSmallR : pDCA > maxPDCAforLargeR) {
253- continue ;
254- }
255-
256- map_chi2MFTMCH[matchedtrack.globalIndex ()] = matchedtrack.chi2MatchMCHMFT ();
257- }
258- if (map_chi2MFTMCH.begin ()->first != target.globalIndex ()) { // search for minimum matching chi2
259- map_chi2MFTMCH.clear ();
260- return false ;
261- }
262- map_chi2MFTMCH.clear ();
196+ if (fwdtrack.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && (fwdtrack.chi2MatchMCHMFT () > maxMatchingChi2MCHMFT || fwdtrack.chi2 () > maxChi2GL)) {
197+ return ;
198+ } // Users have to decide the best match between MFT and MCH-MID at analysis level. The same global muon is repeatedly stored.
263199
264- if (target. chi2MatchMCHMFT () > maxMatchingChi2MCHMFT ) {
265- return false ;
200+ if (fwdtrack. chi2MatchMCHMID () < 0 . f ) { // this should never happen. only for protection.
201+ return ;
266202 }
267- return true ;
268- }
269-
270- template <typename TCollision, typename TFwdTrack, typename TFwdTracks, typename TMFTTracks>
271- void fillFwdTrackTable (TCollision const & collision, TFwdTrack fwdtrack, TFwdTracks const & fwdtracks, TMFTTracks const &, const bool isAmbiguous)
272- {
273- if (fwdtrack.trackType () == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) {
274- const auto & matchedGlobalTracks = fwdtracks.sliceBy (perMFTTrack, fwdtrack.matchMFTTrackId ()); // MFT-MCH-MID or MFT-MCH
275- if (!isBestMatch<TFwdTracks, TMFTTracks>(collision, fwdtrack, matchedGlobalTracks)) {
276- return ;
277- }
278- } // find the best match between MFT and MCH-MID
279203
280204 o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon (fwdtrack, collision, propagationPoint::kToVertex );
281205 o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon (fwdtrack, collision, propagationPoint::kToDCA );
0 commit comments