]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONChamber.cxx
Don't use shunting if you don't want it !
[u/mrichter/AliRoot.git] / MUON / AliMUONChamber.cxx
index 91eec1f45e8c8620d13019f7a67c15d3d4ad7b3b..70411531d0f22ce6569c62a3247d20a242faa095 100644 (file)
  **************************************************************************/
 /*
 $Log$
+Revision 1.11  2001/07/20 10:03:14  morsch
+Changes needed to work with Root 3.01 (substitute lhs [] operator). (Jiri Chudoba)
+
+Revision 1.10  2001/03/20 13:17:30  egangler
+fChargeCorrel moved from AliMUONChamber to AliMUONResponse as decided by
+January meeting.
+Setters and Getters are modified accordingly.
+This modification is transparent to the user code
+
+Revision 1.9  2001/01/26 21:35:54  morsch
+All pointers set to 0 in default constructor.
+
+Revision 1.8  2001/01/17 20:53:40  hristov
+Destructors corrected to avoid memory leaks
+
+Revision 1.7  2000/12/20 13:00:22  egangler
+
+Added charge correlation between cathods.
+In Config_slat.C, use
+ MUON->Chamber(chamber-1).SetChargeCorrel(0.11); to set the RMS of
+ q1/q2 to 11 % (number from Alberto)
+ This is stored in AliMUONChamber fChargeCorrel member.
+ At generation time, when a tracks enters the volume,
+ AliMUONv1::StepManager calls
+ AliMUONChamber::ChargeCorrelationInit() to set the current value of
+ fCurrentCorrel which is then used at Disintegration level to scale
+ appropriately the PadHit charges.
+
+Revision 1.6  2000/10/09 14:01:12  morsch
+Double inclusion of AliResponse removed.
+
 Revision 1.5  2000/07/03 11:54:57  morsch
 AliMUONSegmentation and AliMUONHitMap have been replaced by AliSegmentation and AliHitMap in STEER
 The methods GetPadIxy and GetPadXxy of AliMUONSegmentation have changed name to GetPadI and GetPadC.
@@ -44,39 +75,49 @@ Revision 1.1.2.3  2000/05/05 10:09:52  morsch
 Log messages included
 */
 
+// --- MUON includes ---
 #include "AliMUONChamber.h"
 
+// --- ROOT includes ---
+
+#include "TRandom.h"
 #include "TMath.h"
+
 ClassImp(AliMUONChamber)       
 
     AliMUONChamber::AliMUONChamber()
 {
 // Default constructor
-    fSegmentation = new TObjArray(2);
-    (*fSegmentation)[0] = 0;
-    (*fSegmentation)[1] = 0;    
+    fSegmentation = 0;
     fResponse=0;
     fnsec=1;
     fReconstruction=0;
     fId=0;
+    // to avoid mistakes if ChargeCorrelInit is not called
+    fCurrentCorrel =1;
 }
 
     AliMUONChamber::AliMUONChamber(Int_t id) 
 {
 // Construtor with chamber id 
     fSegmentation = new TObjArray(2);
-    (*fSegmentation)[0] = 0;
-    (*fSegmentation)[1] = 0;    
+    fSegmentation->AddAt(0,0);
+    fSegmentation->AddAt(0,1);
     fResponse=0;
     fnsec=1;
     fReconstruction=0;
     fId=id;
+    // to avoid mistakes if ChargeCorrelInit is not called
+    fCurrentCorrel =1;
 }
 
 AliMUONChamber::~AliMUONChamber() 
 {
 // Destructor
-    if (fSegmentation) delete fSegmentation;
+  if (fSegmentation) {
+    fSegmentation->Delete();
+    delete fSegmentation;
+  }
 }
 
 AliMUONChamber::AliMUONChamber(const AliMUONChamber& rChamber)
@@ -91,12 +132,16 @@ void AliMUONChamber::Init()
 // Initalisation ..
 //
 // ... for chamber segmentation
