]>
Commit | Line | Data |
---|---|---|
fe4da5cc | 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 |