source: JEM-EUSO/esaf_cc_at_lal/packages/simulation/externals/slast/src/kernel/develop_esafshower.F @ 114

Last change on this file since 114 was 114, checked in by moretto, 11 years ago

actual version of ESAF at CCin2p3

File size: 12.4 KB
Line 
1      SUBROUTINE DEVELOP_ESAFSHOWER(Lmax,KEY_TRIG)
2#include "event.inc"
3#include "shower.inc"
4#include "detector.inc"
5#include "erandom.inc"
6#include "constants.inc"
7#include "esafoutput.inc"
8*     ... EXTERNAL FUNCTIONS ...
9      REAL DEPTH_R_RINT, ATM
10*     ... INPUT VARIABLES    ...
11      REAL Lmin, Lmax
12*     ... OUTPUT VARIABLES    ...
13      LOGICAL KEY_TRIG
14*     ... LOCAL VARIABLES    ...
15      REAL L_step, L, R(3),R1(3), RG(3), Ne1, Ne1max, s, d, t, time_ch
16      REAL ACC,D3,RTMP(3), L_substep, TRANS(100), L_GTU
17      INTEGER Nph,N,avoid_cycling,k_bunch,kCYCLING
18      REAL RTOISS(3),SCALAR_ISS_RTOISS,SCALAR_ISS,SCALAR_RTOISS
19      REAL cos_R_ISS,w,RIMPACT1,ALPHAIMPACT1,theta1c,phi1c
20      REAL ATTENUATION_CHERENKOV, ch_angle, time_corrected, time_sigma
21      REAL ShowerTimer,Ri(3),Rf(3),rndm
22*     ... EXCHANGE WITH DO_CHERENKOV ...
23      REAL NchISS
24      REAL TRG,TMG,TRS,TMS
25      REAL TR_G,TM_G,TR_G_ISS,TM_G_ISS,time_ch1d
26*     ... EXCHANGE WITH DO_FLUORECENCE ...
27      REAL Nfl1,time_fl1d
28*     ... EXCHANGE WITH IMPACT ...
29      REAL Hstar,H_INT,THETA_INT,H_R,THETA_R
30      WRITE(6,200) 'SLAST IS GENERATING PHOTONS(pixel = 2000 photons) '
31      k_bunch=0
32      avoid_cycling = 0
33      kCYCLING = 100000
34      Ne1max = 0
35      CALL ESAF_RESET
36* ... Fill header information
37      ShowerEnergy = EINT
38      ShowerTheta  = THETA
39      ShowerPhi    = PHI
40      ShowerX1     = X1
41      ShowerRint(1)= RINT(1)*1000 ! m
42      ShowerRint(2)= RINT(2)*1000 ! m
43      ShowerRint(3)= (RINT(3)-R_EARTH)*1000 ! m
44
45*     ... SOME DEFAULTS FOR   ACCEPTANCE_TYPE.NE.1.
46      DO i = 1, 3
47        RG(i) = 10000.
48      ENDDO
49
50      ShowerHitGround = 0
51      IF(ACCEPTANCE_TYPE.EQ.1.) ShowerHitGround = 1.E0
52*     ... COMPUTE CHERENKOV INFORMATION ...
53
54      IF(ACCEPTANCE_TYPE.EQ.1.) THEN
55        RG(1) = RINT(1) - Lmax*SIN(THETA)*COS(PHI)
56        RG(2) = RINT(2) - Lmax*SIN(THETA)*SIN(PHI)
57        RG(3) = RINT(3) - Lmax*COS(THETA)     
58        CALL VECTORLIB(3,'-',ISS,RG,RTOISS)
59        CALL VECTORDOT(3,ISS,RTOISS,SCALAR_ISS_RTOISS)
60        CALL VECTORDOT(3,ISS,ISS,SCALAR_ISS)
61        CALL VECTORDOT(3,RTOISS,RTOISS,SCALAR_RTOISS)
62       
63        IF(SCALAR_ISS*SCALAR_RTOISS.NE.0.) THEN
64          cos_R_ISS  =
65     +         SCALAR_ISS_RTOISS/SQRT(SCALAR_ISS*SCALAR_RTOISS)
66        ELSE
67          cos_R_ISS  = 0.
68        ENDIF
69*     ... ARRIVAL ANGLES ...
70        IF(ABS(cos_R_ISS).GT.1.) cos_R_ISS = 1.
71        theta1c = ACOS(cos_R_ISS)/PI*180
72        IF(RG(1).NE.0.) THEN
73          phi1c = ATAN2(RG(2),RG(1))/PI*180
74        ELSE
75          phi1c = 90.0
76        ENDIF
77*     ... ARRIVAL TIME ...
78        time_ch =  10./3*(Lmax+SQRT(SCALAR_RTOISS))
79      ENDIF
80
81      ShowerImpact(1) = RG(1)*1000 ! in m
82      ShowerImpact(2) = RG(2)*1000 ! in m
83      ShowerImpact(3) = (RG(3)-R_EARTH)*1000 ! in m
84     
85      d    = DEPTH_R_RINT(RG)
86      CALL SHOWER_PARAMETRIZATION(d,Ne1,t,s)
87      ShowerAgeEarth = s
88     
89*     ... START TO DEVELOP SHOWER ...
90      L_GTU  = 3.e-1*GTU/2 ! minimal GTU timing
91      L_step = L_GTU       ! attention!!!
92
93*     ... ACCEPTANCE TYPE ...
94      ACC = ACCEPTANCE_TYPE
95      Lmin = 0.
96      IF(ACC.NE.1.) THEN
97        D3 = RINT(1)**2+RINT(2)**2-RINT(3)**2*TAN(FOV)**2
98        IF(D3.LT.0.) THEN
99          Lmin = 0.             ! already inside FOV
100        ELSE
101          Lmin = SQRT(RINT(3)**2+SQRT(D3))
102        ENDIF
103      ENDIF
104*
105      ShowerTimer = 0
106      DO L = Lmin, Lmax, L_step ! L      is in km
107         IF(L.GT.Lmax) GOTO 100
108         SN = SN + 1 ! number of steps in the Shower
109         IF(SN.GT.Nsh) THEN
110           WRITE(6,*) 'SLAST DEVELOP_ESAFSHOWER() :'
111           WRITE(6,*) 'WARNING:Number of Steps exceeds MAXIMUM.'
112           WRITE(6,*) 'TRUNCATE THE SHOWER'
113           GOTO 33
114         ENDIF
115         ShowerTimei(SN) = ShowerTimer
116         ShowerTimef(SN) = ShowerTimei(SN) + 10.E0/3*L
117         ShowerTimer     = ShowerTimef(SN)
118*     ... DEFINE CURRENT POSITION OF THE SHOWER ...
119
120*     ... MEAN POSITION ...         
121        R(1) = RINT(1) - (L+L_step/2)*SIN(THETA)*COS(PHI)
122        R(2) = RINT(2) - (L+L_step/2)*SIN(THETA)*SIN(PHI)
123        R(3) = RINT(3) - (L+L_step/2)*COS(THETA)
124*     ... INIT POINT ...
125        Ri(1) = RINT(1) - L*SIN(THETA)*COS(PHI)
126        Ri(2) = RINT(2) - L*SIN(THETA)*SIN(PHI)
127        Ri(3) = RINT(3) - L*COS(THETA)
128        ShowerRxi(SN) =  Ri(1)*1000 ! in m
129        ShowerRyi(SN) =  Ri(2)*1000 ! in m
130        ShowerRzi(SN) = (Ri(3)-R_EARTH)*1000 ! in m
131*     ... END POINT ...
132        Rf(1) = RINT(1) - (L+L_step)*SIN(THETA)*COS(PHI)
133        Rf(2) = RINT(2) - (L+L_step)*SIN(THETA)*SIN(PHI)
134        Rf(3) = RINT(3) - (L+L_step)*COS(THETA)
135        ShowerRxf(SN) =  Rf(1)*1000 ! in m
136        ShowerRyf(SN) =  Rf(2)*1000 ! in m
137        ShowerRzf(SN) = (Rf(3)-R_EARTH)*1000 ! in m
138        CALL VECTORLIB(3,'-',ISS,R,RTOISS)
139        CALL VECTORDOT(3,ISS,RTOISS,SCALAR_ISS_RTOISS)
140        CALL VECTORDOT(3,ISS,ISS,SCALAR_ISS)
141        CALL VECTORDOT(3,RTOISS,RTOISS,SCALAR_RTOISS)
142       
143        IF(SCALAR_ISS*SCALAR_RTOISS.NE.0.) THEN
144          cos_R_ISS  =
145     +         SCALAR_ISS_RTOISS/SQRT(SCALAR_ISS*SCALAR_RTOISS)
146        ELSE
147          cos_R_ISS  = 0.
148        ENDIF
149        IF(ABS(cos_R_ISS).GT.1.) cos_R_ISS = 1.
150        IF(ACOS(cos_R_ISS).LE.FOV) THEN
151          in_fov = 1
152        ENDIF
153        ShowerXi(SN) = DEPTH_R_RINT(Ri)
154        ShowerXf(SN) = DEPTH_R_RINT(Rf)
155        CALL SHOWER_PARAMETRIZATION(ShowerXi(SN),Ne1,t,s)
156        ShowerAgei(SN) = s
157        CALL SHOWER_PARAMETRIZATION(ShowerXf(SN),Ne1,t,s)
158        ShowerAgei(SN) = s
159        d    = DEPTH_R_RINT(R)
160        CALL IMPACT(R,Hstar,H_INT,THETA_INT,H_R,THETA_R)
161        CALL SHOWER_PARAMETRIZATION(d,Ne1,t,s)
162        ShowerNe(SN) = Ne1
163        IF(Ne1.GT.Ne1max) THEN
164          Ne1max        = Ne1
165          ShowerXmax    = DEPTH(R)
166          ShowerRmax(1) = R(1)*1000 ! in m
167          ShowerRmax(2) = R(2)*1000 ! in m
168          ShowerRmax(3) = (R(3)-R_EARTH)*1000 ! in m
169        ENDIF
170
171*     ... STOP TO DEVELOP SHOWER IF IT IS OUTSIDE THE FOV ...
172        IF(ACOS(cos_R_ISS).GT.FOV.AND.in_fov.EQ.1) GOTO 33
173
174*      ... FLUORESCENCE OUTPUT OF INDIVIDUAL PHOTONS ...
175        IF(ACOS(cos_R_ISS).LE.FOV) THEN
176          CALL DO_FLUORESCENCE(L,L_step,Ne1,S,Nfl1)
177          N = ESAFPOISSON(DBLE(Nfl1))
178          IF (avoid_cycling.GT.kCYCLING) GOTO 33
179          IF(N.EQ.0) THEN
180             avoid_cycling = avoid_cycling + 1
181             GOTO 2
182          ENDIF
183*     ... DEFINE END POINTS VECTORS ...
184         
185          R1(1) = RINT(1) - L*SIN(THETA)*COS(PHI)
186          R1(2) = RINT(2) - L*SIN(THETA)*SIN(PHI)
187          R1(3) = RINT(3) - L*COS(THETA)
188
189          L_substep = L_step/N
190          CALL TRANSITION_R_ISS(R1,TRANS)
191          DO i = 1, N
192*     ... GENERATE UNIFORM POINT ALONG THE TRACK L_step ...
193            rndm = ESAFRNDM()
194            X = R1(1)-L_substep*SIN(THETA)*COS(PHI)*(1.*(i-1)+RNDM)
195            Y = R1(2)-L_substep*SIN(THETA)*SIN(PHI)*(1.*(i-1)+RNDM)
196            Z = R1(3)-L_substep*COS(THETA)*(1.*(i-1)+RNDM)
197            RTMP(1) = X
198            RTMP(2) = Y
199            RTMP(3) = Z
200*     ... PHOTON WAVELENGTH ...
201            CALL FLUOR_SPECTRUM(w)
202            TFINAL = GETTRANSITION(TRANS,w)
203            RNDM = ESAFRNDM()
204            IF(RNDM.GT.TFINAL) GOTO 111
205            FN = FN + 1
206            CALL VECTORLIB(3,'-',ISS,RTMP,RTOISS)
207            CALL VECTORDOT(3,ISS,RTOISS,SCALAR_ISS_RTOISS)
208            CALL VECTORDOT(3,ISS,ISS,SCALAR_ISS)
209            CALL VECTORDOT(3,RTOISS,RTOISS,SCALAR_RTOISS)
210       
211            IF(SCALAR_ISS*SCALAR_RTOISS.NE.0.) THEN
212              cos_R_ISS  =
213     +             SCALAR_ISS_RTOISS/SQRT(SCALAR_ISS*SCALAR_RTOISS)
214             ELSE
215              cos_R_ISS  = 0.
216            ENDIF
217           
218*     ... TRANSFORM TO MAIN EUSO SYSTEM FRAME ...
219            X = X*1000          ! in m
220            Y = Y*1000          ! in m
221            Z = (Z-R_EARTH)*1000 !in m
222*     ... ARRIVAL TIME ...
223            time_fl1d = 10./3*(L+L_substep*(1.e0*(i-1)+ESAFRNDM())
224     &           +SQRT(SCALAR_RTOISS))
225            theta1 = ACOS(cos_R_ISS)/PI*180
226            IF(X.NE.0.) THEN
227              phi1 = ATAN2(Y,X)/PI*180
228            ELSE
229              phi1 = 90.0
230            ENDIF
231*     ... RADIAL DISTANCE OF THE PHOTON IMPACT POINT ON THE FIRST ...
232*     ... FRESNEL LENS SURFACE                                    ...
233            CALL SURFACE_POINT(RIMPACT1,ALPHAIMPACT1)
234*     ... PREPARE ESAF OUTPUT: ...
235            FXshower(FN) = X
236            FYshower(FN) = Y
237            FZshower(FN) = Z
238            FXfocal(FN)  = RIMPACT1*COS(ALPHAIMPACT1/180*PI)
239            FYfocal(FN)  = RIMPACT1*SIN(ALPHAIMPACT1/180*PI)
240            FZfocal(FN)  = 0
241            Ftheta1(FN)  = theta1
242            Fphi1(FN)    = phi1
243            Flambda(FN)  = w
244            Ftime(FN)    = time_fl1d
245            k_bunch = k_bunch+1
246            IF(k_bunch.EQ.2000) THEN
247               WRITE(6,200) '.'
248               k_bunch=0
249            ENDIF
250 111      ENDDO
251        ENDIF
252*
253*       
254*     ... CHERENKOV OUTPUT OF INDIVIDUAL PHOTONS ...
255*
256*
257 2      IF(ACCEPTANCE_TYPE.NE.1.) GOTO 3
258        CALL DO_CHERENKOV(L,Lmax,L_step,S,Ne1,NchiSS)
259        N = ESAFPOISSON(DBLE(NchISS))
260        IF (avoid_cycling.GT.kCYCLING) GOTO 33
261            IF(N.EQ.0) THEN
262               avoid_cycling = avoid_cycling + 1
263             GOTO 3
264        ENDIF
265        L_substep = L_step/N
266        CALL TRANSITION_R_RINT_ISS(R1,RG,TRANS)
267        DO i = 1, N
268*     ... GENERATE UNIFORM POINT ALONG THE TRACK L_step ...
269          RNDM = ESAFRNDM()
270          X = R1(1)-L_substep*SIN(THETA)*COS(PHI)*(1.*(i-1)+RNDM)
271          Y = R1(2)-L_substep*SIN(THETA)*SIN(PHI)*(1.*(i-1)+RNDM)
272          Z = R1(3)-L_substep*COS(THETA)*(1.*(i-1)+RNDM)
273          RTMP(1) = X
274          RTMP(2) = Y
275          RTMP(3) = Z
276*     ... TRANSFORM TO MAIN EUSO SYSTEM FRAME ...
277          X = X*1000            ! in m
278          Y = Y*1000            ! in m
279          Z = (Z-R_EARTH)*1000  ! in m
280*     ... PHOTON WAVELENGTH ...
281          CALL CHERENKOV_SPECTRUM(w)
282          ATTENUATION_CHERENKOV = GETTRANSITION(TRANS,w)
283          RNDM = ESAFRNDM()
284          IF(RNDM.GT.ATTENUATION_CHERENKOV) GOTO 222
285          CN = CN + 1
286*     ... RADIAL DISTANCE OF THE PHOTON IMPACT POINT ON THE FIRST ...
287*     ... FRESNEL LENS SURFACE                                    ...
288          CALL SURFACE_POINT(RIMPACT1,ALPHAIMPACT1)
289*     ... PREPARE ESAF OUTPUT: ...
290          CXshower(CN) = X
291          CYshower(CN) = Y
292          CZshower(CN) = Z
293          CXfocal(CN)  = RIMPACT1*COS(ALPHAIMPACT1/180*PI)
294          CYfocal(CN)  = RIMPACT1*SIN(ALPHAIMPACT1/180*PI)
295          CZfocal(CN)  = 0
296          Ctheta1(CN)  = theta1c
297          Cphi1(CN)    = phi1c
298          Clambda(CN)  = w
299          ch_angle = 1./(1.+REFRACTIVE_INDEX(RTMP(1),RTMP(2),RTMP(3)))
300          ch_angle=ACOS(ch_angle)
301          time_sigma = 10./3*L*ch_angle*tan(THETA)
302          time_corrected = ESAFGAUS(DBLE(time_ch),DBLE(time_sigma))
303          Ctime(CN)    = time_corrected
304          k_bunch = k_bunch+1
305          IF(k_bunch.EQ.2000) THEN
306            WRITE(6,200) '.'
307            k_bunch=0
308          ENDIF
309 222    ENDDO
310 3      CONTINUE
311        IF(FN.EQ.0.AND.CN.EQ.0.AND.avoid_cycling.GT.kCYCLING) GOTO 33
312      ENDDO
313
314 33   IF(FN.GT.0.OR.CN.GT.0) KEY_TRIG = .TRUE.
315      IF(.NOT.KEY_TRIG) WRITE(6,*) '... FAILED. TRY AGAIN'
316      WRITE(6,*)
317 100  RETURN
318 200  FORMAT($,A)
319      END
320     
321      SUBROUTINE ESAF_RESET
322#include "esafoutput.inc"
323*     ... RESET COMMON BLOCKS
324      FN = 0
325      CN = 0
326      SN = 0
327      ShowerEnergy=0
328      ShowerTheta=0
329      ShowerPhi=0
330      ShowerX1=0
331      ShowerXmax = 0
332      ShowerAgeEarth=0
333      DO i = 1, 3
334        ShowerRint(i)   = 0.
335        ShowerImpact(i) = 0.
336        ShowerRmax(i)   = 0.
337      ENDDO
338*
339      DO i = 1, Nmax
340*     ... FLUORESCENCE BLOCK
341        FXshower(i) = 0.
342        FYshower(i) = 0.
343        FZshower(i) = 0.
344        FXfocal(i)  = 0.
345        FYfocal(i)  = 0.
346        FZfocal(i)  = 0.
347        Ftheta1(i)  = 0.
348        Fphi1(i)    = 0.
349        Flambda(i)  = 0.
350        Ftime(i)    = 0.
351*     ... CHERENKOV BLOCK
352        CXshower(i) = 0.
353        CYshower(i) = 0.
354        CZshower(i) = 0.
355        CXfocal(i)  = 0.
356        CYfocal(i)  = 0.
357        CZfocal(i)  = 0.
358        Ctheta1(i)  = 0.
359        Cphi1(i)    = 0.
360        Clambda(i)  = 0.
361        Ctime(i)    = 0.
362      ENDDO
363      DO i = 1, NSh
364         ShowerXi(i) = 0
365         ShowerXf(i) = 0
366         ShowerRxi(i) = 0
367         ShowerRyi(i) = 0
368         ShowerRzi(i) = 0
369         ShowerRxf(i) = 0
370         ShowerRyf(i) = 0
371         ShowerRzf(i) = 0
372         ShowerTimei(i) = 0
373         ShowerTimef(i) = 0
374         ShowerAgei(i)  = 0
375         ShowerAgef(i)  = 0
376         ShowerNe(i)    = 0
377      ENDDO
378      END
Note: See TracBrowser for help on using the repository browser.