]> git.uio.no Git - u/mrichter/AliRoot.git/blame - GEANT321/gphys/glandz.F
Minor corrections after big transformer changes
[u/mrichter/AliRoot.git] / GEANT321 / gphys / glandz.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1995/10/24 10:21:25 cernlib
6* Geant
7*
8*
9#include "geant321/pilot.h"
10*CMZ : 3.21/04 22/02/95 10.38.36 by S.Giani
11*-- Author :
12 SUBROUTINE GLANDZ(Z,STEP,P,E,DEDX,DE,POTI,POTIL)
13C.
14C. ******************************************************************
15C. * *
16C. * Energy straggling using a Monte Carlo model. *
17C. * It can be used with or without delta ray generation. *
18C. * *
19C. * It is a NEW VERSION of the model , which reproduces *
20C. * the experimental data rather well. *
21C. * *
22C. * Input : STEP = current step-length (cm) *
23C. * *
24C. * Output: DE = actual energy loss (Gev) *
25C. * ( NOT the fluctuation DE/DX-<DE/DX> !) *
26C. * *
27C. * ==> Called by : GTELEC,GTHADR,GTMUON *
28C. * *
29C. * Author : L.Urban *
30C. * Date : 28.04.1988 Last update : 1.02.90 *
31C. * *
32C. ******************************************************************
33C.
34#include "geant321/gconsp.inc"
35#include "geant321/gcflag.inc"
36#include "geant321/gckine.inc"
37#include "geant321/gccuts.inc"
38 PARAMETER (MAXRND=100)
39 DIMENSION RNDM(MAXRND),APOIS(3),NPOIS(3),FPOIS(3)
40#if !defined(CERNLIB_SINGLE)
41 DOUBLE PRECISION E1,E2,P2,B2,BG2,TM,DEC,W,WW,WWW,RR
42 DOUBLE PRECISION X,AK,ALFA,EA,SA,AKL,REALK,FPOIS
43 DOUBLE PRECISION ONE,HALF,ZERO
44 PARAMETER (HMXINT=2**30)
45#endif
46#if defined(CERNLIB_SINGLE)
47 PARAMETER (HMXINT=2**45)
48#endif
49 PARAMETER (ONE=1,HALF=ONE/2,ZERO=0)
50 PARAMETER (RCD=0.40, RCD1=1.-RCD, PROBLM=0.01)
51 PARAMETER( C1=4, C2=16)
52*
53* ------------------------------------------------------------------
54*
55* POTI=1.6E-8*Z**0.9
56* POTIL=LOG(POTI)
57*
58 IF(Z.GT.2.) THEN
59 F2=2./Z
60 ELSE
61 F2=0.
62 ENDIF
63 F1=1.-F2
64*
65 E2 = 1.E-8*Z*Z
66 E2L= LOG(E2)
67 E1L= (POTIL-F2*E2L)/F1
68 E1 = EXP(E1L)
69*
70*
71 P2=P*P
72 B2=P2/(E*E)
73 BG2=P2/(AMASS*AMASS)
74 IF(ITRTYP.EQ.2) THEN
75 TM=P2/(E+EMASS)
76 IF(CHARGE.LT.0.) TM=TM/2.
77 TM=TM-POTI
78 IF(TM.GT.DCUTE) TM=DCUTE
79 ELSE
80 TM=EMASS*P2/(0.5*AMASS*AMASS+EMASS*E)
81 TM=TM-POTI
82 IF(TM.GT.DCUTM) TM=DCUTM
83 ENDIF
84*
85*
86* *** Protection against negative TM ---------------------
87* TM can be negative only for heavy particles with a very
88* low kinetic energy (e.g. for proton with T 100-300 kev)
89 TM=MAX(TM,ZERO)
90*
91 W = TM+POTI
92 WW = W/POTI
93 WWW= 2.*EMASS*BG2
94 WL = LOG(WWW)
95 CSB=STEP*RCD1*DEDX/(WL-POTIL-B2)
96 APOIS(1)=CSB*F1*(WL-E1L-B2)/E1
97 APOIS(2)=CSB*F2*(WL-E2L-B2)/E2
98*
99 IF(TM.GT.0.) THEN
100 APOIS(3)=RCD*DEDX*STEP*TM/(POTI*W*LOG(WW))
101 ELSE
102 APOIS(1)=APOIS(1)/RCD1
103 APOIS(2)=APOIS(2)/RCD1
104 APOIS(3)=0.
105 ENDIF
106*
107* calculate the probability of the zero energy loss
108*
109 APSUM=APOIS(1)+APOIS(2)+APOIS(3)
110 IF(APSUM.LT.0.) THEN
111 PROB=1.
112 ELSEIF(APSUM.LT.50.) THEN
113 PROB=EXP(-APSUM)
114 ELSE
115 PROB=0.
116 ENDIF
117*
118*
119* do it differently if prob > problm <====================
120 IF(PROB.GT.PROBLM) THEN
121 E0=1.E-8
122 EMEAN=DEDX*STEP
123 IF(TM.LE.0.) THEN
124* excitation only ....
125 APOIS(1)=EMEAN/E0
126*
127 CALL GPOISS(APOIS,NPOIS,1)
128 FPOIS(1)=NPOIS(1)
129 DE=FPOIS(1)*E0
130*
131 ELSE
132* ionization only ....
133 EM=TM+E0
134 APOIS(1)=EMEAN*(EM-E0)/(EM*E0*LOG(EM/E0))
135 CALL GPOISS(APOIS,NPOIS,1)
136 NN=NPOIS(1)
137 DE=0.
138*
139 IF(NN.GT.0) THEN
140 RCORR=1.
141 IF(NN.GT.MAXRND) THEN
142 RCORR=FLOAT(NN)/MAXRND
143 NN=MAXRND
144*
145 ENDIF
146 W=(EM-E0)/EM
147 CALL GRNDM(RNDM,NN)
148 DO 10 I=1,NN
149 DE=DE+E0/(1.-W*RNDM(I))
150 10 CONTINUE
151 DE=RCORR*DE
152*
153 ENDIF
154 ENDIF
155 GOTO 999
156 ENDIF
157*
158 IF(MAX(APOIS(1),APOIS(2),APOIS(3)).LT.HMXINT) THEN
159 CALL GPOISS(APOIS,NPOIS,3)
160 FPOIS(1)=NPOIS(1)
161 FPOIS(2)=NPOIS(2)
162 FPOIS(3)=NPOIS(3)
163 ELSE
164 DO 20 JPOIS=1, 3
165 IF(APOIS(JPOIS).LT.HMXINT) THEN
166 CALL GPOISS(APOIS(JPOIS),NPOIS(JPOIS),1)
167 FPOIS(JPOIS)=NPOIS(JPOIS)
168 ELSE
169 CALL GRNDM(RNDM,2)
170 FPOIS(JPOIS)=ABS(SQRT(-2.*LOG(RNDM(1)*ONE)
171 + *APOIS(JPOIS))*SIN(TWOPI*RNDM(2)*ONE)+APOIS(JPOIS))
172 ENDIF
173 20 CONTINUE
174 ENDIF
175
176*
177* Now we have all three numbers in REAL/DOUBLE
178* variables. REALK is actually an INTEGER that now may
179* exceed the machine representation limit for integers.
180*
181 DE=FPOIS(1)*E1+FPOIS(2)*E2
182*
183* smear to avoid peaks in the energy loss (note: E1<<E2)
184*
185 IF(DE.GT.0.) THEN
186 CALL GRNDM(RNDM,1)
187 DE=DE+E1*(1.-2.*RNDM(1))
188 ENDIF
189*
190 ALFA=1.
191 REALK=0
192 DEC=0.
193*
194 ANC=FPOIS(3)
195 IF(ANC.GE.C2) THEN
196 R=ANC/(C2+ANC)
197 AN=ANC*R
198 SN=C1*R
199 CALL GRNDM(RNDM,2)
200 RR=SQRT(-2.*LOG(RNDM(1)))
201 PHI=TWOPI*RNDM(2)
202 X=RR*COS(PHI)
203 AK=AN+SN*X
204 ALFA=WW*(C2+ANC)/(C2*WW+ANC)
205 EA=AK*POTI*ALFA*LOG(ALFA)/(ALFA-1.)
206 SA=SQRT(ABS(AK*ALFA*POTI*POTI-EA*EA/AK))
207 AKL=(EA-C1*SA)/POTI
208 IF(AK.LE.AKL) THEN
209 X=RR*SIN(PHI)
210 DEC=EA+SA*X
211 REALK=AK+HALF-MOD(AK+HALF,ONE)
212 ELSE
213 ALFA=1.
214 ENDIF
215 ENDIF
216 NN=NINT(FPOIS(3)-REALK)
217 IF(NN.GT.MAXRND) THEN
218 W=1.-ALFA/WW
219 WW=POTI*ALFA
220*
221* Here we take a gaussian distribution to avoid loosing
222* too much time in computing
223*
224 AVERAG=-LOG(1.-W)/W
225 SIGMA =SQRT(NN*(1./(1.-W)-AVERAG**2))
226 CALL GRNDM(RNDM,2)
227 DEC = DEC+WW*(NN*AVERAG+SIGMA*SQRT(-2.*LOG(RNDM(1)))*
228 + SIN(TWOPI*RNDM(2)))
229 DE=DE+DEC
230 ELSEIF(NN.GT.0) THEN
231 W=1.-ALFA/WW
232 WW=POTI*ALFA
233 CALL GRNDM(RNDM,NN)
234 DO 30 I=1,NN
235 DEC=DEC+WW/(1.-W*RNDM(I))
236 30 CONTINUE
237 DE=DE+DEC
238 ENDIF
239*
240 999 END