]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONChamber.cxx
Separating run-dependent mapping data from data, which are not
[u/mrichter/AliRoot.git] / MUON / AliMUONChamber.cxx
index 68e78d376ff7ee6d76188e846186de9fe8ef583d..c55631ef1b56efd9bda5f49c9b023f00e8096e17 100644 (file)
 
 /* $Id$ */
 
+//-----------------------------------------------------------------------------
+// Class AliMUONChamber
+// -----------------------
+// MUON tracking chamber class
+// now only providing DisIntegration function
+//-----------------------------------------------------------------------------
+
 // --- ROOT includes ---
 #include <TRandom.h>
 #include <TMath.h>
+#include "AliRun.h"
+
 
 // --- MUON includes ---
+#include "AliMUON.h"
 #include "AliMUONChamber.h"
-#include "AliMUONChamberGeometry.h"
+#include "AliMUONHit.h"
 #include "AliLog.h"
 
+/// \cond CLASSIMP
 ClassImp(AliMUONChamber)       
+/// \endcond
 
+//_______________________________________________________
 AliMUONChamber::AliMUONChamber()
   : TObject(), 
     fId(0),
-    fdGas(0.),
-    fdAlu(0.),
-    fZ(0.),
-    fnsec(1),
-    frMin(0.),
-    frMax(0.),
     fCurrentCorrel(1), // to avoid mistakes if ChargeCorrelInit is not called
-    fSegmentation(0),
-    fReconstruction(0),
     fResponse(0),
-    fGeometry(0)
+    fMUON(0)
 {
-// Default constructor
+/// Default constructor
+
+  AliDebug(1, Form("default (empty) ctor this = %p", this));
 }
 
+//_______________________________________________________
 AliMUONChamber::AliMUONChamber(Int_t id) 
   : TObject(), 
     fId(id),
-    fdGas(0.),
-    fdAlu(0.),
-    fZ(0.),
-    fnsec(1),
-    frMin(0.),
-    frMax(0.),
     fCurrentCorrel(1), // to avoid mistakes if ChargeCorrelInit is not called
-    fSegmentation(0),
-    fReconstruction(0),
     fResponse(0),
-    fGeometry(0)
+    fMUON(0)
 {
-// Construtor with chamber id 
-    fSegmentation = new TObjArray(2);
-    fSegmentation->AddAt(0,0);
-    fSegmentation->AddAt(0,1);
+/// Standard constructor
 
-    fGeometry = new AliMUONChamberGeometry(fId);
-}
+    // muon
+    fMUON = (AliMUON*)gAlice->GetModule("MUON");
+    if (!fMUON) {
+      AliFatal("MUON detector not defined.");
+      return;
+    }  
 
-AliMUONChamber::AliMUONChamber(const AliMUONChamber& rChamber)
-  : TObject(rChamber)
-{
-// Protected copy constructor
-
-  AliFatal("Not implemented.");
- // Dummy copy constructor
+  AliDebug(1, Form("ctor this = %p", this) ); 
 }
 
+//_______________________________________________________
 AliMUONChamber::~AliMUONChamber() 
 {
-// Destructor
-  if (fSegmentation) {
-    fSegmentation->Delete();
-    delete fSegmentation;
-  }
-  delete fGeometry;
-}
-
-AliMUONChamber & AliMUONChamber::operator =(const AliMUONChamber& rhs)
-{
-// Protected assignement operator
+/// Destructor
 
-  if (this == &rhs) return *this;
-
-  AliFatal("Not implemented.");
-    
-  return *this;  
+  AliDebug(1, Form("dtor this = %p", this));
+  delete fResponse;
 }
 
-Bool_t  AliMUONChamber::IsSensId(Int_t volId) const 
+//_____________________________________________________
+void AliMUONChamber::ChargeCorrelationInit() 
 {
-// Returns true if the volume specified by volId is in the list
-// of sesitive volumes for this chamber
-
-  return fGeometry->IsSensitiveVolume(volId);
-}  
-
-void AliMUONChamber::Init()
-{
-// Initalisation ..
-//
-// ... for chamber segmentation
-  //PH    if ((*fSegmentation)[0]) 
-  //PH    ((AliSegmentation *) (*fSegmentation)[0])->Init(fId);
-    if (fSegmentation->At(0)) 
-    ((AliSegmentation *) fSegmentation->At(0))->Init(fId);
-
-    if (fnsec==2) {
-      //PH     if ((*fSegmentation)[1])
-      //PH     ((AliSegmentation *) (*fSegmentation)[1])->Init(fId);
-       if (fSegmentation->At(1))
-       ((AliSegmentation *) fSegmentation->At(1))->Init(fId);
-    }
-}
+/// Initialisation of charge correlation for current hit
+/// the value is stored, and then used by Disintegration
 
