Improved response simulation for station 1.
[u/mrichter/AliRoot.git] / MUON / AliMUONResponseV0.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 /*
17 $Log$
18 Revision 1.6  2000/12/04 17:48:23  gosset
19 Modifications for stations 1 et 2 mainly:
20 * station 1 with 4 mm gas gap and smaller cathode segmentation...
21 * stations 1 and 2 with "grey" frame crosses
22 * mean noise at 1.5 ADC channel
23 * Ar-CO2 gas (80%+20%)
24
25 Revision 1.5  2000/11/21 13:47:55  gosset
26 All Mathieson parameters (Sqrt(K3), K2 and K4) set in one function,
27 SetSqrtKx3AndDeriveKx2Kx4 or SetSqrtKx3AndDeriveKx2Kx4,
28 for each cathode plane
29
30 Revision 1.4  2000/10/25 10:41:52  morsch
31 IntPH(..): Protec Log against random numbers equal to 0.
32
33 Revision 1.3  2000/07/03 11:54:57  morsch
34 AliMUONSegmentation and AliMUONHitMap have been replaced by AliSegmentation and AliHitMap in STEER
35 The methods GetPadIxy and GetPadXxy of AliMUONSegmentation have changed name to GetPadI and GetPadC.
36
37 Revision 1.2  2000/06/15 07:58:48  morsch
38 Code from MUON-dev joined
39
40 Revision 1.1.2.1  2000/06/09 21:33:35  morsch
41 AliMUONResponse code  from  AliMUONSegResV0.cxx
42
43 */
44
45 #include "AliMUONResponseV0.h"
46 #include "AliSegmentation.h"
47 #include <TMath.h>
48 #include <TRandom.h>
49
50
51 ClassImp(AliMUONResponseV0)
52         
53   //__________________________________________________________________________
54 void AliMUONResponseV0::SetSqrtKx3AndDeriveKx2Kx4(Float_t SqrtKx3)
55 {
56   // Set to "SqrtKx3" the Mathieson parameter K3 ("fSqrtKx3")
57   // in the X direction, perpendicular to the wires,
58   // and derive the Mathieson parameters K2 ("fKx2") and K4 ("fKx4")
59   // in the same direction
60   fSqrtKx3 = SqrtKx3;
61   fKx2 = TMath::Pi() / 2. * (1. - 0.5 * fSqrtKx3);
62   Float_t cx1 = fKx2 * fSqrtKx3 / 4. / TMath::ATan(Double_t(fSqrtKx3));
63   fKx4 = cx1 / fKx2 / fSqrtKx3;
64 }
65         
66   //__________________________________________________________________________
67 void AliMUONResponseV0::SetSqrtKy3AndDeriveKy2Ky4(Float_t SqrtKy3)
68 {
69   // Set to "SqrtKy3" the Mathieson parameter K3 ("fSqrtKy3")
70   // in the Y direction, along the wires,
71   // and derive the Mathieson parameters K2 ("fKy2") and K4 ("fKy4")
72   // in the same direction
73   fSqrtKy3 = SqrtKy3;
74   fKy2 = TMath::Pi() / 2. * (1. - 0.5 * fSqrtKy3);
75   Float_t cy1 = fKy2 * fSqrtKy3 / 4. / TMath::ATan(Double_t(fSqrtKy3));
76   fKy4 = cy1 / fKy2 / fSqrtKy3;
77 }
78
79 Float_t AliMUONResponseV0::IntPH(Float_t eloss)
80 {
81   // Calculate charge from given ionization energy loss
82   Int_t nel;
83   nel= Int_t(eloss*1.e9/32.);
84   Float_t charge=0;
85   if (nel == 0) nel=1;
86   for (Int_t i=1;i<=nel;i++) {
87       Float_t arg=0.;
88       while(!arg) arg = gRandom->Rndm();
89       charge -= fChargeSlope*TMath::Log(arg);    
90   }
91   return charge;
92 }
93 // -------------------------------------------
94
95 Float_t AliMUONResponseV0::IntXY(AliSegmentation * segmentation)
96 {
97 // Calculate charge on current pad according to Mathieson distribution
98 // 
99     const Float_t kInversePitch = 1/fPitch;
100 //
101 //  Integration limits defined by segmentation model
102 //  
103     Float_t xi1, xi2, yi1, yi2;
104     segmentation->IntegrationLimits(xi1,xi2,yi1,yi2);
105     xi1=xi1*kInversePitch;
106     xi2=xi2*kInversePitch;
107     yi1=yi1*kInversePitch;
108     yi2=yi2*kInversePitch;
109 //
110 // The Mathieson function 
111     Double_t ux1=fSqrtKx3*TMath::TanH(fKx2*xi1);
112     Double_t ux2=fSqrtKx3*TMath::TanH(fKx2*xi2);
113
114     Double_t uy1=fSqrtKy3*TMath::TanH(fKy2*yi1);
115     Double_t uy2=fSqrtKy3*TMath::TanH(fKy2*yi2);
116
117     
118     return Float_t(4.*fKx4*(TMath::ATan(ux2)-TMath::ATan(ux1))*
119                       fKy4*(TMath::ATan(uy2)-TMath::ATan(uy1)));
120 }
121
122 Int_t  AliMUONResponseV0::DigitResponse(Int_t digit, AliMUONTransientDigit* where)
123 {
124     // add white noise and do zero-suppression and signal truncation
125 //     Float_t meanNoise = gRandom->Gaus(1, 0.2);
126     // correct noise for slat chambers;
127     // one more field to add to AliMUONResponseV0 to allow different noises ????
128     Float_t meanNoise = gRandom->Gaus(1.5, 0.2);
129     Float_t noise     = gRandom->Gaus(0, meanNoise);
130     digit+=(Int_t)noise; 
131     if ( digit <= ZeroSuppression()) digit = 0;
132     if ( digit >  MaxAdc())          digit=MaxAdc();
133     return digit;
134 }
135
136
137
138
139
140
141
142
143