]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONRefitter.cxx
The cut on V0 pointing angle is now momentum dependent below 1.5 GeV/c. Above this...
[u/mrichter/AliRoot.git] / MUON / AliMUONRefitter.cxx
index a37435df8923952a439af9912ad87a1f819fac81..035f1d15ce2b307653ca14ccd356148ccd8dce0d 100644 (file)
@@ -110,7 +110,7 @@ AliMUONVTrackStore* AliMUONRefitter::ReconstructFromDigits()
   TIter next(fkESDInterface->CreateTrackIterator());
   while ((track = static_cast<AliMUONTrack*>(next()))) {
     AliMUONTrack *newTrack = RetrackFromDigits(*track);
-    newTrackStore->Add(newTrack);
+    if (newTrack) newTrackStore->Add(newTrack);
     delete newTrack;
   }
   
@@ -163,7 +163,7 @@ AliMUONTrack* AliMUONRefitter::RetrackFromDigits(UInt_t trackId)
 //_____________________________________________________________________________
 AliMUONTrack* AliMUONRefitter::RetrackFromClusters(UInt_t trackId)
 {
-  /// refit track "trackId" form the clusters (i.e. do not re-clusterize)
+  /// refit track "trackId" from the clusters (i.e. do not re-clusterize)
   /// it is the responsability of the user to delete the returned track
   
   if (!fkESDInterface) {
@@ -213,7 +213,7 @@ AliMUONVClusterStore* AliMUONRefitter::ReClusterize(UInt_t trackId, UInt_t clust
   
   // re-clusterize
   TIter next(fkESDInterface->CreateDigitIterator(trackId, clusterId));
-  fClusterServer->UseDigits(next);
+  fClusterServer->UseDigits(next,fkESDInterface->GetDigits());
   fClusterServer->Clusterize(cluster->GetChamberId(),*clusterStore,AliMpArea(),fkRecoParam);
   
   return clusterStore;
@@ -247,7 +247,7 @@ AliMUONVClusterStore* AliMUONRefitter::ReClusterize(UInt_t clusterId)
   
   // re-clusterize
   TIter next(fkESDInterface->CreateDigitIteratorInCluster(clusterId));
-  fClusterServer->UseDigits(next);
+  fClusterServer->UseDigits(next,fkESDInterface->GetDigits());
   fClusterServer->Clusterize(cluster->GetChamberId(),*clusterStore,AliMpArea(),fkRecoParam);
   
   return clusterStore;
@@ -307,7 +307,7 @@ AliMUONTrack* AliMUONRefitter::RetrackFromDigits(const AliMUONTrack& track)
     
     // re-clusterize current cluster
     TIter nextDigit(fkESDInterface->CreateDigitIterator(trackId, cluster->GetUniqueID()));
-    fClusterServer->UseDigits(nextDigit);
+    fClusterServer->UseDigits(nextDigit,fkESDInterface->GetDigits());
     Int_t nNewClusters = fClusterServer->Clusterize(cluster->GetChamberId(),*newClusterStore,AliMpArea(),fkRecoParam);
     
     // check that re-clusterizing succeeded
@@ -319,13 +319,19 @@ AliMUONTrack* AliMUONRefitter::RetrackFromDigits(const AliMUONTrack& track)
     }
     
     // add the new cluster(s) to the tracks
-    AddClusterToTracks(*newClusterStore, *newTrackStore);
+    if (!AddClusterToTracks(*newClusterStore, *newTrackStore)) {
+      delete newClusterStore;
+      delete newTrackStore;
+      return 0x0;
+    }
     
   }
   
+  if (newTrackStore->GetSize() > 1000) AliInfo(Form("%d tracks to refit... be patient!!",newTrackStore->GetSize()));
+                                              
   // refit the tracks and pick up the best one
   AliMUONTrack *currentTrack, *bestTrack = 0x0;
-  Double_t currentChi2, bestChi2 = 1.e10;
+  Double_t currentChi2, bestChi2 = AliMUONTrack::MaxChi2();
   Int_t currentNCluster, bestNClusters = 0;
   TIter next(newTrackStore->CreateIterator());
   while ((currentTrack = static_cast<AliMUONTrack*>(next()))) {
@@ -335,7 +341,7 @@ AliMUONTrack* AliMUONRefitter::RetrackFromDigits(const AliMUONTrack& track)
     if (param) *param = *((AliMUONTrackParam*) track.GetTrackParamAtCluster()->First());
     
     // refit the track
-    if (!fTracker->RefitTrack(*currentTrack)) break;
+    if (!fTracker->RefitTrack(*currentTrack)) continue;
     
     // find best track (the one with the higher number of cluster or the best chi2 in case of equality)
     currentNCluster = currentTrack->GetNClusters();
@@ -357,14 +363,20 @@ AliMUONTrack* AliMUONRefitter::RetrackFromDigits(const AliMUONTrack& track)
 }
 
 //_____________________________________________________________________________
-void AliMUONRefitter::AddClusterToTracks(const AliMUONVClusterStore &clusterStore, AliMUONVTrackStore &trackStore)
+Bool_t AliMUONRefitter::AddClusterToTracks(const AliMUONVClusterStore &clusterStore, AliMUONVTrackStore &trackStore)
 {
   /// add clusters to each of the given tracks
   /// duplicate the tracks if there are several clusters and add one cluster per copy
   
   // create new track store if there are more than 1 cluster to add per track
   Int_t nClusters = clusterStore.GetSize();
-  if (nClusters < 1) return;
+  if (nClusters < 1) return kTRUE;
+  
+  // check if we will exceed the maximum allowed number of tracks
+  if (nClusters * trackStore.GetSize() > fkRecoParam->GetMaxTrackCandidates()) {
+    AliError(Form("Too many track candidates (%d tracks). Stop refitting.", nClusters * trackStore.GetSize()));
+    return kFALSE;
+  }
   
   AliMUONTrackParam dummyParam;
   AliMUONTrack *currentTrack, *track;
@@ -381,7 +393,7 @@ void AliMUONRefitter::AddClusterToTracks(const AliMUONVClusterStore &clusterStor
     
     // add the new cluster(s) to the tracks
     // duplicate the tracks if there are several clusters
-    // the loop after loading the last cluster which is added to the current track
+    // stop the loop after loading the last cluster which is added to the current track
     iCluster = 0;
     TIter nextCluster(clusterStore.CreateIterator());
     while ((newCluster = static_cast<AliMUONVCluster*>(nextCluster())) && (iCluster < nClusters - 1)) {
@@ -409,5 +421,7 @@ void AliMUONRefitter::AddClusterToTracks(const AliMUONVClusterStore &clusterStor
     
   }
   
+  return kTRUE;
+  
 }