]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUON.cxx
Updated list of MUON libraries
[u/mrichter/AliRoot.git] / MUON / AliMUON.cxx
index 92e7cb6a0b566bc75b619e2ec262a07fdfd97690..464df0c95ce8f98cd475bf290cbba4ce7441fcf0 100644 (file)
 
 /* $Id$ */
 
-
-///////////////////////////////////////////////
-//  Manager and hits classes for set:MUON     //
-////////////////////////////////////////////////
+// ------------------
+// Class AliMUON
+// ------------------
+// AliDetector class for MUON subsystem 
+// providing simulation data management 
 
 #include "Riostream.h"
 
 #include "AliMUONChamberTrigger.h"
 #include "AliMUONConstants.h"
 #include "AliMUONHit.h"        
-#include "AliMUONRawCluster.h"
-#include "AliMUONTransientDigit.h"
-#include "AliMUONTriggerCircuit.h"
+#include "AliMUONGeometry.h"
+#include "AliMUONGeometryTransformer.h"
 #include "AliMUONGeometryBuilder.h"
 #include "AliMUONCommonGeometryBuilder.h"
 #include "AliMUONVGeometryBuilder.h"   
-#include "AliMUONGeometryDEIndexing.h" 
 #include "AliMUONGeometrySegmentation.h"
-#include "AliMUONDigitizerv2.h"
-#include "AliMUONSDigitizerv1.h"
-#include "AliMUONRawData.h"
-#include "AliMUONFactoryV2.h"
+#include "AliMUONRawWriter.h"
+#include "AliMUONSegmentation.h"
 #include "AliLog.h"
 
+#include "AliMUONSDigitizerV2.h"
+#include "AliMUONDigitizerV3.h"
+#include "AliMUONDigitMaker.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.};
@@ -82,7 +88,9 @@
 //          according to (Z1 = zch) and  (Z2 = zch + DTPLANES)
 //          for the first and second chambers in the station, respectively
 
-ClassImp(AliMUON)
+/// \cond CLASSIMP
+ClassImp(AliMUON)  
+/// \endcond
 
 //__________________________________________________________________
 AliMUON::AliMUON()
@@ -92,10 +100,8 @@ AliMUON::AliMUON()
     fMUONData(0),
     fSplitLevel(0),
     fChambers(0),
-    fTriggerCircuits(0),
     fGeometryBuilder(0),
-    fSegmentationType(2),// set to 2 default wise new seg
-    fDEIndexing(0),
+    fSegmentation(0),
     fAccCut(kFALSE),
     fAccMin(0.),
     fAccMax(0.),   
@@ -105,25 +111,31 @@ AliMUON::AliMUON()
     fMaxDestepAlu(0.),
     fMaxIterPad(0),
     fCurIterPad(0),
-    fFactory(0)
+    fTriggerScalerEvent(kFALSE),
+    fTriggerResponseV1(kFALSE),
+    fTriggerCoinc44(0),
+    fTriggerEffCells(0),
+    fDigitizerWithNoise(kTRUE),
+    fRawWriter(0x0),
+    fDigitMaker(0x0)
+
 {
-// Default Constructor
-//
+/// Default Constructor
+    
+    AliDebug(1,Form("default (empty) ctor this=%p",this));
     fIshunt          = 0;
 }
 
 //__________________________________________________________________
-AliMUON::AliMUON(const char *name, const char *title)
-  : AliDetector(name,title),
+AliMUON::AliMUON(const char *name, const chartitle)
+  : AliDetector(name, title),
     fNCh(AliMUONConstants::NCh()),
     fNTrackingCh(AliMUONConstants::NTrackingCh()),
     fMUONData(0),
     fSplitLevel(0),
     fChambers(0),
-    fTriggerCircuits(0),
     fGeometryBuilder(0),
-    fSegmentationType(2),// set to 2 default wise new seg
-    fDEIndexing(0),
+    fSegmentation(0),
     fAccCut(kFALSE),
     fAccMin(0.),
     fAccMax(0.),   
@@ -133,12 +145,20 @@ AliMUON::AliMUON(const char *name, const char *title)
     fMaxDestepAlu(-1), // in the calculation of the tracking parameters
     fMaxIterPad(0),
     fCurIterPad(0),
