]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUON.cxx
Adding local data container for clusterisation and tracking (Christian Finck)
[u/mrichter/AliRoot.git] / MUON / AliMUON.cxx
index 97efd7bff052c0491a6b3acabbebd1075ee88fb8..ef58cf88616afa5c750d330f91f5f98aa6b35742 100644 (file)
 #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"
@@ -198,7 +199,16 @@ AliMUON::~AliMUON()
   if (fGeometryBuilders){
     fGeometryBuilders->Delete();
     delete fGeometryBuilders;
-  } 
+  }
+  if (fChambers){
+    fChambers->Delete();
+    delete fChambers;
+  }
+  if (fTriggerCircuits){
+    fTriggerCircuits->Delete();
+    delete fTriggerCircuits;
+  }
+  delete fMUONData;
 }
 //_____________________________________________________________________________
 void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder)
@@ -228,7 +238,9 @@ Int_t AliMUON::DistancetoPrimitive(Int_t , Int_t )
 void  AliMUON::SetTreeAddress()
 {
   GetMUONData()->SetLoader(fLoader); 
-  GetMUONData()->SetTreeAddress("H,D,RC");
+  //  GetMUONData()->MakeBranch("D,RC");
+  //  GetMUONData()->SetTreeAddress("H,D,RC");
+  GetMUONData()->SetTreeAddress("H");
   fHits = GetMUONData()->Hits(); // Added by Ivana to use the methods FisrtHit, NextHit of AliDetector
 }
 
@@ -430,7 +442,6 @@ 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);
@@ -438,7 +449,7 @@ AliLoader* AliMUON::MakeLoader(const char* topfoldername)
 }
 
 //_______________________________________________________________________
-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}; 
@@ -448,7 +459,7 @@ void AliMUON::Trigger(Int_t nev){
   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);
@@ -485,7 +496,7 @@ void AliMUON::Trigger(Int_t nev){
     //  fLoader->TreeR()->Reset();
   fLoader->WriteRecPoints("OVERWRITE");
   
-  printf("\n End of trigger for event %d", nev);
+  //  printf("\n End of trigger for event %d\n", nev);
 }
 
 //____________________________________________________________________
@@ -524,6 +535,7 @@ void AliMUON::FindClusters()
        //TClonesArray *
        muonDigits = GetMUONData()->Digits(ich); 
        ndig=muonDigits->GetEntriesFast();
+       if(fDebug) 
        printf("\n 1 Found %d digits in %p chamber %d", ndig, muonDigits,ich);
        TClonesArray &lhits1 = *dig1;
        Int_t n = 0;
@@ -536,6 +548,7 @@ void AliMUON::FindClusters()
        GetMUONData()->GetCathode(1);
        muonDigits =  GetMUONData()->Digits(ich);  
        ndig=muonDigits->GetEntriesFast();
+       if(fDebug) 
        printf("\n 2 Found %d digits in %p %d", ndig, muonDigits, ich);
        TClonesArray &lhits2 = *dig2;
        n=0;
@@ -740,82 +753,99 @@ AliMUON& AliMUON::operator = (const AliMUON& /*rhs*/)
 //________________________________________________________________________
 void AliMUON::Reconstruct() const
 {
-// reconstruct clusters
 
-  AliLoader* loader = GetLoader();
-  AliRunLoader* runLoader = loader->GetRunLoader();
+//  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();
-
-  loader->LoadRecPoints("RECREATE");
-  loader->LoadTracks("RECREATE");
-  loader->LoadDigits("READ");
-
-
+  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);
+    printf("Event %d\n",ievent);
     runLoader->GetEvent(ievent);
 
-    //---------------------------- digit2Reco & Trigger ---------------------
-    if (!loader->TreeR()) loader->MakeRecPointsContainer();
+    //----------------------- 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");
 
-    //---------------------------- Track & TriggerTrack ---------------------
-    if (!loader->TreeT()) loader->MakeTracksContainer();
+    fLoader->WriteRecPoints("OVERWRITE");
 
-    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");
+    //---------------------------- Track & TriggerTrack ---------------------
+    if (!fLoader->TreeT()) fLoader->MakeTracksContainer();
+    // tracking branch
+    dataEvent->MakeBranch("RT"); //track
+    dataEvent->SetTreeAddress("RT");
+    recoEvent->EventReconstruct();
+    dataEvent->Fill("RT");
 
-    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");
+    // trigger branch
+    dataEvent->MakeBranch("RL"); //trigger track
+    dataEvent->SetTreeAddress("RL");
+    recoEvent->EventReconstructTrigger();
+    dataEvent->Fill("RL");
 
-    loader->WriteTracks("OVERWRITE");  
+    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();
+  
   }
-  loader->UnloadDigits();
-  loader->UnloadRecPoints();
-  loader->UnloadTracks();
+  fLoader->UnloadDigits();
+  fLoader->UnloadRecPoints();
+  fLoader->UnloadTracks();
+
+  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();
@@ -826,7 +856,7 @@ void AliMUON::FillESD(AliESD* event) const
   Int_t ievent;
   Int_t ntrackhits;
   Double_t fitfmin;
-  Int_t nrectracks;
 
   Double_t bendingSlope, nonBendingSlope, fInverseBendingMomentum;
   Double_t fXRec, fYRec, fZRec;
@@ -840,7 +870,7 @@ void AliMUON::FillESD(AliESD* event) const
   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);
 
@@ -852,71 +882,82 @@ void AliMUON::FillESD(AliESD* event) const
     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(); 
 }