+//________________________________________________________________________
+void AliMUON::Reconstruct() const
+{
+
+// AliLoader* loader = GetLoader();
+
+ AliRunLoader* runLoader = fLoader->GetRunLoader();
+ Int_t nEvents = runLoader->GetNumberOfEvents();
+
+// used local container for each method
+// passing fLoader as argument, could be avoided ???
+ AliMUONEventReconstructor* recoEvent = new AliMUONEventReconstructor(fLoader);
+ AliMUONData* dataEvent = recoEvent->GetMUONData();
+
+ AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(fLoader);
+ AliMUONData* dataCluster = recoCluster->GetMUONData();
+
+ AliMUONTriggerDecision* trigDec = new AliMUONTriggerDecision(fLoader);
+ AliMUONData* dataTrig = trigDec->GetMUONData();
+
+
+ for (Int_t i = 0; i < 10; i++) {
+ AliMUONClusterFinderVS *RecModel = new AliMUONClusterFinderVS();
+ RecModel->SetGhostChi2Cut(10);
+ recoCluster->SetReconstructionModel(i,RecModel);
+ }
+
+ fLoader->LoadDigits("READ");
+ fLoader->LoadRecPoints("RECREATE");
+ fLoader->LoadTracks("RECREATE");
+
+ // Loop over events
+ for(Int_t ievent = 0; ievent < nEvents; ievent++) {
+ printf("Event %d\n",ievent);
+ runLoader->GetEvent(ievent);
+
+ //----------------------- digit2cluster & Digits2Trigger -------------------
+ if (!fLoader->TreeR()) fLoader->MakeRecPointsContainer();
+
+ // tracking branch
+ dataCluster->MakeBranch("RC");
+ dataCluster->SetTreeAddress("D,RC");
+ recoCluster->Digits2Clusters();
+ dataCluster->Fill("RC");
+
+ // trigger branch
+ dataTrig->MakeBranch("GLT");
+ dataTrig->SetTreeAddress("D,GLT");
+ trigDec->Digits2Trigger();
+ dataTrig->Fill("GLT");
+
+ fLoader->WriteRecPoints("OVERWRITE");
+
+ //---------------------------- Track & TriggerTrack ---------------------
+ if (!fLoader->TreeT()) fLoader->MakeTracksContainer();
+ // tracking branch
+ dataEvent->MakeBranch("RT"); //track
+ dataEvent->SetTreeAddress("RT");
+ recoEvent->EventReconstruct();
+ dataEvent->Fill("RT");
+
+ // trigger branch
+ dataEvent->MakeBranch("RL"); //trigger track
+ dataEvent->SetTreeAddress("RL");
+ recoEvent->EventReconstructTrigger();
+ dataEvent->Fill("RL");
+
+ fLoader->WriteTracks("OVERWRITE");
+
+ //--------------------------- Resetting branches -----------------------
+ dataCluster->ResetDigits();
+ dataCluster->ResetRawClusters();
+
+ dataTrig->ResetDigits();
+ dataTrig->ResetTrigger();
+
+ dataEvent->ResetRawClusters();
+ dataEvent->ResetTrigger();
+ dataEvent->ResetRecTracks();
+ dataEvent->ResetRecTriggerTracks();
+
+ }
+ fLoader->UnloadDigits();
+ fLoader->UnloadRecPoints();
+ fLoader->UnloadTracks();
+
+ delete recoCluster;
+ delete recoEvent;
+ delete trigDec;
+}
+//________________________________________________________________________
+void AliMUON::FillESD(AliESD* event) const
+{
+
+ TClonesArray* recTracksArray;
+ TClonesArray* recTrigTracksArray;
+
+ //YS AliLoader* loader = GetLoader();
+ AliRunLoader* runLoader = fLoader->GetRunLoader(); //YS loader->GetRunLoader();
+ fLoader->LoadTracks("READ"); //YS
+
+
+ // declaration
+ Int_t ievent;
+ Int_t ntrackhits;
+ Double_t fitfmin;
+
+
+ Double_t bendingSlope, nonBendingSlope, fInverseBendingMomentum;
+ Double_t fXRec, fYRec, fZRec;
+
+ Float_t x11, y11, thetaX,thetaY ;
+
+ //YS Int_t nEvents = runLoader->GetNumberOfEvents();
+
+ // setting pointer for tracks, triggertracks& trackparam at vertex
+ AliMUONTrack * rectrack;
+ AliMUONTriggerTrack * rectriggertrack;
+ AliMUONTrackParam *trackParam;
+
+ ievent = runLoader->GetEventNumber() ; //YS, seems not to be implemented yet (Ch. F)
+ //YS for (ievent = 0; ievent < nEvents; ievent++) {
+ runLoader->GetEvent(ievent);
+
+ // setting ESD MUON class
+ AliESDMuonTrack* ESDTrack = new AliESDMuonTrack() ;
+
+ // -------------------- tracks-------------
+ fMUONData->SetTreeAddress("RT");
+ fMUONData->GetRecTracks();
+ recTracksArray = fMUONData->RecTracks();
+
+ Int_t nrectracks = (Int_t) recTracksArray->GetEntriesFast(); //
+
+ //-------------------- trigger tracks-------------
+ Bool_t ifirst = true;
+ Long_t trigPat = 0;
+ fMUONData->SetTreeAddress("RL");
+ fMUONData->GetRecTriggerTracks();
+ recTrigTracksArray = fMUONData->RecTriggerTracks();
+
+ Int_t ntrectracks = (Int_t) recTrigTracksArray->GetEntriesFast(); //YS
+
+ //printf(">>> Event %d Number of Recconstructed tracks %d \n",ievent, nrectracks);
+
+ Int_t ntracks = TMath::Max(nrectracks, ntrectracks);
+
+ // loop over tracks
+ for (Int_t irectracks = 0; irectracks < ntracks; irectracks++) {
+
+ // -------------------- tracks-------------
+ // not the best way to do, avoid creating two "branches" in fMuonTracks
+ if (irectracks < nrectracks) {
+ rectrack = (AliMUONTrack*) recTracksArray->At(irectracks);
+
+ trackParam = rectrack->GetTrackParamAtVertex();
+
+ bendingSlope = trackParam->GetBendingSlope();
+ nonBendingSlope = trackParam->GetNonBendingSlope();
+ fInverseBendingMomentum = trackParam->GetInverseBendingMomentum();
+ fXRec = trackParam->GetNonBendingCoor();
+ fYRec = trackParam->GetBendingCoor();
+ fZRec = trackParam->GetZ();
+
+ ntrackhits = rectrack->GetNTrackHits();
+ fitfmin = rectrack->GetFitFMin();
+
+ // setting data member of ESD MUON
+ ESDTrack->SetInverseBendingMomentum(fInverseBendingMomentum);
+ ESDTrack->SetThetaX(TMath::ATan(nonBendingSlope));
+ ESDTrack->SetThetaY(TMath::ATan(bendingSlope));
+ ESDTrack->SetZ(fZRec);
+ ESDTrack->SetBendingCoor(fYRec);
+ ESDTrack->SetNonBendingCoor(fXRec);
+ ESDTrack->SetChi2(fitfmin);
+ ESDTrack->SetNHit(ntrackhits);
+ }
+ // -------------------- trigger tracks-------------
+ if (irectracks < ntrectracks) {
+ rectriggertrack = (AliMUONTriggerTrack*) recTrigTracksArray->At(irectracks);
+ if (ifirst) {
+ ifirst = false;
+ trigPat = rectriggertrack->GetGTPattern();
+ }
+
+ x11 = rectriggertrack->GetY11();
+ y11 = rectriggertrack->GetY11();
+ thetaX = rectriggertrack->GetThetax();
+ thetaY = rectriggertrack->GetThetay();
+
+ // setting data member of ESD MUON trigger
+ ESDTrack->SetThetaX11(thetaX);
+ ESDTrack->SetThetaY11(thetaY);
+ ESDTrack->SetX11(x11);
+ ESDTrack->SetY11(y11);
+ }
+ // storing ESD MUON Track into ESD Event & reset muondata
+ if (ntrectracks+ntrectracks != 0)
+ event->AddMuonTrack(ESDTrack);
+ } // end loop tracks
+
+ // if (ntrectracks+ntrectracks != 0)
+ // event->SetTrigger(trigPat);
+ // Waiting for STEER update
+ fMUONData->ResetRecTracks();
+ fMUONData->ResetRecTriggerTracks();
+
+ //} // end loop on event
+ fLoader->UnloadTracks();
+}