-    fFactory(0)
+    fTriggerScalerEvent(kFALSE),
+    fTriggerResponseV1(kFALSE),
+    fTriggerCoinc44(0),
+    fTriggerEffCells(0),
+    fDigitizerWithNoise(kTRUE),
+    fRawWriter(0x0),
+    fDigitMaker(new AliMUONDigitMaker(kFALSE)) 
 {
-
+/// Standard constructor  
+  
+  AliDebug(1,Form("ctor this=%p",this));
   fIshunt =  0;
 
-  SetMarkerColor(kRed);//
+  //PH SetMarkerColor(kRed);//
     
   // Geometry builder
   fGeometryBuilder = new AliMUONGeometryBuilder(this);
@@ -147,19 +167,17 @@ AliMUON::AliMUON(const char *name, const char *title)
   fGeometryBuilder
     ->AddBuilder(new AliMUONCommonGeometryBuilder(this));
 
-  // Define the global transformation:
-  // Transformation from the old ALICE coordinate system to a new one:
-  // x->-x, z->-z 
-  TGeoRotation* rotGlobal 
-    = new TGeoRotation("rotGlobal", 90., 180., 90., 90., 180., 0.);
-  fGeometryBuilder
-    ->SetGlobalTransformation (TGeoCombiTrans(0., 0., 0., rotGlobal));
+  // 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.
 
-  // Detection elements indexing
-  fDEIndexing = new AliMUONGeometryDEIndexing();
-
-//
-// Creating List of Chambers
+  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());
 
@@ -174,75 +192,37 @@ AliMUON::AliMUON(const char *name, const char *title)
        if (ch < AliMUONConstants::NTrackingCh()) {
          fChambers->AddAt(new AliMUONChamber(ch),ch);
        } else {
-         fChambers->AddAt(new AliMUONChamberTrigger(ch),ch);
+         fChambers->AddAt(new AliMUONChamberTrigger(ch, GetGeometryTransformer()),ch);
        }
-       AliMUONChamber* chamber = (AliMUONChamber*) fChambers->At(ch);
-       //chamber->SetGid(0);
-       // Default values for Z of chambers
-       chamber->SetZ(AliMUONConstants::DefaultChamberZ(ch));
-       //
-       chamber->InitGeo(AliMUONConstants::DefaultChamberZ(ch));
-       //          Set chamber inner and outer radius to default
-       chamber->SetRInner(AliMUONConstants::Dmin(st)/2.);
-       chamber->SetROuter(AliMUONConstants::Dmax(st)/2.);
-       //
       } // Chamber stCH (0, 1) in 
     }     // Station st (0...)
-    
-    // cp new design of AliMUONTriggerDecision
-    fTriggerCircuits = new TObjArray(AliMUONConstants::NTriggerCircuit());
-    for (Int_t circ=0; circ<AliMUONConstants::NTriggerCircuit(); circ++) {
-      fTriggerCircuits->AddAt(new AliMUONTriggerCircuit(),circ);          
-    }
-}
 
-//____________________________________________________________________
-AliMUON::AliMUON(const AliMUON& rMUON)
- : AliDetector(rMUON)
-{
-// Protected copy constructor
-
-  AliFatal("Not implemented.");
 }
 
 //____________________________________________________________________
 AliMUON::~AliMUON()
 {
-// Destructor
-  AliDebug(1,"Calling AliMUON destructor");
+/// Destructor
+
+  AliDebug(1,Form("dtor this=%p",this));
   fIshunt  = 0;
 
   if (fChambers){
     fChambers->Delete();
     delete fChambers;
   }
-  if (fTriggerCircuits){
-    fTriggerCircuits->Delete();
-    delete fTriggerCircuits;
-  }
+  
   delete fMUONData;
   delete fGeometryBuilder;
-  delete fDEIndexing;
-  delete fFactory; 
-}
-
-//________________________________________________________________________
-AliMUON& AliMUON::operator = (const AliMUON& rhs)
-{
-// Protected assignement operator
-
-  if (this == &rhs) return *this;
-
-  AliFatal("Not implemented.");
-    
-  return *this;  
+  delete fSegmentation;
+  delete fRawWriter;
+  delete fDigitMaker;
 }
 
 //_____________________________________________________________________________
 void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder)
 {
-// Adds the geometry builder to the list
-// ---
+/// Add the geometry builder to the list
 
   fGeometryBuilder->AddBuilder(geomBuilder);
 }
