#include "AliLoader.h"
#include "AliESD.h"
#include "AliESDMuonTrack.h"
+#include "AliMC.h"
#include "AliMUONLoader.h"
#include "AliMUON.h"
#include "AliMUONTriggerTrack.h"
#include "AliMUONEventReconstructor.h"
+#include "AliMUONClusterReconstructor.h"
#include "AliMUONTrack.h"
#include "AliMUONTrackParam.h"
#include "AliMUONChamberTrigger.h"
-#include "AliMUONClusterFinderVS.h"
+#include "AliMUONClusterFinderAZ.h"
#include "AliMUONClusterInput.h"
#include "AliMUONConstants.h"
#include "AliMUONDigit.h"
#include "AliMUONVGeometryBuilder.h"
#include "AliRun.h"
#include "AliMUONDigitizerv1.h"
+#include "AliMUONSDigitizerv1.h"
// Defaults parameters for Z positions of chambers
void AliMUON::SetTreeAddress()
{
GetMUONData()->SetLoader(fLoader);
- GetMUONData()->SetTreeAddress("H,D,RC");
+ // GetMUONData()->MakeBranch("D,S,RC");
+ // GetMUONData()->SetTreeAddress("H,D,S,RC");
+ GetMUONData()->SetTreeAddress("H");
+ if (fHits != GetMUONData()->Hits()) {
+ if ( gAlice->GetMCApp() )
+ if ( gAlice->GetMCApp()->GetHitLists() )
+ gAlice->GetMCApp()->AddHitList (fHits); // For purifyKine, only necessary when Hit list is created in AliMUONData
+ }
fHits = GetMUONData()->Hits(); // Added by Ivana to use the methods FisrtHit, NextHit of AliDetector
+
}
//____________________________________________________________________
fLoader->TreeD()->Reset();
}
+//_____________________________________________________________________
+void AliMUON::Hits2SDigits()
+{
+ // Empty for the moment which means that AliSimulation is
+ // using AliMUONDigitalisationv1 and SDigits are not created. MErging is done at the Hit level
+}
//_______________________________________________________________________
AliLoader* AliMUON::MakeLoader(const char* topfoldername)
{
Info("MakeLoader",
"Creating standard getter for detector %s. Top folder is %s.",
GetName(),topfoldername);
-
fLoader = new AliLoader(GetName(),topfoldername);
fMUONData = new AliMUONData(fLoader,GetName(),GetName());
fMUONData->SetSplitLevel(fSplitLevel);
}
//_______________________________________________________________________
-void AliMUON::Trigger(Int_t nev){
+void AliMUON::Trigger(Int_t /*nev*/){
// call the Trigger Algorithm and fill TreeR
Int_t singlePlus[3] = {0,0,0};
Int_t pairLike[3] = {0,0,0};
ResetTrigger();
- AliMUONTriggerDecision* decision= new AliMUONTriggerDecision(1);
+ AliMUONTriggerDecision* decision= new AliMUONTriggerDecision(fLoader,1);
decision->Trigger();
decision->GetGlobalTrigger(singlePlus, singleMinus, singleUndef,
pairUnlike, pairLike);
//________________________________________________________________________
void AliMUON::Reconstruct() const
{
-// reconstruct clusters
// 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);
- const_cast<AliMUON*>(this)->SetReconstructionModel(i,RecModel);
+ recoCluster->SetReconstructionModel(i,RecModel);
}
- AliMUONEventReconstructor* reco = new AliMUONEventReconstructor();
-
+ fLoader->LoadDigits("READ");
fLoader->LoadRecPoints("RECREATE");
fLoader->LoadTracks("RECREATE");
- fLoader->LoadDigits("READ");
-
-
+
// Loop over events
for(Int_t ievent = 0; ievent < nEvents; ievent++) {
printf("Event %d\n",ievent);
runLoader->GetEvent(ievent);
- //---------------------------- digit2Reco & Trigger ---------------------
+ //----------------------- digit2cluster & Digits2Trigger -------------------
if (!fLoader->TreeR()) fLoader->MakeRecPointsContainer();
// tracking branch
- fMUONData->MakeBranch("RC");
- fMUONData->SetTreeAddress("D,RC");
- const_cast<AliMUON*>(this)->Digits2Reco();
+ dataCluster->MakeBranch("RC");
+ dataCluster->SetTreeAddress("D,RC");
+ recoCluster->Digits2Clusters();
+ dataCluster->Fill("RC");
// trigger branch
- fMUONData->MakeBranch("GLT");
- fMUONData->SetTreeAddress("D,GLT");
- const_cast<AliMUON*>(this)->Trigger(ievent);
+ dataTrig->MakeBranch("GLT");
+ dataTrig->SetTreeAddress("D,GLT");
+ trigDec->Digits2Trigger();
+ dataTrig->Fill("GLT");
+
+ fLoader->WriteRecPoints("OVERWRITE");
//---------------------------- Track & TriggerTrack ---------------------
if (!fLoader->TreeT()) fLoader->MakeTracksContainer();
- fMUONData->MakeBranch("RT"); //track
- fMUONData->SetTreeAddress("RT");
- reco->EventReconstruct();
- for(Int_t i=0; i<reco->GetNRecTracks(); i++) {
- AliMUONTrack * track = (AliMUONTrack*) reco->GetRecTracksPtr()->At(i);
- fMUONData->AddRecTrack(*track);
- }
- fMUONData->Fill("RT");
+ // trigger branch
+ dataEvent->MakeBranch("RL"); //trigger track
+ dataEvent->SetTreeAddress("RL");
+ recoEvent->EventReconstructTrigger();
+ dataEvent->Fill("RL");
- fMUONData->MakeBranch("RL"); //trigger track
- fMUONData->SetTreeAddress("RL");
- reco->EventReconstructTrigger();
- for(Int_t i=0; i<reco->GetNRecTriggerTracks(); i++) {
- AliMUONTriggerTrack * triggertrack = (AliMUONTriggerTrack*) reco->GetRecTriggerTracksPtr()->At(i);
- fMUONData->AddRecTriggerTrack(*triggertrack);
- }
- fMUONData->Fill("RL");
+ // tracking branch
+ dataEvent->MakeBranch("RT"); //track
+ dataEvent->SetTreeAddress("RT");
+ recoEvent->EventReconstruct();
+ dataEvent->Fill("RT");
fLoader->WriteTracks("OVERWRITE");
//--------------------------- Resetting branches -----------------------
- fMUONData->ResetDigits();
- fMUONData->ResetRawClusters();
- fMUONData->ResetTrigger();
- fMUONData->ResetRecTracks();
- fMUONData->ResetRecTriggerTracks();
+ dataCluster->ResetDigits();
+ dataCluster->ResetRawClusters();
+
+ dataTrig->ResetDigits();
+ dataTrig->ResetTrigger();
+
+ dataEvent->ResetRawClusters();
+ dataEvent->ResetTrigger();
+ dataEvent->ResetRecTracks();
+ dataEvent->ResetRecTriggerTracks();
+
}
fLoader->UnloadDigits();
fLoader->UnloadRecPoints();
fLoader->UnloadTracks();
- //delete reco;
+
+ delete recoCluster;
+ delete recoEvent;
+ delete trigDec;
}
//________________________________________________________________________
void AliMUON::FillESD(AliESD* event) const
{
- TClonesArray * recTracksArray;
+ TClonesArray* recTracksArray;
+ TClonesArray* recTrigTracksArray;
//YS AliLoader* loader = GetLoader();
AliRunLoader* runLoader = fLoader->GetRunLoader(); //YS loader->GetRunLoader();
Int_t ievent;
Int_t ntrackhits;
Double_t fitfmin;
- Int_t nrectracks;
+
Double_t bendingSlope, nonBendingSlope, fInverseBendingMomentum;
Double_t fXRec, fYRec, fZRec;
AliMUONTriggerTrack * rectriggertrack;
AliMUONTrackParam *trackParam;
- ievent = runLoader->GetEventNumber() ; //YS
+ ievent = runLoader->GetEventNumber() ; //YS, seems not to be implemented yet (Ch. F)
//YS for (ievent = 0; ievent < nEvents; ievent++) {
runLoader->GetEvent(ievent);
fMUONData->GetRecTracks();
recTracksArray = fMUONData->RecTracks();
- nrectracks = (Int_t) recTracksArray->GetEntriesFast(); //
-
- // printf(">>> Event %d Number of Recconstructed tracks %d \n",ievent, nrectracks);
-
- // read track infos
- for (Int_t irectracks = 0; irectracks < nrectracks; irectracks++) {
-
- 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);
- }
+ Int_t nrectracks = (Int_t) recTracksArray->GetEntriesFast(); //
- // // -------------------- trigger tracks-------------
+ //-------------------- trigger tracks-------------
+ Bool_t ifirst = true;
+ Long_t trigPat = 0;
fMUONData->SetTreeAddress("RL");
fMUONData->GetRecTriggerTracks();
- recTracksArray = fMUONData->RecTriggerTracks();
+ recTrigTracksArray = fMUONData->RecTriggerTracks();
- Int_t ntrectracks = (Int_t) recTracksArray->GetEntriesFast(); //YS
+ Int_t ntrectracks = (Int_t) recTrigTracksArray->GetEntriesFast(); //YS
- // printf(">>> Event %d Number of Recconstructed tracks %d \n",ievent, nrectracks);
+ //printf(">>> Event %d Number of Recconstructed tracks %d \n",ievent, nrectracks);
- // read trigger track infos
- for (Int_t irectracks = 0; irectracks < ntrectracks; irectracks++) {
+ Int_t ntracks = TMath::Max(nrectracks, ntrectracks);
- rectriggertrack = (AliMUONTriggerTrack*) recTracksArray->At(irectracks);
-
- 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);
- }
+ // 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();
+ }
- // storing ESD MUON Track into ESD Event & reset muondata
- if (ntrectracks+ntrectracks != 0) //YS
- event->AddMuonTrack(ESDTrack);
+ 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();
- //YS } // end loop on event
- fLoader->UnloadTracks(); //YS
+ //} // end loop on event
+ fLoader->UnloadTracks();
}