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 |
---|