2
C *****************************************************************
4
C THIS IS THE DRIVER FOR CHECKING THE STANDALONE MATRIX ELEMENT.
5
C IT USES A SIMPLE PHASE SPACE GENERATOR
6
C Fabio Maltoni - 3rd Febraury 2007
7
C *****************************************************************
16
PARAMETER (NSPLITORDERS=1)
20
C --- the include file with the values of the parameters and
23
C integer nexternal and number particles (incoming+outgoing) in
25
INTEGER NEXTERNAL, NINCOMING
26
PARAMETER (NEXTERNAL=3,NINCOMING=2)
28
REAL*8 PMASS(NEXTERNAL)
30
C --- integer n_max_cg
31
INCLUDE 'ngraphs.inc' !how many diagrams (could be useful to know...)
37
REAL*8 P(0:3,NEXTERNAL) ! four momenta. Energy is the zeroth component.
38
REAL*8 SQRTS ! sqrt(s)= center of mass energy
39
REAL*8 MATELEM, MATELEMS(0:NSPLITORDERS)
40
REAL*8 PIN(0:3), POUT(0:3)
41
CHARACTER*120 BUFF(NEXTERNAL)
44
CHARACTER*20 CHOSEN_SO_INDICES(NSPLITORDERS)
52
LOGICAL CHOSEN_SO_CONFIGS(NSPLITORDERS)
53
COMMON/CHOSEN_BORN_SQSO/CHOSEN_SO_CONFIGS
59
C Start by initializing what is the squared split orders indices
63
IF (CHOSEN_SO_CONFIGS(I)) THEN
65
WRITE(CHOSEN_SO_INDICES(NCHOSEN),'(I3,A1)') I,')'
69
C --- INITIALIZATION CALLS
71
C --- Call to initialize the values of the couplings, masses and
73
C used in the evaluation of the matrix element. The primary
75
C models are read from Cards/param_card.dat. The secondary
76
C parameters are calculated
77
C in Source/MODEL/couplings.f. The values are stored in common
78
C blocks that are listed
81
CALL SETPARA('param_card.dat') !first call to setup the paramaters
82
INCLUDE 'pmass.inc' !set up masses
86
TOTALMASS = TOTALMASS + PMASS(I)
89
C --- Now use a simple multipurpose PS generator (RAMBO) just to
91
C RANDOM set of four momenta of given masses pmass(i) to be used
93
C the madgraph matrix-element.
94
C Alternatevely, here the user can call or set the four momenta at
95
C his will, see below.
97
IF(NINCOMING.EQ.1) THEN
100
SQRTS=1000D0 !CMS energy in GEV
101
IF (SQRTS.LE.2.0D0*TOTALMASS) THEN
102
SQRTS = 2.0D0*TOTALMASS
108
CALL GET_MOMENTA(SQRTS,PMASS,P)
110
C write the information on the four momenta
113
WRITE (*,*) ' Phase space point:'
115
WRITE (*,*) '-----------------------------'
116
WRITE (*,*) 'n E px py pz m '
118
WRITE (*,'(i2,1x,5e15.7)') I, P(0,I),P(1,I),P(2,I),P(3,I)
119
$ ,DSQRT(DABS(DOT(P(0,I),P(0,I))))
121
WRITE (*,*) '-----------------------------'
124
C Now we can call the matrix element!
126
CALL SMATRIX_SPLITORDERS(P,MATELEMS)
128
WRITE(*,*) '1) Matrix element for (QCD=0) = ',MATELEMS(1)
130
IF (NCHOSEN.NE.NSPLITORDERS) THEN
131
WRITE (*,*) 'Selected squared coupling orders combination for'
132
$ //' the sum below:'
133
WRITE (*,*) (CHOSEN_SO_INDICES(I),I=1,NCHOSEN)
135
WRITE (*,*) 'Total Matrix element = ', MATELEM, ' GeV^',-(2
137
WRITE (*,*) '-----------------------------'
140
C c Copy down here (or read in) the four momenta as a string.
143
C buff(1)=" 1 0.5630480E+04 0.0000000E+00 0.0000000E+00
145
C buff(2)=" 2 0.5630480E+04 0.0000000E+00 0.0000000E+00
147
C buff(3)=" 3 0.5466073E+04 0.4443190E+03 0.2446331E+04
149
C buff(4)=" 4 0.8785819E+03 -0.2533886E+03 0.2741971E+03
151
C buff(5)=" 5 0.4916306E+04 -0.1909305E+03 -0.2720528E+04
154
C c Here the k,E,px,py,pz are read from the string into the
157
C c k=3,nexternal : outgoing
160
C read (buff(i),*) k, P(0,i),P(1,i),P(2,i),P(3,i)
163
C c- print the momenta out
166
C write (*,'(i2,1x,5e15.7)') i, P(0,i),P(1,i),P(2,i),P(3,i),
167
C .dsqrt(dabs(DOT(p(0,i),p(0,i))))
170
C CALL SMATRIX(P,MATELEM)
172
C write (*,*) "-------------------------------------------------"
173
C write (*,*) "Matrix element = ", MATELEM, " GeV^",-(2*nexternal-8)
175
C write (*,*) "-------------------------------------------------"
182
DOUBLE PRECISION FUNCTION DOT(P1,P2)
183
C *****************************************************************
185
C 4-Vector Dot product
186
C *****************************************************************
189
DOUBLE PRECISION P1(0:3),P2(0:3)
190
DOT=P1(0)*P2(0)-P1(1)*P2(1)-P1(2)*P2(2)-P1(3)*P2(3)
194
SUBROUTINE GET_MOMENTA(ENERGY,PMASS,P)
195
C ---- auxiliary function to change convention between madgraph
199
C integer nexternal and number particles (incoming+outgoing) in
201
INTEGER NEXTERNAL, NINCOMING
202
PARAMETER (NEXTERNAL=3,NINCOMING=2)
204
REAL*8 ENERGY,PMASS(NEXTERNAL),P(0:3,NEXTERNAL),PRAMBO(4,10),WGT
207
REAL*8 ETOT2,MOM,M1,M2,E1,E2
212
MOM=(ETOT2**2 - 2*ETOT2*M1**2 + M1**4 - 2*ETOT2*M2**2 - 2*M1**2
213
$ *M2**2 + M2**4)/(4.*ETOT2)
215
E1=DSQRT(MOM**2+M1**2)
216
E2=DSQRT(MOM**2+M2**2)
217
WRITE (*,*) E1+E2,MOM
219
IF(NINCOMING.EQ.2) THEN
231
CALL RAMBO(NEXTERNAL-2,ENERGY,PMASS(3),PRAMBO,WGT)
239
ELSEIF(NINCOMING.EQ.1) THEN
246
CALL RAMBO(NEXTERNAL-1,ENERGY,PMASS(2),PRAMBO,WGT)
259
SUBROUTINE RAMBO(N,ET,XM,P,WT)
260
C *****************************************************************
264
C * RA(NDOM) M(OMENTA) B(EAUTIFULLY) O(RGANIZED)
268
C * A DEMOCRATIC MULTI-PARTICLE PHASE SPACE GENERATOR
270
C * AUTHORS: S.D. ELLIS, R. KLEISS, W.J. STIRLING
272
C * THIS IS VERSION 1.0 - WRITTEN BY R. KLEISS
274
C * -- ADJUSTED BY HANS KUIJF, WEIGHTS ARE LOGARITHMIC
278
C * N = NUMBER OF PARTICLES
280
C * ET = TOTAL CENTRE-OF-MASS ENERGY
282
C * XM = PARTICLE MASSES ( DIM=NEXTERNAL-nincoming )
284
C * P = PARTICLE MOMENTA ( DIM=(4,NEXTERNAL-nincoming) )
286
C * WT = WEIGHT OF THE EVENT
288
C *****************************************************************
290
IMPLICIT REAL*8(A-H,O-Z)
291
C integer nexternal and number particles (incoming+outgoing) in
293
INTEGER NEXTERNAL, NINCOMING
294
PARAMETER (NEXTERNAL=3,NINCOMING=2)
295
DIMENSION XM(NEXTERNAL-NINCOMING),P(4,NEXTERNAL-NINCOMING)
296
DIMENSION Q(4,NEXTERNAL-NINCOMING),Z(NEXTERNAL-NINCOMING),R(4),
297
$ B(3),P2(NEXTERNAL-NINCOMING),XM2(NEXTERNAL-NINCOMING),
298
$ E(NEXTERNAL-NINCOMING),V(NEXTERNAL-NINCOMING),IWARN(5)
299
SAVE ACC,ITMAX,IBEGIN,IWARN
300
DATA ACC/1.D-14/,ITMAX/6/,IBEGIN/0/,IWARN/5*0/
302
C * INITIALIZATION STEP: FACTORIALS FOR THE PHASE SPACE WEIGHT
303
IF(IBEGIN.NE.0) GOTO 103
308
DO 101 K=3,NEXTERNAL-NINCOMING-1
309
101 Z(K)=Z(K-1)+PO2LOG-2.*LOG(DFLOAT(K-2))
310
DO 102 K=3,NEXTERNAL-NINCOMING-1
311
102 Z(K)=(Z(K)-LOG(DFLOAT(K-1)))
313
C * CHECK ON THE NUMBER OF PARTICLES
314
103 IF(N.GT.1.AND.N.LT.101) GOTO 104
318
C * CHECK WHETHER TOTAL ENERGY IS SUFFICIENT; COUNT NONZERO MASSES
322
IF(XM(I).NE.0.D0) NM=NM+1
323
105 XMT=XMT+ABS(XM(I))
324
IF(XMT.LE.ET) GOTO 201
328
C * THE PARAMETER VALUES ARE NOW ACCEPTED
330
C * GENERATE N MASSLESS MOMENTA IN INFINITE PHASE SPACE
340
Q(2,I)=Q(4,I)*S*COS(F)
341
202 Q(1,I)=Q(4,I)*S*SIN(F)
343
C * CALCULATE THE PARAMETERS OF THE CONFORMAL TRANSFORMATION
349
RMAS=SQRT(R(4)**2-R(3)**2-R(2)**2-R(1)**2)
356
C * TRANSFORM THE Q'S CONFORMALLY INTO THE P'S
358
BQ=B(1)*Q(1,I)+B(2)*Q(2,I)+B(3)*Q(3,I)
360
206 P(K,I)=X*(Q(K,I)+B(K)*(Q(4,I)+A*BQ))
361
207 P(4,I)=X*(G*Q(4,I)+BQ)
363
C * CALCULATE WEIGHT AND POSSIBLE WARNINGS
365
IF(N.NE.2) WT=(2.*N-4.)*LOG(ET)+Z(N)
366
IF(WT.GE.-180.D0) GOTO 208
367
IF(IWARN(1).LE.5) PRINT 1004,WT
369
208 IF(WT.LE. 174.D0) GOTO 209
370
IF(IWARN(2).LE.5) PRINT 1005,WT
373
C * RETURN FOR WEIGHTED MASSLESS MOMENTA
374
209 IF(NM.NE.0) GOTO 210
375
C * RETURN LOG OF WEIGHT
379
C * MASSIVE PARTICLES: RESCALE THE MOMENTA BY A FACTOR X
380
210 XMAX=SQRT(1.-(XMT/ET)**2)
391
E(I)=SQRT(XM2(I)+X2*P2(I))
394
IF(ABS(F0).LE.ACCU) GOTO 305
396
IF(ITER.LE.ITMAX) GOTO 304
407
C * CALCULATE THE MASS-EFFECT WEIGHT FACTOR
412
308 WT3=WT3+V(I)**2/E(I)
413
WTM=(2.*N-3.)*LOG(X)+LOG(WT2/WT3*ET)
415
C * RETURN FOR WEIGHTED MASSIVE MOMENTA
417
IF(WT.GE.-180.D0) GOTO 309
418
IF(IWARN(3).LE.5) PRINT 1004,WT
420
309 IF(WT.LE. 174.D0) GOTO 310
421
IF(IWARN(4).LE.5) PRINT 1005,WT
423
C * RETURN LOG OF WEIGHT
427
1001 FORMAT(' RAMBO FAILS: # OF PARTICLES =',I5,' IS NOT ALLOWED')
428
1002 FORMAT(' RAMBO FAILS: TOTAL MASS =',D15.6,' IS NOT SMALLER THAN'
429
$ //' TOTAL ENERGY =',D15.6)
430
1004 FORMAT(' RAMBO WARNS: WEIGHT = EXP(',F20.9,') MAY UNDERFLOW')
431
1005 FORMAT(' RAMBO WARNS: WEIGHT = EXP(',F20.9,') MAY OVERFLOW')
432
1006 FORMAT(' RAMBO WARNS:',I3,' ITERATIONS DID NOT GIVE THE DESIRED'
433
$ //' ACCURACY =',D15.6)
442
CALL RMARIN(1802,9373)
446
IF (RAN.LT.1D-16) GOTO 10
453
SUBROUTINE RANMAR(RVEC)
454
C * -----------------
455
C * Universal random number generator proposed by Marsaglia and
457
C * in report FSU-SCRI-87-50
458
C * In this version RVEC is a double precision variable.
459
IMPLICIT REAL*8(A-H,O-Z)
460
COMMON/ RASET1 / RANU(97),RANC,RANCD,RANCM
461
COMMON/ RASET2 / IRANMR,JRANMR
462
SAVE /RASET1/,/RASET2/
463
UNI = RANU(IRANMR) - RANU(JRANMR)
464
IF(UNI .LT. 0D0) UNI = UNI + 1D0
468
IF(IRANMR .EQ. 0) IRANMR = 97
469
IF(JRANMR .EQ. 0) JRANMR = 97
471
IF(RANC .LT. 0D0) RANC = RANC + RANCM
473
IF(UNI .LT. 0D0) UNI = UNI + 1D0
477
SUBROUTINE RMARIN(IJ,KL)
478
C * -----------------
479
C * Initializing routine for RANMAR, must be called before
481
C * any pseudorandom numbers with RANMAR. The input values
483
C * the ranges 0<=ij<=31328 ; 0<=kl<=30081
484
IMPLICIT REAL*8(A-H,O-Z)
485
COMMON/ RASET1 / RANU(97),RANC,RANCD,RANCM
486
COMMON/ RASET2 / IRANMR,JRANMR
487
SAVE /RASET1/,/RASET2/
488
C * This shows correspondence between the simplified input seeds
490
C * and the original Marsaglia-Zaman seeds I,J,K,L.
491
C * To get the standard values in the Marsaglia-Zaman paper
493
C * k=56,l=78) put ij=1802, kl=9373
494
I = MOD( IJ/177 , 177 ) + 2
495
J = MOD( IJ , 177 ) + 2
496
K = MOD( KL/169 , 178 ) + 1
502
M = MOD( MOD(I*J,179)*K , 179 )
506
L = MOD( 53*L+1 , 169 )
507
IF(MOD(L*M,64) .GE. 32) S = S + T
512
RANC = 362436D0 / 16777216D0
513
RANCD = 7654321D0 / 16777216D0
514
RANCM = 16777213D0 / 16777216D0