+
+//_____________________________________________________________________________
+void AliMUONTracker::FillESD(const AliMUONVTrackStore& trackStore, AliESDEvent* esd) const
+{
+ /// Fill the ESD from the trackStore
+ AliDebug(1,"");
+ AliCodeTimerAuto("",0)
+
+ // get ITS vertex
+ Double_t vertex[3] = {0., 0., 0.};
+ const AliESDVertex* esdVert = esd->GetVertex();
+ if (esdVert->GetNContributors() > 0 || !strcmp(esdVert->GetTitle(),"vertexer: smearMC")) {
+ esdVert->GetXYZ(vertex);
+ AliDebug(1,Form("found vertex (%e,%e,%e)",vertex[0],vertex[1],vertex[2]));
+ }
+
+ // fill ESD event including all info in ESD cluster if required and only for the given fraction of events
+ AliMUONTrack* track;
+ AliMUONLocalTrigger* locTrg;
+ TIter next(trackStore.CreateIterator());
+ if (GetRecoParam()->SaveFullClusterInESD() &&
+ gRandom->Uniform(100.) <= GetRecoParam()->GetPercentOfFullClusterInESD()) {
+
+ while ( ( track = static_cast<AliMUONTrack*>(next()) ) ) {
+
+ if (track->GetMatchTrigger() > 0) {
+ locTrg = static_cast<AliMUONLocalTrigger*>(fTriggerStore->FindLocal(track->LoCircuit()));
+ AliMUONESDInterface::MUONToESD(*track, *esd, vertex, &fkDigitStore, locTrg);
+ } else AliMUONESDInterface::MUONToESD(*track, *esd, vertex, &fkDigitStore);
+
+ }
+
+ } else {
+
+ while ( ( track = static_cast<AliMUONTrack*>(next()) ) ) {
+
+ if (track->GetMatchTrigger() > 0) {
+ locTrg = static_cast<AliMUONLocalTrigger*>(fTriggerStore->FindLocal(track->LoCircuit()));
+ AliMUONESDInterface::MUONToESD(*track, *esd, vertex, 0x0, locTrg);
+ } else AliMUONESDInterface::MUONToESD(*track, *esd, vertex);
+
+ }
+
+ }
+
+ // fill the local trigger decisions not matched with tracks (associate them to "ghost" tracks)
+ UInt_t ghostId = 0xFFFFFFFF - 1;
+ Bool_t matched = kFALSE;
+ AliMUONTriggerTrack *triggerTrack;
+ TIter itTriggerTrack(fTriggerTrackStore->CreateIterator());
+ while ( ( triggerTrack = static_cast<AliMUONTriggerTrack*>(itTriggerTrack()) ) ) {
+
+ locTrg = static_cast<AliMUONLocalTrigger*>(fTriggerStore->FindLocal(triggerTrack->GetLoTrgNum()));
+
+ // check if this local trigger has already been matched
+ TIter itTrack(trackStore.CreateIterator());
+ while ( ( track = static_cast<AliMUONTrack*>(itTrack()) ) ) {
+ matched = (track->LoCircuit() == locTrg->LoCircuit());
+ if (matched) break;
+ }
+ if (matched) continue;
+
+ AliMUONESDInterface::MUONToESD(*locTrg, *esd, ghostId, triggerTrack);
+
+ ghostId -= 1;
+ }
+
+}
+
+//_____________________________________________________________________________
+AliMUONVTrackReconstructor* AliMUONTracker::CreateTrackReconstructor(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer)
+{
+ /// Create track reconstructor, depending on tracking mode set in RecoParam
+
+ AliMUONVTrackReconstructor* trackReco(0x0);
+
+ TString opt(recoParam->GetTrackingMode());
+ opt.ToUpper();
+
+ if (strstr(opt,"ORIGINAL"))
+ {
+ trackReco = new AliMUONTrackReconstructor(recoParam,clusterServer);
+ }
+ else if (strstr(opt,"KALMAN"))
+ {
+ trackReco = new AliMUONTrackReconstructorK(recoParam,clusterServer);
+ }
+ else
+ {
+ AliErrorClass(Form("tracking mode \"%s\" does not exist",opt.Data()));
+ return 0x0;
+ }
+
+ AliDebugClass(1,Form("Will use %s for tracking",trackReco->ClassName()));
+
+ return trackReco;
+}
+
+//_____________________________________________________________________________
+void AliMUONTracker::UnloadClusters()
+{
+ /// Clear internal clusterStore
+
+ fInputClusterStore->Clear();
+}
+
+
+//_____________________________________________________________________________
+void
+AliMUONTracker::SetupClusterServer(AliMUONVClusterServer& clusterServer)
+{
+ /// Setup the cluster server
+
+ if ( GetRecoParam()->BypassSt4() ||
+ GetRecoParam()->BypassSt5() )
+ {
+ Bool_t ok = clusterServer.UseTriggerTrackStore(TriggerTrackStore());
+
+ TString msg1;
+ TString msg2;
+
+ if ( GetRecoParam()->BypassSt45() )
+ {
+ msg1 = "STATIONS 4 AND 5";
+ msg2 = "THOSE TWO STATIONS";
+ }
+ else if ( GetRecoParam()->BypassSt4() )
+ {
+ msg1 = "STATION 4";
+ msg2 = "THAT STATION";
+ }
+ else if ( GetRecoParam()->BypassSt5() )
+ {
+ msg1 = "STATION 5";
+ msg2 = "THAT STATION";
+ }
+
+ if ( ok )
+ {
+ AliWarning(Form("WILL USE TRIGGER TRACKS TO GENERATE CLUSTERS IN %s, "
+ "THUS BYPASSING REAL CLUSTERS IN %s!!!",msg1.Data(),msg2.Data()));
+ }
+ else
+ {
+ AliWarning("BYPASSING OF ST4 AND/OR 5 REQUESTED, BUT CLUSTERSERVER DOES NOT SEEM TO SUPPORT IT !!!");
+ }
+ }
+}
+
+