TIter next(fkESDInterface->CreateTrackIterator());
while ((track = static_cast<AliMUONTrack*>(next()))) {
AliMUONTrack *newTrack = RetrackFromDigits(*track);
- newTrackStore->Add(newTrack);
+ if (newTrack) newTrackStore->Add(newTrack);
delete newTrack;
}
//_____________________________________________________________________________
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) {
// 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;
// re-clusterize
TIter next(fkESDInterface->CreateDigitIteratorInCluster(clusterId));
- fClusterServer->UseDigits(next);
+ fClusterServer->UseDigits(next,fkESDInterface->GetDigits());
fClusterServer->Clusterize(cluster->GetChamberId(),*clusterStore,AliMpArea(),fkRecoParam);
return clusterStore;
// 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
}
// 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()))) {
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();
}
//_____________________________________________________________________________
-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;
// 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)) {
}
+ return kTRUE;
+
}