5 * Revision 1.1.1.1 1999/05/18 15:55:20 fca
8 * Revision 1.1.1.1 1995/10/24 10:21:24 cernlib
12 #include "geant321/pilot.h"
13 *CMZ : 3.21/02 29/03/94 15.41.21 by S.Giani
15 SUBROUTINE GFLUCT(DEMEAN,DE)
17 C. ******************************************************************
19 C. * Subroutine to decide which method is used to simulate *
20 C. * the straggling around the mean energy loss. *
23 C. * DNMIN: <---------->1<-------->30<--------->50<---------> *
26 C. * STRA=0 <----------GLANDZ-------------------><--GLANDO--> *
28 C. * STRA=0 <---------------------GLANDZ--------------------> *
30 C. * STRA=1 <-----------PAI---------------------><--GLANDZ--> *
31 #if defined(CERNLIB_ASHO)
32 C. * STRA=2 <---PAI----><---ASHO---><----PAI----><--GLANDZ--> *
36 C. * DNMIN : an estimation of the number of collisions *
37 C. * with energy close to the ionization energy *
40 C. * Input : DEMEAN (mean energy loss) *
41 C. * Output : DE (energy loss in the current step) *
43 C. * ==>Called by : GTELEC,GTMUON,GTHADR *
45 C. ******************************************************************
47 #include "geant321/gcbank.inc"
48 #include "geant321/gcjloc.inc"
49 #include "geant321/gconsp.inc"
50 #include "geant321/gcmate.inc"
51 #include "geant321/gccuts.inc"
52 #include "geant321/gckine.inc"
53 #include "geant321/gcmulo.inc"
54 #include "geant321/gcphys.inc"
55 #include "geant321/gctrak.inc"
57 PARAMETER (EULER=0.577215,GAM1=EULER-1)
58 PARAMETER (P1=.60715,P2=.67794,P3=.52382E-1,P4=.94753,
59 + P5=.74442,P6=1.1934)
60 PARAMETER (DGEV=0.153536 E-3, DNLIM=50)
61 #if defined(CERNLIB_ASHO)
62 PARAMETER (ASHMIN=1,ASHMAX=30)
64 * These parameters are needed by M.Kowalski's fluctuation algorithm
65 PARAMETER (FPOT=20.77E-9, EEND=10E-6, EEXPO=2.2)
66 PARAMETER (XEXPO=-EEXPO+1, YEXPO=1/XEXPO)
67 * These parameters are needed by M.Kowalski's fluctuation algorithm
69 DE2(DPOT,RAN)=(DPOT**XEXPO*(1-RAN)+EEND**XEXPO*RAN)**YEXPO
70 FLAND(X) = P1+P6*X+(P2+P3*X)*EXP(P4*X+P5)
77 IF(ISTRA.EQ.0.AND.(ILOSS.EQ.1.OR.ILOSS.EQ.3)) THEN
78 CALL GLANDZ(Z,STEP,VECT(7),GETOT,DEDX,DE,POTI,Q(JPROB+10))
79 ELSEIF (ILOSS.EQ.5) THEN
80 * This is Marek Kowalski's fluctuation algorithm, it works only when
81 * the step size has been limited to one ionisation on average
87 * *** mean ionization potential (GeV)
94 * *** low energy transfer
95 XI = DGEV*CHARGE**2*STEP*DENS*Z/(A*BET2)
98 * *** ISTRA = 1 --> PAI + URBAN
99 #if defined(CERNLIB_ASHO)
100 * *** ISTRA = 2 --> PAI + URBAN + ASHO
102 DNMIN = MIN(XI,DEMEAN)/POTI
105 IF(DNMIN.GE.DNLIM) THEN
107 * Energy straggling using Gaussian, Landau & Vavilov theories.
109 * STEP = current step-length (cm)
111 * DELAND = DE/DX - <DE/DX> (GeV)
113 * Author : G.N. Patrick
115 IF(STEP.LT.1.E-7)THEN
119 * Maximum energy transfer to atomic electron (GeV).
123 * Calculate Kappa significance ratio.
124 * EMAX=(2*EMASS*ETA**2)/(1+2*RATIO*GAMMA+RATIO**2)
126 CAPPA = XI*(1+2*RATIO*GAMMA+RATIO**2)/(2*EMASS*
128 IF (CAPPA.GE.10.) THEN
130 * +-----------------------------------+
131 * I Sample from Gaussian distribution I
132 * +-----------------------------------+
133 SIGMA = XI*SQRT((1.-0.5*BET2)/CAPPA)
135 F1 = -2.*LOG(RNDM(1))
136 DELAND = SIGMA*SQRT(F1)*COS(TWOPI*RNDM(2))
138 XMEAN = -BET2-LOG(CAPPA)+GAM1
139 IF (CAPPA.LT.0.01) THEN
141 * +---------------------------------------------------------------+
142 * I Sample lambda variable from Kolbig/Schorr Landau distribution I
143 * +---------------------------------------------------------------+
144 * 10 CALL GRNDM(RNDM,1)
145 * IF( RNDM(1) .GT. 0.980 ) GO TO 10
146 * XLAMB = GLANDR(RNDM(1))
147 * +---------------------------------------------------------------+
148 * I Sample lambda variable from James/Hancock Landau distribution I
149 * +---------------------------------------------------------------+
150 10 CALL GLANDG(XLAMB)
151 IF(XLAMB.GT.XLAMX) GO TO 10
153 * +---------------------------------------------------------+
154 * I Sample lambda variable (Landau not Vavilov) from I
155 * I Rotondi&Montagna&Kolbig Vavilov distribution I
156 * +---------------------------------------------------------+
158 XLAMB = GVAVIV(CAPPA,BET2,RNDM(1))
161 * Calculate DE/DX - <DE/DX>
162 DELAND = XI*(XLAMB-XMEAN)
167 CALL GLANDZ(Z,STEP,VECT(7),GETOT,DEDX,DE,POTI,
170 ELSE IF (ISTRA.LE.2) THEN
171 IF(DNMIN.GE.DNLIM) THEN
172 CALL GLANDZ(Z,STEP,VECT(7),GETOT,DEDX,DE,POTI,
177 #if defined(CERNLIB_ASHO)
178 IF (DNMIN.GE.ASHMIN.AND.DNMIN.LT.ASHMAX .AND.ISTRA.EQ
180 CALL GASHO(VECT(7),AMASS,STEP,DE)
182 DE = GSTREN(GAMMA,DCUTE,STEP)
185 #if !defined(CERNLIB_ASHO)
186 DE = GSTREN(GAMMA,DCUTE,STEP)
189 * *** Add brem losses to ionisation
191 JBASE = LQ(JMA-1)+2*NEK1+IEKBIN
192 DE = DE +(1.-GEKRAT)*Q(JBASE)+GEKRAT*Q(JBASE+1)
193 ELSEIF(ITRTYP.EQ.5) THEN
194 JBASE = LQ(JMA-2)+NEK1+IEKBIN
195 DE = DE +(1.-GEKRAT)*Q(JBASE)+GEKRAT*Q(JBASE+1)