+Int_t AliMUONTrack::ClustersInCommon(AliMUONTrack* track) const
+{
+ /// Returns the number of clusters in common between the current track ("this")
+ /// and the track pointed to by "track".
+ Int_t clustersInCommon = 0;
+ AliMUONTrackParam *trackParamAtCluster1, *trackParamAtCluster2;
+ // Loop over clusters of first track
+ trackParamAtCluster1 = (AliMUONTrackParam*) this->fTrackParamAtCluster->First();
+ while (trackParamAtCluster1) {
+ // Loop over clusters of second track
+ trackParamAtCluster2 = (AliMUONTrackParam*) track->fTrackParamAtCluster->First();
+ while (trackParamAtCluster2) {
+ // Increment "clustersInCommon" if both trackParamAtCluster1 & 2 point to the same cluster
+ if ((trackParamAtCluster1->GetClusterPtr()) == (trackParamAtCluster2->GetClusterPtr())) {
+ clustersInCommon++;
+ break;
+ }
+ trackParamAtCluster2 = (AliMUONTrackParam*) track->fTrackParamAtCluster->After(trackParamAtCluster2);
+ } // trackParamAtCluster2
+ trackParamAtCluster1 = (AliMUONTrackParam*) this->fTrackParamAtCluster->After(trackParamAtCluster1);
+ } // trackParamAtCluster1
+ return clustersInCommon;
+}
+
+ //__________________________________________________________________________
+Double_t AliMUONTrack::GetNormalizedChi2() const
+{
+ /// return the chi2 value divided by the number of degrees of freedom (or 1.e10 if ndf < 0)
+
+ Double_t numberOfDegFree = (2. * GetNClusters() - 5.);
+ if (numberOfDegFree > 0.) return fGlobalChi2 / numberOfDegFree;
+ else return 1.e10;
+}
+
+ //__________________________________________________________________________
+Bool_t* AliMUONTrack::CompatibleTrack(AliMUONTrack *track, Double_t sigma2Cut) const
+{
+ /// for each chamber: return kTRUE (kFALSE) if clusters are compatible (not compatible)
+ AliMUONTrackParam *trackParamAtCluster1, *trackParamAtCluster2;
+ AliMUONVCluster *cluster1, *cluster2;
+ Double_t chi2, dX, dY, dZ;
+ Double_t chi2Max = sigma2Cut * sigma2Cut;
+ Double_t dZMax = 1.; // 1 cm
+
+ Bool_t *compatibleCluster = new Bool_t[AliMUONConstants::NTrackingCh()];
+ for ( Int_t ch = 0; ch < AliMUONConstants::NTrackingCh(); ch++) compatibleCluster[ch] = kFALSE;
+
+ // Loop over clusters of first track
+ trackParamAtCluster1 = (AliMUONTrackParam*) this->fTrackParamAtCluster->First();
+ while (trackParamAtCluster1) {
+
+ cluster1 = trackParamAtCluster1->GetClusterPtr();
+
+ // Loop over clusters of second track
+ trackParamAtCluster2 = (AliMUONTrackParam*) track->fTrackParamAtCluster->First();
+ while (trackParamAtCluster2) {
+
+ cluster2 = trackParamAtCluster2->GetClusterPtr();
+
+ //prepare next step
+ trackParamAtCluster2 = (AliMUONTrackParam*) track->fTrackParamAtCluster->After(trackParamAtCluster2);
+
+ // z direction
+ dZ = cluster1->GetZ() - cluster2->GetZ();
+ if (dZ > dZMax) continue;
+
+ // non bending direction
+ dX = cluster1->GetX() - cluster2->GetX();
+ chi2 = dX * dX / (cluster1->GetErrX2() + cluster2->GetErrX2());
+ if (chi2 > chi2Max) continue;
+
+ // bending direction
+ dY = cluster1->GetY() - cluster2->GetY();
+ chi2 = dY * dY / (cluster1->GetErrY2() + cluster2->GetErrY2());
+ if (chi2 > chi2Max) continue;
+
+ compatibleCluster[cluster1->GetChamberId()] = kTRUE;
+ break;
+ }
+
+ trackParamAtCluster1 = (AliMUONTrackParam*) this->fTrackParamAtCluster->After(trackParamAtCluster1);
+ }
+
+ return compatibleCluster;
+}
+
+//__________________________________________________________________________
+AliMUONTrackParam* AliMUONTrack::GetTrackParamAtVertex()
+{
+ /// return reference to track parameters at vertex (create it before if needed)
+ if (!fTrackParamAtVertex) fTrackParamAtVertex = new AliMUONTrackParam();
+ return fTrackParamAtVertex;
+}
+
+//__________________________________________________________________________
+void AliMUONTrack::SetTrackParamAtVertex(const AliMUONTrackParam* trackParam)
+{
+ /// set track parameters at vertex
+ if (trackParam == 0x0) return;
+ if (fTrackParamAtVertex) *fTrackParamAtVertex = *trackParam;
+ else fTrackParamAtVertex = new AliMUONTrackParam(*trackParam);
+}
+
+//__________________________________________________________________________
+void AliMUONTrack::RecursiveDump() const