]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONReconstructor.cxx
Separating writing and reading of raw data (Christian)
[u/mrichter/AliRoot.git] / MUON / AliMUONReconstructor.cxx
index be6df814da6a60e032804858f59bb2dc90b5a876..34f94977abce1facf8bcdfe44cb81dc7104fe1d6 100644 (file)
 #include "AliMUONClusterReconstructor.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 "AliMUONRawReader.h"
 
 #include "AliRawReader.h"
 
@@ -59,25 +60,33 @@ void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader) const
   AliLoader* loader = runLoader->GetLoader("MUONLoader");
   Int_t nEvents = runLoader->GetNumberOfEvents();
 
-// used local container for each method
-// passing fLoader as argument, could be avoided ???
-  AliMUONTrackReconstructor* recoEvent = new AliMUONTrackReconstructor(loader);
-  AliMUONData* dataEvent = recoEvent->GetMUONData();
-  recoEvent->SetTrackMethod(1); // 1 - original,  2 - Kalman
+  AliMUONData* data = new AliMUONData(loader,"MUON","MUON");
 
-  AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(loader);
-  AliMUONData* dataCluster = recoCluster->GetMUONData();
+// passing loader as argument.
+  AliMUONTrackReconstructor* recoEvent = new AliMUONTrackReconstructor(loader, data);
+
+  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, data);
+  
   AliMUONClusterFinderVS *recModel = recoCluster->GetRecoModel();
-  //AZ If "AZ" clustering method is to be used the following 2 lines
-  // should be uncommented
-  //recModel = (AliMUONClusterFinderVS*) new AliMUONClusterFinderAZ(0,1);
-  //recoCluster->SetRecoModel(recModel);
+
+  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);
@@ -87,45 +96,70 @@ void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader) const
     if (!loader->TreeR()) loader->MakeRecPointsContainer();
      
     // tracking branch
-    dataCluster->MakeBranch("RC");
-    dataCluster->SetTreeAddress("D,RC");
-    recoCluster->Digits2Clusters(); 
-    dataCluster->Fill("RC"); 
+    if (recoEvent->GetTrackMethod() != 3) {
+      data->MakeBranch("RC");
+      data->SetTreeAddress("D,RC");
+    } else {
+      data->SetTreeAddress("D");
+      data->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
+    data->SetTreeAddress("GLT");
+
+    data->GetDigits();
+    recoCluster->Digits2Clusters(chBeg); 
+    if (recoEvent->GetTrackMethod() == 3) {
+      // Combined cluster / track finder
+      AliMUONEventRecoCombi::Instance()->FillEvent(data, (AliMUONClusterFinderAZ*)recModel);
+      ((AliMUONClusterFinderAZ*) recModel)->SetReco(2); 
+    }
+    else data->Fill("RC"); 
 
     // trigger branch
-    dataCluster->MakeBranch("TC");
-    dataCluster->SetTreeAddress("TC");
+    data->MakeBranch("TC");
+    data->SetTreeAddress("TC");
     recoCluster->Trigger2Trigger(); 
-    dataCluster->Fill("TC");
+    data->Fill("TC");
 
-    loader->WriteRecPoints("OVERWRITE");
+    //AZ loader->WriteRecPoints("OVERWRITE");
 
     //---------------------------- Track & TriggerTrack ---------------------
     if (!loader->TreeT()) loader->MakeTracksContainer();
 
     // trigger branch
-    dataEvent->MakeBranch("RL"); //trigger track
-    dataEvent->SetTreeAddress("RL");
+    data->MakeBranch("RL"); //trigger track
+    data->SetTreeAddress("RL");
     recoEvent->EventReconstructTrigger();
-    dataEvent->Fill("RL");
+    data->Fill("RL");
 
     // tracking branch
-    dataEvent->MakeBranch("RT"); //track
-    dataEvent->SetTreeAddress("RT");
+    data->MakeBranch("RT"); //track
+    data->SetTreeAddress("RT");
     recoEvent->EventReconstruct();
-    dataEvent->Fill("RT");
+    data->Fill("RT");
 
     loader->WriteTracks("OVERWRITE"); 
   
+    if (recoEvent->GetTrackMethod() == 3) { 
+      // Combined cluster / track
+      ((AliMUONClusterFinderAZ*) recModel)->SetReco(1);
+      data->MakeBranch("RC");
+      data->SetTreeAddress("RC");
+      AliMUONEventRecoCombi::Instance()->FillRecP(data, recoEvent); 
+      data->Fill("RC"); 
+    }
+    loader->WriteRecPoints("OVERWRITE"); 
+
     //--------------------------- Resetting branches -----------------------
-    dataCluster->ResetDigits();
-    dataCluster->ResetRawClusters();
-    dataCluster->ResetTrigger();
+    data->ResetDigits();
+    data->ResetRawClusters();
+    data->ResetTrigger();
 
-    dataEvent->ResetRawClusters();
-    dataEvent->ResetTrigger();
-    dataEvent->ResetRecTracks();  
-    dataEvent->ResetRecTriggerTracks();
+    data->ResetRawClusters();
+    data->ResetTrigger();
+    data->ResetRecTracks();  
+    data->ResetRecTriggerTracks();
 
   }
   loader->UnloadDigits();
