fkESDInterface(0x0),
fGeometryTransformer(0x0),
fClusterServer(0x0),
- fTracker(0x0)
+ fTracker(0x0),
+ nextClusterIndex(0)
{
/// Default constructor
CreateGeometryTransformer();
CreateClusterServer(*fGeometryTransformer);
- if (fClusterServer) fTracker = AliMUONTracker::CreateTrackReconstructor(recoParam,fClusterServer);
+ if (fClusterServer) fTracker = AliMUONTracker::CreateTrackReconstructor(recoParam,fClusterServer,fGeometryTransformer);
if (!fClusterServer || !fTracker) {
AliFatal("refitter initialization failed");
exit(-1);
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);
+ // set the uniqueID of the new clusters
+ TIter nextCl(clusterStore->CreateIterator());
+ AliMUONVCluster* newCluster = 0x0;
+ while ((newCluster = static_cast<AliMUONVCluster*>(nextCl())))
+ newCluster->SetUniqueID(AliMUONVCluster::BuildUniqueID(cluster->GetChamberId(), cluster->GetDetElemId(), nextClusterIndex++));
+
return clusterStore;
}
// re-clusterize
TIter next(fkESDInterface->CreateDigitIteratorInCluster(clusterId));
- fClusterServer->UseDigits(next);
+ fClusterServer->UseDigits(next,fkESDInterface->GetDigits());
fClusterServer->Clusterize(cluster->GetChamberId(),*clusterStore,AliMpArea(),fkRecoParam);
+ // set the uniqueID of the new clusters
+ TIter nextCl(clusterStore->CreateIterator());
+ AliMUONVCluster* newCluster = 0x0;
+ while ((newCluster = static_cast<AliMUONVCluster*>(nextCl())))
+ newCluster->SetUniqueID(AliMUONVCluster::BuildUniqueID(cluster->GetChamberId(), cluster->GetDetElemId(), nextClusterIndex++));
+
return clusterStore;
}
// check if digits exist
UInt_t trackId = track.GetUniqueID();
- if (fkESDInterface->GetNDigits(trackId) == 0) {
+ if (!fkESDInterface->DigitsStored(trackId)) {
AliError(Form("no digit attached to track #%d",trackId));
return 0x0;
}
// 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
continue;
}
+ // set the uniqueID of the new clusters
+ TIter nextCl(newClusterStore->CreateIterator());
+ AliMUONVCluster* newCluster = 0x0;
+ while ((newCluster = static_cast<AliMUONVCluster*>(nextCl())))
+ newCluster->SetUniqueID(AliMUONVCluster::BuildUniqueID(cluster->GetChamberId(), cluster->GetDetElemId(), nextClusterIndex++));
+
// 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)
+ // check the status of the improvement if enabled
+ if (fkRecoParam->ImproveTracks() && !currentTrack->IsImproved()) continue;
+
+ // find best track (the one with the highest number of cluster or the best chi2 in case of equality)
currentNCluster = currentTrack->GetNClusters();
currentChi2 = currentTrack->GetGlobalChi2();
if (currentNCluster > bestNClusters || (currentNCluster == bestNClusters && currentChi2 < bestChi2)) {
}
//_____________________________________________________________________________
-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;
+
}