]>
Commit | Line | Data |
---|---|---|
fe4da5cc | 1 | * |
2 | * $Id$ | |
3 | * | |
4 | * $Log$ | |
5 | * Revision 1.1.1.1 1995/10/24 10:20:59 cernlib | |
6 | * Geant | |
7 | * | |
8 | * | |
9 | #include "geant321/pilot.h" | |
10 | *CMZ : 3.21/02 29/03/94 15.41.38 by S.Giani | |
11 | *-- Author : | |
12 | SUBROUTINE POISSO(XAV,IRAN) | |
13 | C | |
14 | C *** GENERATION OF POISSON DISTRIBUTION *** | |
15 | C *** NVE 16-MAR-1988 CERN GENEVA *** | |
16 | C | |
17 | DIMENSION RNDM(1) | |
18 | C ORIGIN : H.FESEFELDT (27-OCT-1983) | |
19 | C | |
20 | C --- USE NORMAL DISTRIBUTION FOR <X> > 9.9 --- | |
21 | IF(XAV.GT.9.9) GOTO 2 | |
22 | C | |
23 | MM=IFIX(5.*XAV) | |
24 | IRAN=0 | |
25 | IF(MM.LE.0) GOTO 3 | |
26 | R=EXP(-XAV) | |
27 | CALL GRNDM(RNDM,1) | |
28 | RAN1=RNDM(1) | |
29 | IF(RAN1.LE.R) RETURN | |
30 | RR=R | |
31 | DO 1 I=1,MM | |
32 | IRAN=IRAN+1 | |
33 | IF(I.LE.5) RRR=XAV**I/NFAC(I) | |
34 | C** STIRLING' S FORMULA FOR LARGE NUMBERS | |
35 | IF(I.GT.5) RRR=EXP(I*LOG(XAV)-(I+0.5)*LOG(I*1.)+I-0.9189385) | |
36 | RR=RR+R*RRR | |
37 | IF(RAN1.LE.RR) RETURN | |
38 | 1 CONTINUE | |
39 | RETURN | |
40 | C** NORMAL DISTRIBUTION WITH SIGMA**2 = <X> | |
41 | 2 CALL NORMAL(RAN1) | |
42 | RAN1=XAV+RAN1*SQRT(XAV) | |
43 | IRAN=IFIX(RAN1) | |
44 | IF(IRAN.LT.0) IRAN=0 | |
45 | RETURN | |
46 | C** FOR VERY SMALL XAV TRY IRAN=1,2,3 | |
47 | 3 P1=XAV*EXP(-XAV) | |
48 | P2=XAV*P1/2. | |
49 | P3=XAV*P2/3. | |
50 | CALL GRNDM(RNDM,1) | |
51 | RAN=RNDM(1) | |
52 | IRAN=3 | |
53 | IF(RAN.LT.P3) RETURN | |
54 | IRAN=2 | |
55 | IF(RAN.LT.P2) RETURN | |
56 | IRAN=1 | |
57 | IF(RAN.LT.P1) RETURN | |
58 | IRAN=0 | |
59 | RETURN | |
60 | END |