-    if ((*fSegmentation)[0]) 
-    ((AliSegmentation *) (*fSegmentation)[0])->Init(fId);
+  //PH    if ((*fSegmentation)[0]) 
+  //PH    ((AliSegmentation *) (*fSegmentation)[0])->Init(fId);
+    if (fSegmentation->At(0)) 
+    ((AliSegmentation *) fSegmentation->At(0))->Init(fId);
 
     if (fnsec==2) {
-       if ((*fSegmentation)[1])
-       ((AliSegmentation *) (*fSegmentation)[1])->Init(fId);
+      //PH     if ((*fSegmentation)[1])
+      //PH     ((AliSegmentation *) (*fSegmentation)[1])->Init(fId);
+       if (fSegmentation->At(1))
+       ((AliSegmentation *) fSegmentation->At(1))->Init(fId);
     }
 }
 
@@ -104,12 +149,15 @@ Int_t   AliMUONChamber::SigGenCond(Float_t x, Float_t y, Float_t z)
 {
 // Ask segmentation if signal should be generated 
     if (fnsec==1) {
-       return ((AliSegmentation*) (*fSegmentation)[0])
+      //PH     return ((AliSegmentation*) (*fSegmentation)[0])
+       return ((AliSegmentation*) fSegmentation->At(0))
            ->SigGenCond(x, y, z) ;
     } else {
-       return (((AliSegmentation*) (*fSegmentation)[0])
+      //PH     return (((AliSegmentation*) (*fSegmentation)[0])
+       return (((AliSegmentation*) fSegmentation->At(0))
                ->SigGenCond(x, y, z)) ||
-           (((AliSegmentation*) (*fSegmentation)[1])
+      //PH         (((AliSegmentation*) (*fSegmentation)[1])
+           (((AliSegmentation*) fSegmentation->At(1))
             ->SigGenCond(x, y, z)) ;
     }
 }
@@ -121,13 +169,27 @@ void    AliMUONChamber::SigGenInit(Float_t x, Float_t y, Float_t z)
 // Initialisation of segmentation for hit
 //  
     if (fnsec==1) {
-       ((AliSegmentation*) (*fSegmentation)[0])->SigGenInit(x, y, z) ;
+      //PH     ((AliSegmentation*) (*fSegmentation)[0])->SigGenInit(x, y, z) ;
+       ((AliSegmentation*) fSegmentation->At(0))->SigGenInit(x, y, z) ;
     } else {
-       ((AliSegmentation*) (*fSegmentation)[0])->SigGenInit(x, y, z) ;
-       ((AliSegmentation*) (*fSegmentation)[1])->SigGenInit(x, y, z) ;
+      //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
+    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]) 
@@ -150,10 +212,13 @@ void AliMUONChamber::DisIntegration(Float_t eloss, Float_t tof,
     Float_t qcheck=0, qp;
     nnew=0;
     
+    // Cathode plane loop
     for (Int_t i=1; i<=fnsec; i++) {
        qcheck=0;
+       Float_t qcath = qtot * (i==1? fCurrentCorrel : 1/fCurrentCorrel);
        AliSegmentation * segmentation=
-           (AliSegmentation *) (*fSegmentation)[i-1];
+      //PH         (AliSegmentation *) (*fSegmentation)[i-1];
+           (AliSegmentation *) fSegmentation->At(i-1);
        for (segmentation->FirstPad(xhit, yhit, zhit, dx, dy); 
             segmentation->MorePads(); 
             segmentation->NextPad()) 
@@ -163,17 +228,17 @@ void AliMUONChamber::DisIntegration(Float_t eloss, Float_t tof,
 //
 //
            if (qp > 1.e-4) {
-               qcheck+=qp*qtot;
+               qcheck+=qp*qcath;
            //
            // --- store signal information
-               newclust[0][nnew]=qtot;                     // total charge
+               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 * qtot;                // charge on pad
+               newclust[3][nnew]=qp * qcath;                // charge on pad
                newclust[4][nnew]=segmentation->ISector();  // sector id
                newclust[5][nnew]=(Float_t) i;              // counter
                nnew++;
-//             if (i==2) printf("\n i, nnew, q %d %d %f", i, nnew, qp*qtot);
+//             if (i==2) printf("\n i, nnew, q %d %d %f", i, nnew, qp*qcath);
                
            }
        } // Pad loop