-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathgpoiss.F
70 lines (70 loc) · 2.34 KB
/
gpoiss.F
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
*
* $Id$
*
* $Log: gpoiss.F,v $
* Revision 1.1.1.1 2002/07/24 15:56:25 rdm
* initial import into CVS
*
* Revision 1.1.1.1 2002/06/16 15:18:41 hristov
* Separate distribution of Geant3
*
* Revision 1.1.1.1 1999/05/18 15:55:20 fca
* AliRoot sources
*
* Revision 1.1.1.1 1995/10/24 10:21:32 cernlib
* Geant
*
*
#include "geant321/pilot.h"
*CMZ : 3.21/02 29/03/94 15.41.23 by S.Giani
*-- Author :
SUBROUTINE G3POISS(AMVEC,NPVEC,LEN)
C.
C. ******************************************************************
C. * *
C. * Generates a vector NPVEC of LEN random numbers *
C. * POISSON distribued with mean values AMVEC *
C. * *
C. * If the mean value A greater than PLIM, N is calculated *
C. * according to the Gaussian approximation of the Poisson *
C. * distribution. *
C. * *
C. * ==> Called by : G3LANDZ,G3MCOUL *
C. * *
C. * Author : L.Urban *
C. * Date : 28.04.1988 Last update : 1.02.1990 *
C. * *
C. ******************************************************************
C.
#include "geant321/gconsp.inc"
REAL AMVEC(*),RNDM(2), N
INTEGER NPVEC(*)
PARAMETER (PLIM=16.,HMXINT=2E+9)
*
DO 30 I=1,LEN
* Protection against negative mean values
N=0.
IF(AMVEC(I).GT.0.) THEN
IF(AMVEC(I).LE.PLIM) THEN
CALL GRNDM(RNDM,1)
R=RNDM(1)
P=EXP(-AMVEC(I))
S=P
IF(R.LE.S) GOTO 20
10 N=N+1.
P=P*AMVEC(I)/N
S=S+P
IF(S.LT.R.AND.P.GT.1.E-30) GOTO 10
ELSE
CALL GRNDM(RNDM,2)
RR=SQRT(-2.*LOG(RNDM(1)))
PHI=TWOPI*RNDM(2)
X=RR*COS(PHI)
N=MIN(MAX(AMVEC(I)+X*SQRT(AMVEC(I)),0.),HMXINT)
ENDIF
ENDIF
*
20 NPVEC(I) = N
30 CONTINUE
*
END