#include "AliGenEventHeader.h"
#include "AliESD.h"
#include "AliMUONReconstructor.h"
-
+
#include "AliMUONData.h"
-#include "AliMUONEventReconstructor.h"
+#include "AliMUONTrackReconstructor.h"
#include "AliMUONClusterReconstructor.h"
-#include "AliMUONTriggerDecision.h"
#include "AliMUONClusterFinderVS.h"
+#include "AliMUONClusterFinderAZ.h"
+#include "AliMUONEventRecoCombi.h"
#include "AliMUONTrack.h"
#include "AliMUONTrackParam.h"
#include "AliMUONTriggerTrack.h"
#include "AliESDMuonTrack.h"
+#include "AliMUONRawData.h"
+
#include "AliRawReader.h"
+
ClassImp(AliMUONReconstructor)
//_____________________________________________________________________________
AliMUONReconstructor::AliMUONReconstructor()
// used local container for each method
// passing fLoader as argument, could be avoided ???
- AliMUONEventReconstructor* recoEvent = new AliMUONEventReconstructor(loader);
+ AliMUONTrackReconstructor* recoEvent = new AliMUONTrackReconstructor(loader);
AliMUONData* dataEvent = recoEvent->GetMUONData();
+ if (strstr(GetOption(),"Original")) recoEvent->SetTrackMethod(1); // Original tracking
+ else if (strstr(GetOption(),"Combi")) recoEvent->SetTrackMethod(3); // Combined cluster / track
+ else recoEvent->SetTrackMethod(2); // Kalman
AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(loader);
AliMUONData* dataCluster = recoCluster->GetMUONData();
-
- AliMUONTriggerDecision* trigDec = new AliMUONTriggerDecision(loader,0,dataCluster);
- // AliMUONData* dataTrig = trigDec->GetMUONData();
-
-
- for (Int_t i = 0; i < 10; i++) {
- AliMUONClusterFinderVS *recModel = new AliMUONClusterFinderVS();
- recModel->SetGhostChi2Cut(10);
- recoCluster->SetReconstructionModel(i,recModel);
- }
+ AliMUONClusterFinderVS *recModel = recoCluster->GetRecoModel();
+ if (!strstr(GetOption(),"VS")) {
+ recModel = (AliMUONClusterFinderVS*) new AliMUONClusterFinderAZ();
+ recoCluster->SetRecoModel(recModel);
+ }
+ recModel->SetGhostChi2Cut(10);
loader->LoadDigits("READ");
loader->LoadRecPoints("RECREATE");
loader->LoadTracks("RECREATE");
+ Int_t chBeg = recoEvent->GetTrackMethod() == 3 ? 6 : 0;
// Loop over events
for(Int_t ievent = 0; ievent < nEvents; ievent++) {
printf("Event %d\n",ievent);
if (!loader->TreeR()) loader->MakeRecPointsContainer();
// tracking branch
- dataCluster->MakeBranch("RC");
- dataCluster->SetTreeAddress("D,RC");
- recoCluster->Digits2Clusters();
- dataCluster->Fill("RC");
+ if (recoEvent->GetTrackMethod() != 3) {
+ dataCluster->MakeBranch("RC");
+ dataCluster->SetTreeAddress("D,RC");
+ } else {
+ dataCluster->SetTreeAddress("D");
+ dataCluster->SetTreeAddress("RCC");
+ }
+ // Important for avoiding a memory leak when reading digits ( to be investigated more in detail)
+ // In any case the reading of GLT is needed for the Trigger2Tigger method below
+ dataCluster->SetTreeAddress("GLT");
+
+ recoCluster->Digits2Clusters(chBeg);
+ if (recoEvent->GetTrackMethod() == 3) {
+ // Combined cluster / track finder
+ AliMUONEventRecoCombi::Instance()->FillEvent(dataCluster, dataEvent, (AliMUONClusterFinderAZ*)recModel);
+ ((AliMUONClusterFinderAZ*) recModel)->SetReco(2);
+ }
+ else dataCluster->Fill("RC");
// trigger branch
dataCluster->MakeBranch("TC");
dataCluster->SetTreeAddress("TC");
- trigDec->Trigger2Trigger();
+ recoCluster->Trigger2Trigger();
dataCluster->Fill("TC");
- loader->WriteRecPoints("OVERWRITE");
+ //AZ loader->WriteRecPoints("OVERWRITE");
//---------------------------- Track & TriggerTrack ---------------------
if (!loader->TreeT()) loader->MakeTracksContainer();
recoEvent->EventReconstruct();
dataEvent->Fill("RT");
- loader->WriteTracks("OVERWRITE");
+ loader->WriteTracks("OVERWRITE");
+ if (recoEvent->GetTrackMethod() == 3) {
+ // Combined cluster / track
+ ((AliMUONClusterFinderAZ*) recModel)->SetReco(1);
+ dataCluster->MakeBranch("RC");
+ dataCluster->SetTreeAddress("RC");
+ AliMUONEventRecoCombi::Instance()->FillRecP(dataCluster, recoEvent);
+ dataCluster->Fill("RC");
+ }
+ loader->WriteRecPoints("OVERWRITE");
+
//--------------------------- Resetting branches -----------------------
dataCluster->ResetDigits();
dataCluster->ResetRawClusters();
dataEvent->ResetRawClusters();
dataEvent->ResetTrigger();
- dataEvent->ResetRecTracks();
+ dataEvent->ResetRecTracks();
dataEvent->ResetRecTriggerTracks();
-
+
}
loader->UnloadDigits();
loader->UnloadRecPoints();
delete recoCluster;
delete recoEvent;
- delete trigDec;
}
//_____________________________________________________________________________
// used local container for each method
// passing fLoader as argument, could be avoided ???
- AliMUONEventReconstructor* recoEvent = new AliMUONEventReconstructor(loader);
+ AliMUONTrackReconstructor* recoEvent = new AliMUONTrackReconstructor(loader);
AliMUONData* dataEvent = recoEvent->GetMUONData();
- AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(loader);
- AliMUONData* dataCluster = recoCluster->GetMUONData();
+ AliMUONRawData* rawData = new AliMUONRawData(loader);
+ AliMUONData* dataCluster = rawData->GetMUONData();
- AliMUONTriggerDecision* trigDec = new AliMUONTriggerDecision(loader,0,dataCluster);
-
- for (Int_t i = 0; i < 10; i++) {
- AliMUONClusterFinderVS *recModel = new AliMUONClusterFinderVS();
- recModel->SetGhostChi2Cut(10);
- recoCluster->SetReconstructionModel(i,recModel);
- }
+ AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(loader, dataCluster);
+ AliMUONClusterFinderVS *recModel = recoCluster->GetRecoModel();
+ recModel->SetGhostChi2Cut(10);
loader->LoadRecPoints("RECREATE");
loader->LoadTracks("RECREATE");
-
+ loader->LoadDigits("RECREATE");
+
+
// Loop over events
Int_t iEvent = 0;
printf("Event %d\n",iEvent);
runLoader->GetEvent(iEvent++);
+ //----------------------- raw2digits & raw2trigger-------------------
+ if (!loader->TreeD()) loader->MakeDigitsContainer();
+
+ // tracking branch
+ dataCluster->MakeBranch("D");
+ dataCluster->SetTreeAddress("D");
+ rawData->ReadTrackerDDL(rawReader);
+ dataCluster->Fill("D");
+
+ // trigger branch
+ dataCluster->MakeBranch("GLT");
+ dataCluster->SetTreeAddress("GLT");
+ rawData->ReadTriggerDDL(rawReader);
+ dataCluster->Fill("GLT");
+
+ loader->WriteDigits("OVERWRITE");
+
//----------------------- digit2cluster & Trigger2Trigger -------------------
if (!loader->TreeR()) loader->MakeRecPointsContainer();
// tracking branch
dataCluster->MakeBranch("RC");
- dataCluster->SetTreeAddress("D,RC");
- recoCluster->Digits2Clusters(rawReader);
+ dataCluster->SetTreeAddress("RC");
+ recoCluster->Digits2Clusters();
dataCluster->Fill("RC");
// trigger branch
dataCluster->MakeBranch("TC");
dataCluster->SetTreeAddress("TC");
- trigDec->Trigger2Trigger(rawReader);
+ recoCluster->Trigger2Trigger();
dataCluster->Fill("TC");
loader->WriteRecPoints("OVERWRITE");
}
loader->UnloadRecPoints();
loader->UnloadTracks();
+ loader->UnloadDigits();
delete recoCluster;
delete recoEvent;
- delete trigDec;
}
//_____________________________________________________________________________
AliMUONData* muonData = new AliMUONData(loader,"MUON","MUON");
// declaration
- Int_t iEvent, nPart;
- Int_t nTrackHits, nPrimary;
+ Int_t iEvent;// nPart;
+ Int_t nTrackHits;// nPrimary;
Double_t fitFmin;
TArrayF vertex(3);
AliMUONTrack* recTrack = 0;
AliMUONTrackParam* trackParam = 0;
AliMUONTriggerTrack* recTriggerTrack = 0;
- TParticle* particle = new TParticle();
- AliGenEventHeader* header = 0;
+// TParticle* particle = new TParticle();
+// AliGenEventHeader* header = 0;
iEvent = runLoader->GetEventNumber();
runLoader->GetEvent(iEvent);
// vertex calculation (maybe it exists already somewhere else)
vertex[0] = vertex[1] = vertex[2] = 0.;
- nPrimary = 0;
- if ( (header = runLoader->GetHeader()->GenEventHeader()) ) {
- header->PrimaryVertex(vertex);
- } else {
- runLoader->LoadKinematics("READ");
- runLoader->TreeK()->GetBranch("Particles")->SetAddress(&particle);
- nPart = (Int_t)runLoader->TreeK()->GetEntries();
- for(Int_t iPart = 0; iPart < nPart; iPart++) {
- runLoader->TreeK()->GetEvent(iPart);
- if (particle->GetFirstMother() == -1) {
- vertex[0] += particle->Vx();
- vertex[1] += particle->Vy();
- vertex[2] += particle->Vz();
- nPrimary++;
- }
- if (nPrimary) {
- vertex[0] /= (double)nPrimary;
- vertex[1] /= (double)nPrimary;
- vertex[2] /= (double)nPrimary;
- }
- }
- }
+ // nPrimary = 0;
+// if ( (header = runLoader->GetHeader()->GenEventHeader()) ) {
+// header->PrimaryVertex(vertex);
+// } else {
+// runLoader->LoadKinematics("READ");
+// runLoader->TreeK()->GetBranch("Particles")->SetAddress(&particle);
+// nPart = (Int_t)runLoader->TreeK()->GetEntries();
+// for(Int_t iPart = 0; iPart < nPart; iPart++) {
+// runLoader->TreeK()->GetEvent(iPart);
+// if (particle->GetFirstMother() == -1) {
+// vertex[0] += particle->Vx();
+// vertex[1] += particle->Vy();
+// vertex[2] += particle->Vz();
+// nPrimary++;
+// }
+// if (nPrimary) {
+// vertex[0] /= (double)nPrimary;
+// vertex[1] /= (double)nPrimary;
+// vertex[2] /= (double)nPrimary;
+// }
+// }
+// }
// setting ESD MUON class
AliESDMuonTrack* theESDTrack = new AliESDMuonTrack() ;
//} // end loop on event
loader->UnloadTracks();
- if (!header)
- runLoader->UnloadKinematics();
+ // if (!header)
+// runLoader->UnloadKinematics();
delete theESDTrack;
delete muonData;
// delete particle;
+}//_____________________________________________________________________________
+void AliMUONReconstructor::FillESD(AliRunLoader* runLoader, AliRawReader* /*rawReader*/, AliESD* esd) const
+{
+ // don't need rawReader ???
+ FillESD(runLoader, esd);
}