]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUON.cxx
- Old StepManager() replaced with StepManager2()
[u/mrichter/AliRoot.git] / MUON / AliMUON.cxx
index e02164ecfb68e17d21bbc93c5c2babbf5d006603..4df500651d4450bd09a4a0e615463d8d8cd82e05 100644 (file)
 
 /* $Id$ */
 
-
-///////////////////////////////////////////////
-//  Manager and hits classes for set:MUON     //
-////////////////////////////////////////////////
+// ------------------
+// Class AliMUON
+// ------------------
+// AliDetector class for MUON subsystem 
+// providing simulation data management 
 
 #include "Riostream.h"
 
@@ -57,6 +58,7 @@
 #include "AliMUONRawCluster.h"
 #include "AliMUONTransientDigit.h"
 #include "AliMUONTriggerCircuit.h"
+#include "AliMUONTriggerCircuitNew.h"
 #include "AliMUONGeometry.h"
 #include "AliMUONGeometryTransformer.h"
 #include "AliMUONGeometryBuilder.h"
 #include "AliMUONSDigitizerV2.h"
 #include "AliMUONDigitizerV3.h"
 
+#include "AliMUONSt1GeometryBuilderV2.h"
+#include "AliMUONSt2GeometryBuilderV2.h"
+#include "AliMUONSlatGeometryBuilder.h"
+#include "AliMUONTriggerGeometryBuilder.h"
+
 // Defaults parameters for Z positions of chambers
 // taken from values for "stations" in AliMUON::AliMUON
 //     const Float_t zch[7]={528, 690., 975., 1249., 1449., 1610, 1710.};
@@ -97,6 +104,7 @@ AliMUON::AliMUON()
     fSplitLevel(0),
     fChambers(0),
     fTriggerCircuits(0),
+    fTriggerCircuitsNew(0),
     fGeometryBuilder(0),
     fSegmentation(0),
     fAccCut(kFALSE),
@@ -110,11 +118,12 @@ AliMUON::AliMUON()
     fCurIterPad(0),
     fTriggerScalerEvent(kFALSE),
     fSDigitizerType(""),
-    fDigitizerType("")
+    fDigitizerType(""),
+  fRawWriter(0x0)
 {
-// Default Constructor
-//
-       AliDebug(1,Form("default (empty) ctor this=%p",this));
+/// Default Constructor
+    
+    AliDebug(1,Form("default (empty) ctor this=%p",this));
     fIshunt          = 0;
 }
 
