1 | SUBROUTINE SLASTSIMULATION |
---|
2 | IMPLICIT NONE |
---|
3 | #include "event.inc" |
---|
4 | #include "cwntvars.inc" |
---|
5 | #include "erandom.inc" |
---|
6 | #include "detector.inc" |
---|
7 | #include "constants.inc" |
---|
8 | |
---|
9 | REAL Lmax, EINT1, EINT2 |
---|
10 | INTEGER iss_first,second_call,avoid_cycling |
---|
11 | SAVE iss_first |
---|
12 | SAVE second_call |
---|
13 | DATA iss_first/0/, second_call/0/ |
---|
14 | LOGICAL KEY_TRIG/.FALSE./ |
---|
15 | REAL DEPTH |
---|
16 | REAL*8 RNDM |
---|
17 | * |
---|
18 | avoid_cycling = 0 |
---|
19 | PI = ACOS(-1.) |
---|
20 | IF(iss_first.EQ.0) THEN |
---|
21 | FOV = FOV/180.*PI |
---|
22 | iss_first = 1 |
---|
23 | ENDIF |
---|
24 | * |
---|
25 | ISS(3) = ISS(3) + R_EARTH ! TRANSFORM TO SPHERICAL COORDINATES (IT IS RESET EACH EVENT FROM SLASTLIGHTOEUSO (C object) |
---|
26 | EVENT = 0 |
---|
27 | EINT = EINTR(1) |
---|
28 | THETA = THETAR(1) |
---|
29 | PHI = PHIR(1) |
---|
30 | IF((EINTR(1).EQ.EINTR(2) .AND. |
---|
31 | + THETAR(1).EQ.THETAR(2).AND. |
---|
32 | + PHIR(1).EQ.PHIR(2))) THEN |
---|
33 | IF ( SECOND_CALL .EQ. 0 ) THEN |
---|
34 | RINT(3) = RINT(3) + R_EARTH |
---|
35 | CALL ACCEPTANCE(Lmax) |
---|
36 | RINT(3) = RINT(3) - R_EARTH |
---|
37 | CALL TRANSFORM_COORDINATES('FORWARD') |
---|
38 | ELSE |
---|
39 | THETA = THETAR(1) |
---|
40 | PHI = PHIR(1) |
---|
41 | RINT(3) = RINT(3) - R_EARTH |
---|
42 | CALL TRANSFORM_COORDINATES('FORWARD') |
---|
43 | END IF |
---|
44 | X1 = DEPTH(RINT) |
---|
45 | CALL GENERATE_ESAFEVENT(Lmax,KEY_TRIG) |
---|
46 | SECOND_CALL = 1 |
---|
47 | GOTO 2 |
---|
48 | ENDIF |
---|
49 | * |
---|
50 | 1 RNDM = ESAFRNDM() |
---|
51 | KEY_TRIG = .FALSE. |
---|
52 | avoid_cycling = avoid_cycling + 1 |
---|
53 | * ... DEFINE ENERGY,THETA,PHI ... |
---|
54 | IF(ERAN.EQ.-1) THEN ! Energy is taken randomly according |
---|
55 | EINT = EINTR(1)*EXP(RNDM*LOG(EINTR(2)/EINTR(1))) ! to the uniform distribution in (Ln(E1),Ln(E2)) |
---|
56 | ELSE ! Else energy is taken randomly accordning to E^-ERAN |
---|
57 | EINT1 = EINTR(1)**(ERAN+1) ! distribition |
---|
58 | EINT2 = EINTR(2)**(ERAN+1) |
---|
59 | EINT = (EINT1+(EINT2-EINT1)*RNDM)**(1.E0/(ERAN+1)) |
---|
60 | ENDIF |
---|
61 | CALL FIRSTPOINT(Lmax) |
---|
62 | CALL TRANSFORM_COORDINATES('FORWARD') |
---|
63 | CALL GENERATE_ESAFEVENT(Lmax,KEY_TRIG) |
---|
64 | IF(.NOT.KEY_TRIG.AND.avoid_cycling.LT.100) GOTO 1 |
---|
65 | 2 RETURN |
---|
66 | END |
---|