]> git.uio.no Git - u/mrichter/AliRoot.git/blob - GEANT321/neutron/cangle.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / GEANT321 / neutron / cangle.F
1 *
2 * $Id$
3 *
4 * $Log$
5 * Revision 1.1.1.1  1995/10/24 10:21:55  cernlib
6 * Geant
7 *
8 *
9 #include "geant321/pilot.h"
10 *CMZ :  3.21/04 23/02/95  14.46.01  by  S.Giani
11 *-- Author :
12       SUBROUTINE CANGLE(D,LD,E,FM,LEN)
13 C       THIS ROUTINE SELECTS THE SCATTERING ANGLE AT A COLLISION
14       DIMENSION D(*),LD(*)
15       SAVE
16       I=0
17       IPP=1
18       NR=LD(IPP)
19       NE=LD(IPP+1)
20       NR2=2*NR
21       IP=2+NR2
22       INT=LD(IP)
23    10 IP=IP+1
24       I=I+1
25       EINCD=D(IP)
26       IF(E.LE.EINCD)GO TO 30
27       IP1=IP
28       IP=IP+1
29       NP=LD(IP)
30       IP=IP+2*NP
31       IF(IP.GE.LEN)GO TO 20
32       GO TO 10
33 C       E IS GREATER THAN THE LAST INCIDENT ENERGY
34 C       USE THE LAST DISTRIBUTION
35    20 IP=IP-2*NP-1
36       GO TO 70
37    30 IF(I.EQ.1)GO TO 60
38 C       CHOOSE WHICH DISTRIBUTION TO SAMPLE FROM
39 C       THE INTERPOLATION SCHEME IS ASSUMED LINEAR-LINEAR IF IT
40 C       IS NOT EQUAL TO THREE (LINEAR-LOG).  THIS IS GENERALLY TRUE
41       IF(INT.NE.3)GO TO 40
42       PROB=ALOG(EINCD/E)/ALOG(EINCD/D(IP1))
43    40 PROB=(EINCD-E)/(EINCD-D(IP1))
44       R=FLTRNF(0)
45       IF(R.LE.PROB)GO TO 50
46 C       SELECT FROM THE SECOND DISTRIBUTION
47       NP=LD(IP+1)
48       GO TO 70
49 C       SELECT FROM THE FIRST DISTRIBUTION
50    50 IP=IP1
51       GO TO 70
52 C       E IS LESS THAN THE FIRST INCIDENT ENERGY
53 C       USE THE FIRST DISTRIBUTION
54    60 NP=LD(IP+1)
55    70 CONTINUE
56       PROB1=0.0
57       R=FLTRNF(0)
58       DO 80 I=2,NP
59          N=IP+2*I+1
60          A1=D(N-3)
61          IF(R.LE.D(N))GO TO 90
62          PROB1=D(N)
63    80 CONTINUE
64       FM=1.0
65       RETURN
66    90 FM=A1+(R-PROB1)*(D(N-1)-A1)/(D(N)-PROB1)
67       IF(ABS(FM).GT.1.) FM = 1.0
68       RETURN
69       END