@@ -129,6 +138,7 @@ AliMUON::AliMUON(const char *name, const char *title,
     fSplitLevel(0),
     fChambers(0),
     fTriggerCircuits(0),
+    fTriggerCircuitsNew(0),
     fGeometryBuilder(0),
     fSegmentation(0),
     fAccCut(kFALSE),
@@ -142,9 +152,12 @@ AliMUON::AliMUON(const char *name, const char *title,
     fCurIterPad(0),
          fTriggerScalerEvent(kFALSE),
     fSDigitizerType(sDigitizerClassName),
-    fDigitizerType(digitizerClassName)
+    fDigitizerType(digitizerClassName),
+  fRawWriter(0x0)
 {
-       AliDebug(1,Form("ctor this=%p",this));
+/// Standard constructor  
+  
+  AliDebug(1,Form("ctor this=%p",this));
   fIshunt =  0;
 
   SetMarkerColor(kRed);//
@@ -156,8 +169,17 @@ AliMUON::AliMUON(const char *name, const char *title,
   fGeometryBuilder
     ->AddBuilder(new AliMUONCommonGeometryBuilder(this));
 
-//
-// Creating List of Chambers
+  // By default, add also all the needed geometry builders.
+  // If you want to change this from outside, please use ResetGeometryBuilder
+  // method, followed by AddGeometryBuilder ones.
+
+  AddGeometryBuilder(new AliMUONSt1GeometryBuilderV2(this));
+  AddGeometryBuilder(new AliMUONSt2GeometryBuilderV2(this));
+  AddGeometryBuilder(new AliMUONSlatGeometryBuilder(this));
+  AddGeometryBuilder(new AliMUONTriggerGeometryBuilder(this));
+  
+  //
+  // Creating List of Chambers
     Int_t ch;
     fChambers = new TObjArray(AliMUONConstants::NCh());
 
@@ -182,13 +204,19 @@ AliMUON::AliMUON(const char *name, const char *title,
     for (Int_t circ=0; circ<AliMUONConstants::NTriggerCircuit(); circ++) {
       fTriggerCircuits->AddAt(new AliMUONTriggerCircuit(),circ);          
     }
+
+    fTriggerCircuitsNew = new TObjArray(AliMUONConstants::NTriggerCircuit());
+    for (Int_t circ=0; circ<AliMUONConstants::NTriggerCircuit(); circ++) {
+      fTriggerCircuitsNew->AddAt(new AliMUONTriggerCircuitNew(),circ);          
+    }
+    
 }
 
 //____________________________________________________________________
 AliMUON::AliMUON(const AliMUON& rMUON)
  : AliDetector(rMUON)
 {
-// Protected copy constructor
+/// Protected copy constructor
 
   AliFatal("Not implemented.");
 }
@@ -196,7 +224,8 @@ AliMUON::AliMUON(const AliMUON& rMUON)
 //____________________________________________________________________
 AliMUON::~AliMUON()
 {
-// Destructor
+/// Destructor
+
   AliDebug(1,Form("dtor this=%p",this));
   fIshunt  = 0;
 
@@ -208,15 +237,21 @@ AliMUON::~AliMUON()
     fTriggerCircuits->Delete();
     delete fTriggerCircuits;
   }
+  if (fTriggerCircuitsNew){
+    fTriggerCircuitsNew->Delete();
+    delete fTriggerCircuitsNew;
+  }
+  
   delete fMUONData;
   delete fGeometryBuilder;
   delete fSegmentation;
+  delete fRawWriter;
 }
 
 //________________________________________________________________________
 AliMUON& AliMUON::operator = (const AliMUON& rhs)
 {
-// Protected assignement operator
+/// Protected assignement operator
 
   if (this == &rhs) return *this;
 
@@ -228,8 +263,7 @@ AliMUON& AliMUON::operator = (const AliMUON& rhs)
 //_____________________________________________________________________________
 void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder)
 {
-// Adds the geometry builder to the list
-// ---
+/// Add the geometry builder to the list
 
   fGeometryBuilder->AddBuilder(geomBuilder);
 }
@@ -237,7 +271,7 @@ void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder)
 //____________________________________________________________________
 void AliMUON::BuildGeometry()
 {
-// Geometry for event display
+/// Geometry for event display
 
 
 //     for (Int_t i = 0; i < AliMUONConstants::NCh(); i++)     
@@ -249,7 +283,7 @@ void AliMUON::BuildGeometry()
 //____________________________________________________________________
 const AliMUONGeometry*  AliMUON::GetGeometry() const
 {
-// Return geometry parametrisation
+/// Return geometry parametrisation
 
   if ( !fGeometryBuilder) {
     AliWarningStream() << "GeometryBuilder not defined." << std::endl;
@@ -262,7 +296,7 @@ const AliMUONGeometry*  AliMUON::GetGeometry() const
 //____________________________________________________________________
 const AliMUONGeometryTransformer*  AliMUON::GetGeometryTransformer() const
 {
-// Return geometry parametrisation
+/// Return geometry parametrisation
 
   const AliMUONGeometry* kGeometry = GetGeometry();
   
@@ -274,6 +308,8 @@ const AliMUONGeometryTransformer*  AliMUON::GetGeometryTransformer() const
 //__________________________________________________________________
 void  AliMUON::SetTreeAddress()
 {
+/// Set Hits tree address
+
   GetMUONData()->SetLoader(fLoader); 
   //  GetMUONData()->MakeBranch("D,S,RC");
   //  GetMUONData()->SetTreeAddress("H,D,S,RC");
@@ -291,7 +327,8 @@ void  AliMUON::SetTreeAddress()
 //_________________________________________________________________
 void AliMUON::SetChargeSlope(Int_t id, Float_t p1)
 {
-// Set the inverse charge slope for chamber id
+/// Set the inverse charge slope for chamber id
+
     Int_t i=2*(id-1);    //PH    ((AliMUONChamber*) (*fChambers)[i])->SetSigmaIntegration(p1);
     //PH    ((AliMUONChamber*) (*fChambers)[i+1])->SetSigmaIntegration(p1);
     ((AliMUONChamber*) fChambers->At(i))->SetChargeSlope(p1);
@@ -300,7 +337,8 @@ void AliMUON::SetChargeSlope(Int_t id, Float_t p1)
 //__________________________________________________________________
 void AliMUON::SetChargeSpread(Int_t id, Float_t p1, Float_t p2)
 {
-// Set sigma of charge spread for chamber id
+/// Set sigma of charge spread for chamber id
+
     Int_t i=2*(id-1);
     ((AliMUONChamber*) fChambers->At(i))->SetChargeSpread(p1,p2);
     ((AliMUONChamber*) fChambers->At(i+1))->SetChargeSpread(p1,p2);
@@ -308,7 +346,7 @@ void AliMUON::SetChargeSpread(Int_t id, Float_t p1, Float_t p2)
 //___________________________________________________________________
 void AliMUON::SetSigmaIntegration(Int_t id, Float_t p1)
 {
-// Set integration limits for charge spread
+/// Set integration limits for charge spread
     Int_t i=2*(id-1);
     ((AliMUONChamber*) fChambers->At(i))->SetSigmaIntegration(p1);
     ((AliMUONChamber*) fChambers->At(i+1))->SetSigmaIntegration(p1);
@@ -317,7 +355,8 @@ void AliMUON::SetSigmaIntegration(Int_t id, Float_t p1)
 //__________________________________________________________________
 void AliMUON::SetMaxAdc(Int_t id, Int_t p1)
 {
-// Set maximum number for ADCcounts (saturation)
+/// Set maximum number for ADCcounts (saturation)
+
     Int_t i=2*(id-1);
     ((AliMUONChamber*) fChambers->At(i))->SetMaxAdc(p1);
     ((AliMUONChamber*) fChambers->At(i+1))->SetMaxAdc(p1);
@@ -326,32 +365,36 @@ void AliMUON::SetMaxAdc(Int_t id, Int_t p1)
 //__________________________________________________________________
 void AliMUON::SetMaxStepGas(Float_t p1)
 {
-// Set stepsize in gas
+/// Set stepsize in gas
+
   fMaxStepGas=p1;
 }
 //__________________________________________________________________
 void AliMUON::SetMaxStepAlu(Float_t p1)
 {
-// Set step size in Alu
+/// Set step size in Alu
+
     fMaxStepAlu=p1;
 }
 //__________________________________________________________________
 void AliMUON::SetMaxDestepGas(Float_t p1)
 {
-// Set maximum step size in Gas
+/// Set maximum step size in Gas
+
     fMaxDestepGas=p1;
 }
 //__________________________________________________________________
 void AliMUON::SetMaxDestepAlu(Float_t p1)
 {
-// Set maximum step size in Alu
+/// Set maximum step size in Alu
+
   fMaxDestepAlu=p1;
 }
 
 //____________________________________________________________________
 Float_t  AliMUON::GetMaxStepGas() const
 {
-// Return stepsize in gas
+/// Return stepsize in gas
   
   return fMaxStepGas;
 }  
@@ -359,7 +402,7 @@ Float_t  AliMUON::GetMaxStepGas() const
 //____________________________________________________________________
 Float_t  AliMUON::GetMaxStepAlu() const
 {
-// Return step size in Alu
+/// Return step size in Alu
   
   return fMaxStepAlu;
 }
@@ -367,7 +410,7 @@ Float_t  AliMUON::GetMaxStepAlu() const
 //____________________________________________________________________
 Float_t  AliMUON::GetMaxDestepGas() const
 {
-// Return maximum step size in Gas
+/// Return maximum step size in Gas
   
   return fMaxDestepGas;
 }
@@ -375,7 +418,7 @@ Float_t  AliMUON::GetMaxDestepGas() const
 //____________________________________________________________________
 Float_t  AliMUON::GetMaxDestepAlu() const
 {
-// Return maximum step size in Gas
+/// Return maximum step size in Gas
   
   return fMaxDestepAlu;
 }
@@ -383,7 +426,7 @@ Float_t  AliMUON::GetMaxDestepAlu() const
 //____________________________________________________________________
  void  AliMUON::SetAlign(Bool_t align)
 {
- // Sets option for alignement to geometry builder
+/// Set option for alignement to geometry builder
  
    fGeometryBuilder->SetAlign(align);
 }   
@@ -391,7 +434,7 @@ Float_t  AliMUON::GetMaxDestepAlu() const
 //____________________________________________________________________
  void  AliMUON::SetAlign(const TString& fileName, Bool_t align)
 {
- // Sets option for alignement to geometry builder
+/// Set option for alignement to geometry builder
  
    fGeometryBuilder->SetAlign(fileName, align);
 }   
@@ -399,14 +442,15 @@ Float_t  AliMUON::GetMaxDestepAlu() const
 //____________________________________________________________________
 void   AliMUON::SetResponseModel(Int_t id, AliMUONResponse *response)
 {
-// Set the response for chamber id
+/// Set the response for chamber id
     ((AliMUONChamber*) fChambers->At(id))->SetResponseModel(response);
 }
+
 //____________________________________________________________________
 AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
 {
-  // FIXME: the selection of the class should be done through a factory
-  // mechanism. (see also Hits2SDigits()).
+/// FIXME: the selection of the class should be done through a factory
+/// mechanism. (see also Hits2SDigits()).
   
   AliInfo(Form("Digitizer used : %s",fDigitizerType.Data()));
   
@@ -420,8 +464,16 @@ AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
   }
   else if ( fDigitizerType == "digitizer:NewDigitizerOldTrigger" )
   {
-    return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerDecision);
+    return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerDecision, kFALSE, kFALSE);
   }
+  else if ( fDigitizerType == "digitizer:NewDigitizerEffTrigger" )
+  {
+    return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerDecision, kTRUE, kFALSE);
+  }  
+  else if ( fDigitizerType == "digitizer:NewDigitizerWithNoiseOldTrigger" )
+  {
+    return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerDecision, kFALSE, kTRUE);
+  }    
   else
   {
     AliFatal(Form("Unknown digitizer type : %s",fDigitizerType.Data()));
@@ -433,14 +485,15 @@ AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
 TString
 AliMUON::SDigitizerType() const
 {
+/// Return digitizer type
+
   return fSDigitizerType;
 }
 
 //_____________________________________________________________________
 void AliMUON::SDigits2Digits()
 {
-
-// write TreeD here 
+/// Write TreeD here only 
 
     char hname[30];
     //    sprintf(hname,"TreeD%d",fLoader->GetHeader()->GetEvent());
@@ -451,8 +504,8 @@ void AliMUON::SDigits2Digits()
 //_____________________________________________________________________
 void AliMUON::Hits2SDigits()
 {
-  // FIXME: the selection of the sdigitizer should be done through a
-  // factory mechanism.
+/// FIXME: the selection of the sdigitizer should be done through a
+/// factory mechanism.
   
   AliInfo(Form("SDigitizer used : %s",fSDigitizerType.Data()));
 
@@ -485,25 +538,36 @@ void AliMUON::Hits2SDigits()
 TString
 AliMUON::DigitizerType() const
 {
+/// Return digitizer type
+
   return fDigitizerType;
 }
 
 //_____________________________________________________________________
 void AliMUON::Digits2Raw()
 {
-  // convert digits of the current event to raw data
-  AliMUONRawWriter rawData(fLoader,fMUONData);
+/// Convert digits of the current event to raw data
 
-  if (fTriggerScalerEvent == kTRUE) rawData.SetScalerEvent();
-  if (!rawData.Digits2Raw()) AliInfo("pb writting raw data");
+  if (!fRawWriter)
+  {
+    fRawWriter = new AliMUONRawWriter(fMUONData);
+    if (fTriggerScalerEvent == kTRUE) 
+    {
+      fRawWriter->SetScalerEvent();
+    }
+  }
+  
+  if (!fRawWriter->Digits2Raw()) 
+  {
+    AliError("pb writting raw data");
+  }
 }
 
 //_______________________________________________________________________
 AliLoader* AliMUON::MakeLoader(const char* topfoldername)
 { 
-//builds standard getter (AliLoader type)
-//if detector wants to use castomized getter, it must overload this method
-
+/// Build standard getter (AliLoader type);
+/// if detector wants to use castomized getter, it must overload this method
  
  AliDebug(1,Form("Creating standard getter for detector %s. Top folder is %s.",
          GetName(),topfoldername));
@@ -516,9 +580,9 @@ AliLoader* AliMUON::MakeLoader(const char* topfoldername)
 
 AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t icluster)
 {
-//
-//  Return rawcluster (icluster) for chamber ichamber and cathode icathod
-//  Obsolete ??
+/// Return rawcluster (icluster) for chamber ichamber and cathode icathod
+/// Obsolete ??
+
     TClonesArray *muonRawCluster  = GetMUONData()->RawClusters(ichamber);
     ResetRawClusters();
     TTree *treeR = fLoader->TreeR();
@@ -532,5 +596,19 @@ AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t iclu
     
     return  mRaw;
 }
+
 //________________________________________________________________________
+void
+AliMUON::ResetGeometryBuilder()
+{
+/// Only to be used by "experts" wanting to change the geometry builders
+/// to be used. 
+/// As the ctor of AliMUON now defines a default geometrybuilder, this
+/// ResetGeometryBuilder() must be called prior to call the 
+/// AddGeometryBuilder()
 
+  delete fGeometryBuilder;
+  fGeometryBuilder = new AliMUONGeometryBuilder(this);
+  fGeometryBuilder
+    ->AddBuilder(new AliMUONCommonGeometryBuilder(this));
+}