-Int_t   AliMUONChamber::SigGenCond(Float_t x, Float_t y, Float_t z)
-{
-// Ask segmentation if signal should be generated 
-    if (fnsec==1) {
-      //PH     return ((AliSegmentation*) (*fSegmentation)[0])
-       return ((AliSegmentation*) fSegmentation->At(0))
-           ->SigGenCond(x, y, z) ;
-    } else {
-      //PH     return (((AliSegmentation*) (*fSegmentation)[0])
-       return (((AliSegmentation*) fSegmentation->At(0))
-               ->SigGenCond(x, y, z)) ||
-      //PH         (((AliSegmentation*) (*fSegmentation)[1])
-           (((AliSegmentation*) fSegmentation->At(1))
-            ->SigGenCond(x, y, z)) ;
-    }
-}
-
-
-void    AliMUONChamber::SigGenInit(Float_t x, Float_t y, Float_t z)
-{
-//
-// Initialisation of segmentation for hit
-//  
-    if (fnsec==1) {
-      //PH     ((AliSegmentation*) (*fSegmentation)[0])->SigGenInit(x, y, z) ;
-       ((AliSegmentation*) fSegmentation->At(0))->SigGenInit(x, y, z) ;
-    } else {
-      //PH     ((AliSegmentation*) (*fSegmentation)[0])->SigGenInit(x, y, z) ;
-      //PH     ((AliSegmentation*) (*fSegmentation)[1])->SigGenInit(x, y, z) ;
-       ((AliSegmentation*) fSegmentation->At(0))->SigGenInit(x, y, z) ;
-       ((AliSegmentation*) fSegmentation->At(1))->SigGenInit(x, y, z) ;
-    }
-}
-
-void AliMUONChamber::ChargeCorrelationInit() {
-// Initialisation of charge correlation for current hit
-// the value is stored, and then used by Disintegration
-if (fnsec==1) 
-    fCurrentCorrel =1;
-else 
-    // exponential is here to avoid eventual problems in 0 
-    // factor 2 because chargecorrel is q1/q2 and not q1/qtrue
+  // exponential is here to avoid eventual problems in 0 
+  // factor 2 because chargecorrel is q1/q2 and not q1/qtrue
     fCurrentCorrel = TMath::Exp(gRandom->Gaus(0,fResponse->ChargeCorrel()/2));
 }
 
-void AliMUONChamber::DisIntegration(Float_t eloss, Float_t /*tof*/, 
-                                   Float_t xhit, Float_t yhit, Float_t zhit,
-                                   Int_t& nnew,Float_t newclust[6][500]) 
+//_____________________________________________________________________________
+void
+AliMUONChamber::SetResponseModel(const AliMUONResponse& thisResponse)
 {
-//    
-//  Generates pad hits (simulated cluster) 
-//  using the segmentation and the response model 
-    Float_t dx, dy;
-    //
-    // Width of the integration area
-    //
-    dx=fResponse->SigmaIntegration()*fResponse->ChargeSpreadX();
-    dy=fResponse->SigmaIntegration()*fResponse->ChargeSpreadY();
-    //
-    // Get pulse height from energy loss
-    Float_t qtot = fResponse->IntPH(eloss);
-    //
-    // Loop Over Pads
-    
-    Float_t qp; 
-    nnew=0;
-    
-    // Cathode plane loop
-    for (Int_t i=1; i<=fnsec; i++) {
-       Float_t qcath = qtot * (i==1? fCurrentCorrel : 1/fCurrentCorrel);
-       AliSegmentation * segmentation=
-      //PH         (AliSegmentation *) (*fSegmentation)[i-1];
-           (AliSegmentation *) fSegmentation->At(i-1);
-       for (segmentation->FirstPad(xhit, yhit, zhit, dx, dy); 
-            segmentation->MorePads(); 
-            segmentation->NextPad()) 
-       {
-           qp=fResponse->IntXY(segmentation);
-           qp=TMath::Abs(qp);
-//
-//
-           if (qp > 1.e-4) 
-            {
-               if (nnew >= 500) // Perform a bounds check on nnew since it is assumed
-                                // newclust only contains 500 elements.
-               {
-                       AliError("Limit of 500 pad responses reached.");
-                       return;
-               };
-               //
-               // --- store signal information
-               newclust[0][nnew]=qcath;                     // total charge
-               newclust[1][nnew]=segmentation->Ix();       // ix-position of pad
-               newclust[2][nnew]=segmentation->Iy();       // iy-position of pad
-               newclust[3][nnew]=qp * qcath;                // charge on pad
-               newclust[4][nnew]=segmentation->ISector();  // sector id
-               newclust[5][nnew]=(Float_t) i;              // counter
-               nnew++;
-               
-           }
-       } // Pad loop
-       
-    } // Cathode plane loop
+  delete fResponse;
+  fResponse = static_cast<AliMUONResponse*>(thisResponse.Clone());
 }
 
-
-
-void AliMUONChamber::InitGeo(Float_t /*zpos*/)
-{
-//    sensitive gas gap
-      fdGas= 0.5;
-//    3% radiation length of aluminum (X0=8.9 cm)      
-      fdAlu= 3.0/100*8.9;
-}
-
-