]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONChamber.cxx
Important bugfix. Missing reset of the equipment header data. It was causing a wrong...
[u/mrichter/AliRoot.git] / MUON / AliMUONChamber.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 // -----------------------
19 // Class AliMUONChamber
20 // -----------------------
21 // MUON tracking chamber class
22 // now only providing DisIntegration function
23
24 // --- ROOT includes ---
25 #include <TRandom.h>
26 #include <TMath.h>
27 #include "AliRun.h"
28
29
30 // --- MUON includes ---
31 #include "AliMUON.h"
32 #include "AliMUONChamber.h"
33 #include "AliMUONSegmentation.h"
34 #include "AliMUONHit.h"
35 #include "AliLog.h"
36
37 /// \cond CLASSIMP
38 ClassImp(AliMUONChamber)        
39 /// \endcond
40
41 //_______________________________________________________
42 AliMUONChamber::AliMUONChamber()
43   : TObject(), 
44     fId(0),
45     fCurrentCorrel(1), // to avoid mistakes if ChargeCorrelInit is not called
46     fResponse(0),
47     fMUON(0)
48 {
49 /// Default constructor
50
51   AliDebug(1, Form("default (empty) ctor this = %p", this));
52 }
53
54 //_______________________________________________________
55 AliMUONChamber::AliMUONChamber(Int_t id) 
56   : TObject(), 
57     fId(id),
58     fCurrentCorrel(1), // to avoid mistakes if ChargeCorrelInit is not called
59     fResponse(0),
60     fMUON(0)
61 {
62 /// Standard constructor
63
64     // muon
65     fMUON = (AliMUON*)gAlice->GetModule("MUON");
66     if (!fMUON) {
67       AliFatal("MUON detector not defined.");
68       return;
69     }  
70
71   AliDebug(1, Form("ctor this = %p", this) ); 
72 }
73
74 //_______________________________________________________
75 AliMUONChamber::~AliMUONChamber() 
76 {
77 /// Destructor
78
79   AliDebug(1, Form("dtor this = %p", this));
80 }
81
82 //_____________________________________________________
83 void AliMUONChamber::ChargeCorrelationInit() 
84 {
85 /// Initialisation of charge correlation for current hit
86 /// the value is stored, and then used by Disintegration
87
88   // exponential is here to avoid eventual problems in 0 
89   // factor 2 because chargecorrel is q1/q2 and not q1/qtrue
90     fCurrentCorrel = TMath::Exp(gRandom->Gaus(0,fResponse->ChargeCorrel()/2));
91 }
92
93 //_______________________________________________________
94 void AliMUONChamber::DisIntegration(AliMUONHit *hit, 
95                                     Int_t& nnew,Float_t newclust[6][500]) 
96 {
97 ///  Generates pad hits (simulated cluster) 
98 ///  using the segmentation and the response model 
99
100   Float_t dx, dy;
101
102   Float_t  xhit = hit->X();
103   Float_t  yhit = hit->Y();
104   Float_t  zhit = hit->Z();
105   Int_t      id = hit->DetElemId();
106   Float_t eloss = hit->Eloss();
107
108   //
109   // Width of the integration area
110   //
111   dx=fResponse->SigmaIntegration()*fResponse->ChargeSpreadX();
112   dy=fResponse->SigmaIntegration()*fResponse->ChargeSpreadY();
113   //
114   // Get pulse height from energy loss
115   Float_t qtot = fResponse->IntPH(eloss);
116   //
117   // Loop Over Pads
118     
119   Float_t qp; 
120   nnew=0;
121     
122   // Cathode plane loop
123   for (Int_t i = 1; i <= 2; i++) {
124     Float_t qcath = qtot * (i==1? fCurrentCorrel : 1/fCurrentCorrel);
125     
126     AliMUONGeometrySegmentation* segmentation=
127       fMUON->GetSegmentation()->GetModuleSegmentation(fId, i-1); 
128
129     for (segmentation->FirstPad(id, xhit, yhit, zhit, dx, dy); 
130          segmentation->MorePads(id); 
131          segmentation->NextPad(id)) 
132       {
133         qp=fResponse->IntXY(id, segmentation);
134         qp=TMath::Abs(qp);
135         //
136         //
137         if (qp > 1.e-4) 
138           {
139             if (nnew >= 500) // Perform a bounds check on nnew since it is assumed
140               // newclust only contains 500 elements.
141               {
142                 AliError("Limit of 500 pad responses reached.");
143                 return;
144               };
145             //
146             // --- store signal information
147             newclust[0][nnew]=qcath;                     // total charge
148             newclust[1][nnew]=segmentation->Ix();       // ix-position of pad
149             newclust[2][nnew]=segmentation->Iy();       // iy-position of pad
150             newclust[3][nnew]=qp * qcath;                // charge on pad
151             newclust[4][nnew]=segmentation->ISector();  // sector id
152             newclust[5][nnew]=(Float_t) i;              // counter
153             nnew++;
154                 
155           }
156       } // Pad loop
157   } // Cathode plane loop
158 }