@@ -250,12 +230,7 @@ void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder)
 //____________________________________________________________________
 void AliMUON::BuildGeometry()
 {
-// Geometry for event display
-
-  if (!fSegmentationType) {
-    AliFatal("No Segmentation Type defined.");
-    return;
-  }
+/// Geometry for event display
 
 
 //     for (Int_t i = 0; i < AliMUONConstants::NCh(); i++)     
@@ -264,9 +239,36 @@ void AliMUON::BuildGeometry()
   
 }
 
+//____________________________________________________________________
+const AliMUONGeometry*  AliMUON::GetGeometry() const
+{
+/// Return geometry parametrisation
+
+  if ( !fGeometryBuilder) {
+    AliWarningStream() << "GeometryBuilder not defined." << std::endl;
+    return 0;
+  }
+  
+  return fGeometryBuilder->GetGeometry();
+}   
+
+//____________________________________________________________________
+const AliMUONGeometryTransformer*  AliMUON::GetGeometryTransformer() const
+{
+/// Return geometry parametrisation
+
+  const AliMUONGeometry* kGeometry = GetGeometry();
+  
+  if ( !kGeometry) return 0;
+
+  return kGeometry->GetTransformer();
+}   
+
 //__________________________________________________________________
 void  AliMUON::SetTreeAddress()
 {
+/// Set Hits tree address
+
   GetMUONData()->SetLoader(fLoader); 
   //  GetMUONData()->MakeBranch("D,S,RC");
   //  GetMUONData()->SetTreeAddress("H,D,S,RC");
@@ -281,27 +283,11 @@ void  AliMUON::SetTreeAddress()
   fHits = GetMUONData()->Hits(); // Added by Ivana to use the methods FisrtHit, NextHit of AliDetector    
 }
 
-//___________________________________________
-void AliMUON::SetChambersZ(const Float_t *Z)
-{
-  // Set Z values for all chambers (tracking and trigger)
-  // from the array pointed to by "Z"
-    for (Int_t ch = 0; ch < AliMUONConstants::NCh(); ch++)
-       ((AliMUONChamber*) fChambers->At(ch))->SetZ(Z[ch]);
-    return;
-}
-//_________________________________________________________________
-void AliMUON::SetChambersZToDefault()
-{
-  // Set Z values for all chambers (tracking and trigger)
-  // to default values
-  SetChambersZ(AliMUONConstants::DefaultChamberZ());
-  return;
-}
 //_________________________________________________________________
 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);
@@ -310,7 +296,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);
@@ -318,7 +305,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);
@@ -327,7 +314,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);
@@ -336,32 +324,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;
 }  
@@ -369,7 +361,7 @@ Float_t  AliMUON::GetMaxStepGas() const
 //____________________________________________________________________
 Float_t  AliMUON::GetMaxStepAlu() const
 {
-// Return step size in Alu
+/// Return step size in Alu
   
   return fMaxStepAlu;
 }
@@ -377,7 +369,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;
 }
@@ -385,7 +377,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;
 }
@@ -393,40 +385,38 @@ 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);
 }   
-    
+
 //____________________________________________________________________
-void   AliMUON::SetSegmentationModel(Int_t id, Int_t isec, AliMUONGeometrySegmentation*  segmentation)
+ void  AliMUON::SetAlign(const TString& fileName, Bool_t align)
 {
-// Set the segmentation for chamber id cathode isec
-    ((AliMUONChamber*) fChambers->At(id))->SetSegmentationModel(isec, segmentation);
+/// Set option for alignement to geometry builder
+   fGeometryBuilder->SetAlign(fileName, align);
+}   
 
-}
 //____________________________________________________________________
 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);
 }
-//____________________________________________________________________
-void   AliMUON::SetNsec(Int_t id, Int_t nsec)
-{
-// Set number of segmented cathods for chamber id
-    ((AliMUONChamber*) fChambers->At(id))->SetNsec(nsec);
-}
+
 //____________________________________________________________________
 AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
 {
-  return new AliMUONDigitizerv2(manager);
+/// Return digitizer
+  
+  return new AliMUONDigitizerV3(manager, fDigitizerWithNoise);
 }