@@ -134,6 +168,7 @@ void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader) const
 
   delete recoCluster;
   delete recoEvent;
+  delete data;
 }
 
 //_____________________________________________________________________________
@@ -141,16 +176,14 @@ void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader, AliRawReader* ra
 {
 //  AliLoader
   AliLoader* loader = runLoader->GetLoader("MUONLoader");
+  AliMUONData* data = new AliMUONData(loader,"MUON","MUON");
 
-// used local container for each method
-// passing fLoader as argument, could be avoided ???
-  AliMUONTrackReconstructor* recoEvent = new AliMUONTrackReconstructor(loader);
-  AliMUONData* dataEvent = recoEvent->GetMUONData();
+// passing loader as argument.
+  AliMUONTrackReconstructor* recoEvent = new AliMUONTrackReconstructor(loader, data);
 
-  AliMUONRawData* rawData = new AliMUONRawData(loader);
-  AliMUONData* dataCluster = rawData->GetMUONData();
+  AliMUONRawReader* rawData = new AliMUONRawReader(loader, data);
 
-  AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(loader, dataCluster);
+  AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(loader, data);
   AliMUONClusterFinderVS *recModel = recoCluster->GetRecoModel();
   recModel->SetGhostChi2Cut(10);
 
@@ -170,16 +203,16 @@ void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader, AliRawReader* ra
     if (!loader->TreeD()) loader->MakeDigitsContainer();
 
     // tracking branch
-    dataCluster->MakeBranch("D");
-    dataCluster->SetTreeAddress("D");
+    data->MakeBranch("D");
+    data->SetTreeAddress("D");
     rawData->ReadTrackerDDL(rawReader);
-    dataCluster->Fill("D"); 
+    data->Fill("D"); 
 
     // trigger branch
-    dataCluster->MakeBranch("GLT");
-    dataCluster->SetTreeAddress("GLT");
+    data->MakeBranch("GLT");
+    data->SetTreeAddress("GLT");
     rawData->ReadTriggerDDL(rawReader);
-    dataCluster->Fill("GLT"); 
+    data->Fill("GLT"); 
 
     loader->WriteDigits("OVERWRITE");
 
@@ -187,16 +220,16 @@ void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader, AliRawReader* ra
     if (!loader->TreeR()) loader->MakeRecPointsContainer();
      
     // tracking branch
-    dataCluster->MakeBranch("RC");
-    dataCluster->SetTreeAddress("RC");
+    data->MakeBranch("RC");
+    data->SetTreeAddress("RC");
     recoCluster->Digits2Clusters(); 
-    dataCluster->Fill("RC"); 
+    data->Fill("RC"); 
 
     // trigger branch
-    dataCluster->MakeBranch("TC");
-    dataCluster->SetTreeAddress("TC");
+    data->MakeBranch("TC");
+    data->SetTreeAddress("TC");
     recoCluster->Trigger2Trigger(); 
-    dataCluster->Fill("TC");
+    data->Fill("TC");
 
     loader->WriteRecPoints("OVERWRITE");
 
@@ -204,28 +237,28 @@ void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader, AliRawReader* ra
     if (!loader->TreeT()) loader->MakeTracksContainer();
 
     // trigger branch
-    dataEvent->MakeBranch("RL"); //trigger track
-    dataEvent->SetTreeAddress("RL");
+    data->MakeBranch("RL"); //trigger track
+    data->SetTreeAddress("RL");
     recoEvent->EventReconstructTrigger();
-    dataEvent->Fill("RL");
+    data->Fill("RL");
 
     // tracking branch
-    dataEvent->MakeBranch("RT"); //track
-    dataEvent->SetTreeAddress("RT");
+    data->MakeBranch("RT"); //track
+    data->SetTreeAddress("RT");
     recoEvent->EventReconstruct();
-    dataEvent->Fill("RT");
+    data->Fill("RT");
 
     loader->WriteTracks("OVERWRITE");  
   
     //--------------------------- Resetting branches -----------------------
-    dataCluster->ResetDigits();
-    dataCluster->ResetRawClusters();
-    dataCluster->ResetTrigger();
-
-    dataEvent->ResetRawClusters();
-    dataEvent->ResetTrigger();
-    dataEvent->ResetRecTracks();
-    dataEvent->ResetRecTriggerTracks();
+    data->ResetDigits();
+    data->ResetRawClusters();
+    data->ResetTrigger();
+
+    data->ResetRawClusters();
+    data->ResetTrigger();
+    data->ResetRecTracks();
+    data->ResetRecTriggerTracks();
   
   }
   loader->UnloadRecPoints();
@@ -234,6 +267,7 @@ void AliMUONReconstructor::Reconstruct(AliRunLoader* runLoader, AliRawReader* ra
 
   delete recoCluster;
   delete recoEvent;
+  delete data;
 }
 
 //_____________________________________________________________________________