]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUON.cxx
Additional protection, removing obsolete data member
[u/mrichter/AliRoot.git] / MUON / AliMUON.cxx
index e63a35b613e4f1dc24ec72c5c9d2a79c7bda1861..f406e09d42e01b746659afb87b9bf1bc57bcc29c 100644 (file)
 #include "AliHeader.h"
 #include "AliHitMap.h"
 #include "AliLoader.h"
+#include "AliRunDigitizer.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 "AliMUONTransientDigit.h"
 #include "AliMUONTriggerCircuit.h"
 #include "AliMUONTriggerDecision.h"
+#include "AliMUONVGeometryBuilder.h"   
 #include "AliRun.h"    
-#include "AliMUONDigitizerv1.h"
+#include "AliMUONDigitizerv2.h"
+#include "AliMUONSDigitizerv1.h"
 
 
 // Defaults parameters for Z positions of chambers
@@ -94,12 +105,12 @@ AliMUON::AliMUON()
     fNTrackingCh     = 0;
     fIshunt          = 0;
     fChambers        = 0;
+    fGeometryBuilders = 0; 
     fTriggerCircuits = 0;
     fAccMin          = 0.;
     fAccMax          = 0.;   
     fAccCut          = kFALSE;
     fMerger          = 0;
-    fFileName        = 0;
     fMUONData        = 0;
     fSplitLevel      = 0;
 }
@@ -124,6 +135,8 @@ AliMUON::AliMUON(const char *name, const char *title)
 // Creating List of Chambers
     Int_t ch;
     fChambers = new TObjArray(AliMUONConstants::NCh());
+    fGeometryBuilders = new TObjArray(AliMUONConstants::NCh());
+
     // Loop over stations
     for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) {
       // Loop over 2 chambers in the station
@@ -138,7 +151,7 @@ AliMUON::AliMUON(const char *name, const char *title)
          fChambers->AddAt(new AliMUONChamberTrigger(ch),ch);
        }
        AliMUONChamber* chamber = (AliMUONChamber*) fChambers->At(ch);
-       chamber->SetGid(0);
+       //chamber->SetGid(0);
        // Default values for Z of chambers
        chamber->SetZ(AliMUONConstants::DefaultChamberZ(ch));
        //
@@ -184,6 +197,28 @@ AliMUON::~AliMUON()
   if(fDebug) printf("%s: Calling AliMUON destructor !!!\n",ClassName());
   fIshunt  = 0;
   if (fMerger) delete fMerger;
+
+  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)
+{
+// Adds the geometry builder to the list
+// ---
+
+  fGeometryBuilders->Add(geomBuilder);
 }
 //____________________________________________________________________
 void AliMUON::BuildGeometry()
@@ -205,8 +240,17 @@ Int_t AliMUON::DistancetoPrimitive(Int_t , Int_t )
 void  AliMUON::SetTreeAddress()
 {
   GetMUONData()->SetLoader(fLoader); 
-  GetMUONData()->SetTreeAddress("H,D,RC");
-  fHits = GetMUONData()->Hits(); // Added by Ivana to use the methods FisrtHit, NextHit of AliDetector
+  //  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() ) {
+       fHits = GetMUONData()->Hits();
+       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    
 }
 
 //____________________________________________________________________
@@ -313,6 +357,39 @@ void AliMUON::SetAcceptance(Bool_t acc, Float_t angmin, Float_t angmax)
     } // station loop
   }
 }
+
+//____________________________________________________________________
+Float_t  AliMUON::GetMaxStepGas() const
+{
+// Return stepsize in gas
+  
+  return fMaxStepGas;
+}  
+
+//____________________________________________________________________
+Float_t  AliMUON::GetMaxStepAlu() const
+{
+// Return step size in Alu
+  
+  return fMaxStepAlu;
+}
+  
+//____________________________________________________________________
+Float_t  AliMUON::GetMaxDestepGas() const
+{
+// Return maximum step size in Gas
+  
+  return fMaxDestepGas;
+}
+  
+//____________________________________________________________________
+Float_t  AliMUON::GetMaxDestepAlu() const
+{
+// Return maximum step size in Gas
+  
+  return fMaxDestepAlu;
+}
+
 //____________________________________________________________________
 void   AliMUON::SetSegmentationModel(Int_t id, Int_t isec, AliSegmentation *segmentation)
 {
@@ -339,9 +416,9 @@ void   AliMUON::SetNsec(Int_t id, Int_t nsec)
     ((AliMUONChamber*) fChambers->At(id))->SetNsec(nsec);
 }
 //____________________________________________________________________
-AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager)
+AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
 {
-  return new AliMUONDigitizerv1(manager);
+  return new AliMUONDigitizerv2(manager);
 }
 //_____________________________________________________________________
 void AliMUON::SDigits2Digits()
@@ -364,6 +441,21 @@ void AliMUON::SDigits2Digits()
     fLoader->TreeD()->Reset();
 }
 
+//_____________________________________________________________________
+void AliMUON::Hits2SDigits()
+{
+  // Adaption of AliMUONSDigitizerv1 to be excuted by the AliSimulation framework
+  AliRunLoader* runLoader = fLoader->GetRunLoader();
+  AliRunDigitizer   * manager = new AliRunDigitizer(1,1);
+  manager->SetInputStream(0,runLoader->GetFileName(),AliConfig::GetDefaultEventFolderName());
+  AliMUONDigitizer * dMUON   = new AliMUONSDigitizerv1(manager);
+  fLoader->LoadHits("READ");
+  for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
+    runLoader->GetEvent(iEvent);
+    dMUON->Exec("");
+  }
+  fLoader->UnloadHits();
+}
 //_______________________________________________________________________
 AliLoader* AliMUON::MakeLoader(const char* topfoldername)
 { 
@@ -374,7 +466,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);
@@ -382,7 +473,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}; 
@@ -392,7 +483,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);
@@ -429,7 +520,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);
 }
 
 //____________________________________________________________________
