+//__________________________________________________________________________
+Bool_t AliMUONVTrackReconstructor::IsAcceptable(AliMUONTrackParam &trackParam)
+{
+ /// Return kTRUE if the track is within given limits on momentum/angle/origin
+
+ const TMatrixD& kParamCov = trackParam.GetCovariances();
+ Int_t chamber = trackParam.GetClusterPtr()->GetChamberId();
+ Double_t z = trackParam.GetZ();
+ Double_t sigmaCut = GetRecoParam()->GetSigmaCutForTracking();
+
+ // MCS dipersion
+ Double_t angleMCS2 = 0.;
+ Double_t impactMCS2 = 0.;
+ if (AliMUONTrackExtrap::IsFieldON() && chamber < 6) {
+
+ // track momentum is known
+ for (Int_t iCh=0; iCh<=chamber; iCh++) {
+ Double_t localMCS2 = AliMUONTrackExtrap::GetMCSAngle2(trackParam, AliMUONConstants::ChamberThicknessInX0(iCh), 1.);
+ angleMCS2 += localMCS2;
+ impactMCS2 += AliMUONConstants::DefaultChamberZ(chamber) * AliMUONConstants::DefaultChamberZ(chamber) * localMCS2;
+ }
+
+ } else {
+
+ // track momentum is unknown
+ for (Int_t iCh=0; iCh<=chamber; iCh++) {
+ angleMCS2 += fMaxMCSAngle2[iCh];
+ impactMCS2 += AliMUONConstants::DefaultChamberZ(chamber) * AliMUONConstants::DefaultChamberZ(chamber) * fMaxMCSAngle2[iCh];
+ }
+
+ }
+
+ // ------ track selection in non bending direction ------
+ if (GetRecoParam()->SelectOnTrackSlope()) {
+
+ // check if non bending slope is within tolerances
+ Double_t nonBendingSlopeErr = TMath::Sqrt(kParamCov(1,1) + angleMCS2);
+ if ((TMath::Abs(trackParam.GetNonBendingSlope()) - sigmaCut * nonBendingSlopeErr) > GetRecoParam()->GetMaxNonBendingSlope()) return kFALSE;
+
+ } else {
+
+ // or check if non bending impact parameter is within tolerances
+ Double_t nonBendingImpactParam = TMath::Abs(trackParam.GetNonBendingCoor() - z * trackParam.GetNonBendingSlope());
+ Double_t nonBendingImpactParamErr = TMath::Sqrt(kParamCov(0,0) + z * z * kParamCov(1,1) - 2. * z * kParamCov(0,1) + impactMCS2);
+ if ((nonBendingImpactParam - sigmaCut * nonBendingImpactParamErr) > (3. * GetRecoParam()->GetNonBendingVertexDispersion())) return kFALSE;
+
+ }
+
+ // ------ track selection in bending direction ------
+ if (AliMUONTrackExtrap::IsFieldON()) { // depending whether the field is ON or OFF
+
+ // check if bending momentum is within tolerances
+ Double_t bendingMomentum = TMath::Abs(1. / trackParam.GetInverseBendingMomentum());
+ Double_t bendingMomentumErr = TMath::Sqrt(kParamCov(4,4)) * bendingMomentum * bendingMomentum;
+ if (chamber < 6 && (bendingMomentum + sigmaCut * bendingMomentumErr) < GetRecoParam()->GetMinBendingMomentum()) return kFALSE;
+ else if ((bendingMomentum + 3. * bendingMomentumErr) < GetRecoParam()->GetMinBendingMomentum()) return kFALSE;
+
+ } else {
+
+ if (GetRecoParam()->SelectOnTrackSlope()) {
+
+ // check if bending slope is within tolerances
+ Double_t bendingSlopeErr = TMath::Sqrt(kParamCov(3,3) + angleMCS2);
+ if ((TMath::Abs(trackParam.GetBendingSlope()) - sigmaCut * bendingSlopeErr) > GetRecoParam()->GetMaxBendingSlope()) return kFALSE;
+
+ } else {
+
+ // or check if bending impact parameter is within tolerances
+ Double_t bendingImpactParam = TMath::Abs(trackParam.GetBendingCoor() - z * trackParam.GetBendingSlope());
+ Double_t bendingImpactParamErr = TMath::Sqrt(kParamCov(2,2) + z * z * kParamCov(3,3) - 2. * z * kParamCov(2,3) + impactMCS2);
+ if ((bendingImpactParam - sigmaCut * bendingImpactParamErr) > (3. * GetRecoParam()->GetBendingVertexDispersion())) return kFALSE;
+
+ }
+
+ }
+
+ return kTRUE;
+
+}
+
+//__________________________________________________________________________