+
 //_____________________________________________________________________
 void AliMUON::SDigits2Digits()
 {
-
-// write TreeD here 
+/// Write TreeD here only 
 
     char hname[30];
     //    sprintf(hname,"TreeD%d",fLoader->GetHeader()->GetEvent());
@@ -437,62 +427,124 @@ void AliMUON::SDigits2Digits()
 //_____________________________________________________________________
 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();
+/// Perform Hits2Digits using SDigitizerV2
+  
+  TTask* sdigitizer = new AliMUONSDigitizerV2;
+  sdigitizer->ExecuteTask();
 }
+
 //_____________________________________________________________________
 void AliMUON::Digits2Raw()
 {
-  // convert digits of the current event to raw data
-  AliMUONRawData* rawData;
+/// Convert digits of the current event to raw data
+
+  if (!fRawWriter)
+  {
+    fRawWriter = new AliMUONRawWriter(fMUONData);
+    if (fTriggerScalerEvent == kTRUE) 
+    {
+      fRawWriter->SetScalersNumbers();
+    }
+  }
+  
+  if (!fRawWriter->Digits2Raw()) 
+  {
+    AliError("pb writting raw data");
+  }
+}
+
+//_____________________________________________________________________
+Bool_t AliMUON::Raw2SDigits(AliRawReader* rawReader)
+{
+/// Convert  raw data to SDigit
+/// Only for tracking for the moment (ChF) 
+
+  //fLoader->LoadDigits("READ");
+  if (!fLoader->TreeS()) fLoader->MakeSDigitsContainer();
+
+  fMUONData->MakeBranch("S");
+  fMUONData->SetTreeAddress("S");
+  fDigitMaker->Raw2Digits(rawReader);
+  fMUONData->Fill("S");
+
+  fLoader->WriteSDigits("OVERWRITE");
+  fMUONData->ResetSDigits();
+  fLoader->UnloadSDigits();
+
+  return kTRUE;
 
-  rawData = new AliMUONRawData(fLoader);
-  if (!rawData->Digits2Raw()) AliInfo("pb writting raw data");
-  delete rawData;
-  return;
 }
+
 //_______________________________________________________________________
 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));
  fLoader   = new AliLoader(GetName(),topfoldername);
- fMUONData = new AliMUONData(fLoader,GetName(),GetName()); 
+ fMUONData = new AliMUONSimData(fLoader,GetName(),GetName()); 
  fMUONData->SetSplitLevel(fSplitLevel);
+
+ fDigitMaker->SetMUONData(fMUONData);
+
  return fLoader;
 }
-//_______________________________________________________________________
 
-AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t icluster)
-{
-//
-//  Return rawcluster (icluster) for chamber ichamber and cathode icathod
-//  Obsolete ??
-    TClonesArray *muonRawCluster  = GetMUONData()->RawClusters(ichamber);
-    ResetRawClusters();
-    TTree *treeR = fLoader->TreeR();
-    Int_t nent=(Int_t)treeR->GetEntries();
-    treeR->GetEvent(nent-2+icathod-1);
-    //treeR->GetEvent(icathod);
-    //Int_t nrawcl = (Int_t)muonRawCluster->GetEntriesFast();
-
-    AliMUONRawCluster * mRaw = (AliMUONRawCluster*)muonRawCluster->UncheckedAt(icluster);
-    //printf("RawCluster _ nent nrawcl icluster mRaw %d %d %d%p\n",nent,nrawcl,icluster,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));
+}
+
+//____________________________________________________________________
+Bool_t  AliMUON::GetTriggerResponseV1() const
+{
+///
+/// Returns fTriggerResponseV1
+///  
+    return fTriggerResponseV1;
+    
+}  
+
+//____________________________________________________________________
+Int_t  AliMUON::GetTriggerCoinc44() const
+{
+///
+/// Returns fTriggerCoinc44
+///  
+    return fTriggerCoinc44;
     
-    return  mRaw;
 }
-//________________________________________________________________________
+
+//____________________________________________________________________
+Bool_t  AliMUON::GetTriggerEffCells() const
+{
+///
+/// Returns fTriggerEffCells
+///  
+    return fTriggerEffCells;
+    
+}  
+
+//____________________________________________________________________
+Bool_t  AliMUON::GetDigitizerWithNoise() const
+{
+///
+/// Returns fDigitizerWithNoise
+///  
+    return fDigitizerWithNoise;
+    
+}