@@ -468,6 +559,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;
@@ -480,6 +572,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;
@@ -681,4 +774,200 @@ AliMUON& AliMUON::operator = (const AliMUON& /*rhs*/)
 // dummy version
     return *this;
 }
+//________________________________________________________________________
+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();
+
+    // trigger branch
+    dataEvent->MakeBranch("RL"); //trigger track
+    dataEvent->SetTreeAddress("RL");
+    recoEvent->EventReconstructTrigger();
+    dataEvent->Fill("RL");
+
+    // tracking branch
+    dataEvent->MakeBranch("RT"); //track
+    dataEvent->SetTreeAddress("RT");
+    recoEvent->EventReconstruct();
+    dataEvent->Fill("RT");
+
+    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 = 0;
+  TClonesArray* recTrigTracksArray = 0;
+  
+  //YS AliLoader* loader = GetLoader();
+  AliRunLoader* runLoader = fLoader->GetRunLoader(); 
+  fLoader->LoadTracks("READ"); //YS
+
+
+  // declaration  
+  Int_t iEvent;
+  Int_t nTrackHits;
+  Double_t fitFmin;
+
+  Double_t bendingSlope, nonBendingSlope, inverseBendingMomentum;
+  Double_t xRec, yRec, zRec, chi2MatchTrigger;
+  Bool_t matchTrigger;
+
+  //YS Int_t nEvents = runLoader->GetNumberOfEvents();
+
+  // setting pointer for tracks, triggertracks& trackparam at vertex
+  AliMUONTrack* recTrack = 0;
+  AliMUONTrackParam* trackParam = 0;
+  AliMUONTriggerTrack* recTriggerTrack = 0;
+
+  iEvent = runLoader->GetEventNumber() ; //YS, seems not to be implemented yet (Ch. F)
+  runLoader->GetEvent(iEvent);
+
+  // setting ESD MUON class
+  AliESDMuonTrack* ESDTrack = new  AliESDMuonTrack() ;
+
+  //-------------------- trigger tracks-------------
+  Long_t trigPat = 0;
+  fMUONData->SetTreeAddress("RL");
+  fMUONData->GetRecTriggerTracks();
+  recTrigTracksArray = fMUONData->RecTriggerTracks();
+
+  // ready global trigger pattern from first track
+  if (recTrigTracksArray) 
+    recTriggerTrack = (AliMUONTriggerTrack*) recTrigTracksArray->First();
+  if (recTriggerTrack) trigPat = recTriggerTrack->GetGTPattern();
+
+  //printf(">>> Event %d Number of Recconstructed tracks %d \n",iEvent, nrectracks);
+  // -------------------- tracks-------------
+  fMUONData->SetTreeAddress("RT");
+  fMUONData->GetRecTracks();
+  recTracksArray = fMUONData->RecTracks();
+        
+  Int_t nRecTracks = 0;
+  if (recTracksArray)
+    nRecTracks = (Int_t) recTracksArray->GetEntriesFast(); //
+  
+  // loop over tracks
+  for (Int_t iRecTracks = 0; iRecTracks <  nRecTracks;  iRecTracks++) {
+
+    // reading info from tracks
+    recTrack = (AliMUONTrack*) recTracksArray->At(iRecTracks);
+
+    trackParam = recTrack->GetTrackParamAtVertex();
+
+    bendingSlope            = trackParam->GetBendingSlope();
+    nonBendingSlope         = trackParam->GetNonBendingSlope();
+    inverseBendingMomentum = trackParam->GetInverseBendingMomentum();
+    xRec  = trackParam->GetNonBendingCoor();
+    yRec  = trackParam->GetBendingCoor();
+    zRec  = trackParam->GetZ();
+
+    nTrackHits       = recTrack->GetNTrackHits();
+    fitFmin          = recTrack->GetFitFMin();
+    matchTrigger     = recTrack->GetMatchTrigger();
+    chi2MatchTrigger = recTrack->GetChi2MatchTrigger();
+
+    // setting data member of ESD MUON
+    ESDTrack->SetInverseBendingMomentum(inverseBendingMomentum);
+    ESDTrack->SetThetaX(TMath::ATan(nonBendingSlope));
+    ESDTrack->SetThetaY(TMath::ATan(bendingSlope));
+    ESDTrack->SetZ(zRec);
+    ESDTrack->SetBendingCoor(yRec);
+    ESDTrack->SetNonBendingCoor(xRec);
+    ESDTrack->SetChi2(fitFmin);
+    ESDTrack->SetNHit(nTrackHits);
+    ESDTrack->SetMatchTrigger(matchTrigger);
+    ESDTrack->SetChi2MatchTrigger(chi2MatchTrigger);
+
+    // storing ESD MUON Track into ESD Event 
+    if (nRecTracks != 0)  
+      event->AddMuonTrack(ESDTrack);
+  } // end loop tracks
+
+  // add global trigger pattern
+  if (nRecTracks != 0)  
+    event->SetTrigger(trigPat);
+
+  // reset muondata
+  fMUONData->ResetRecTracks();
+  fMUONData->ResetRecTriggerTracks();
+
+  //} // end loop on event  
+  fLoader->UnloadTracks(); 
+}