1
DOUBLE PRECISION FUNCTION DSIG(PP,WGT,IMODE)
2
C ****************************************************
4
C Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
5
C By the MadGraph5_aMC@NLO Development Team
6
C Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
11
C RETURNS DIFFERENTIAL CROSS SECTION
12
C FOR MULTIPLE PROCESSES IN PROCESS GROUP
14
C pp 4 momentum of external particles
15
C wgt weight from Monte Carlo
16
C imode 0 run, 1 init, 2 reweight,
17
C 3 finalize, 4 only PDFs
19
C Amplitude squared and summed
20
C ****************************************************
27
INCLUDE 'maxconfigs.inc'
28
INCLUDE 'nexternal.inc'
31
PARAMETER (PI=3.1415926D0)
35
DOUBLE PRECISION PP(0:3,NEXTERNAL), WGT
41
INTEGER I,J,K,LUN,ICONF,IMIRROR,NPROC
43
INTEGER SYMCONF(0:LMAXCONFIGS)
45
DOUBLE PRECISION SUMPROB,TOTWGT,R,XDUM
46
INTEGER CONFSUB(MAXSPROC,LMAXCONFIGS)
47
INCLUDE 'config_subproc_map.inc'
48
INTEGER PERMS(NEXTERNAL,LMAXCONFIGS)
49
INCLUDE 'symperms.inc'
50
LOGICAL MIRRORPROCS(MAXSPROC)
51
INCLUDE 'mirrorprocs.inc'
52
C SELPROC is vector of selection weights for the subprocesses
53
C SUMWGT is vector of total weight for the subprocesses
54
C NUMEVTS is vector of event calls for the subprocesses
55
DOUBLE PRECISION SELPROC(2, MAXSPROC,LMAXCONFIGS)
56
DOUBLE PRECISION SUMWGT(2, MAXSPROC,LMAXCONFIGS)
57
INTEGER NUMEVTS(2, MAXSPROC,LMAXCONFIGS)
59
PARAMETER (LARGEDIM=2*MAXSPROC*LMAXCONFIGS)
60
DATA SELPROC/LARGEDIM*0D0/
61
DATA SUMWGT/LARGEDIM*0D0/
62
DATA NUMEVTS/LARGEDIM*0/
63
SAVE SELPROC,SUMWGT,NUMEVTS
64
REAL*8 MC_GROUPED_PROC_JACOBIAN
65
INTEGER GROUPED_MC_GRID_STATUS
70
DOUBLE PRECISION DSIGPROC
71
EXTERNAL NEXTUNOPEN,DSIGPROC
77
C ICONFIG has this config number
78
INTEGER MAPCONFIG(0:LMAXCONFIGS), ICONFIG
79
COMMON/TO_MCONFIGS/MAPCONFIG, ICONFIG
80
C IPROC has the present process number
82
COMMON/TO_MIRROR/IMIRROR, IPROC
83
C CM_RAP has parton-parton system rapidity
84
DOUBLE PRECISION CM_RAP
86
COMMON/TO_CM_RAP/SET_CM_RAP,CM_RAP
87
C Keep track of whether cuts already calculated for this event
88
LOGICAL CUTSDONE,CUTSPASSED
89
COMMON/TO_CUTSDONE/CUTSDONE,CUTSPASSED
90
C To be able to control when the matrix<i> subroutine can add
91
C entries to the grid for the MC over helicity configuration
92
LOGICAL ALLOW_HELICITY_GRID_ENTRIES
93
DATA ALLOW_HELICITY_GRID_ENTRIES/.TRUE./
94
COMMON/TO_ALLOW_HELICITY_GRID_ENTRIES/ALLOW_HELICITY_GRID_ENTRIES
95
C To limit the number of calls to switchmom, use in DSIGPROC the
96
C cached variable last_iconfig. It is in this subroutine as well
97
C so that we can set it to -1 to ignore caching (to prevent
98
C undesired effect if this subroutine is called from elsewhere
99
C and to 0 to reset the cache.
102
COMMON/TO_LAST_ICONF/LAST_ICONF
109
C Make sure cuts are evaluated for first subprocess
114
C Set up process information from file symfact
117
SYMCONF(IPROC)=ICONFIG
118
OPEN(UNIT=LUN,FILE='../symfact.dat',STATUS='OLD',ERR=20)
120
READ(LUN,*,ERR=10,END=10) XDUM, ICONF
121
IF(ICONF.EQ.-MAPCONFIG(ICONFIG))THEN
123
SYMCONF(IPROC)=INT(XDUM)
130
WRITE(*,*)'Error opening symfact.dat. No permutations used.'
132
ELSE IF(IMODE.EQ.2)THEN
133
C Output weights and number of events
138
SUMPROB=SUMPROB+SUMWGT(K,I,J)
142
WRITE(*,*)'Relative summed weights:'
144
WRITE(*,'(4E12.4)')((SUMWGT(K,I,J)/SUMPROB,K=1,2),I=1
151
SUMPROB=SUMPROB+NUMEVTS(K,I,J)
155
WRITE(*,*)'Relative number of events:'
157
WRITE(*,'(4E12.4)')((NUMEVTS(K,I,J)/SUMPROB,K=1,2),I=1
162
WRITE(*,'(4I12)')((NUMEVTS(K,I,J),K=1,2),I=1,MAXSPROC)
164
C Reset weights and number of events
174
ELSE IF(IMODE.EQ.3)THEN
179
C IMODE.EQ.0, regular run mode
180
IF(MC_GROUPED_SUBPROC.AND.DS_GET_DIM_STATUS('grouped_processes'
182
CALL DS_REGISTER_DIMENSION('grouped_processes', 0)
183
CALL DS_SET_MIN_POINTS(10,'grouped_processes')
186
IF(CONFSUB(IPROC,SYMCONF(J)).NE.0) THEN
188
IF(IMIRROR.EQ.1.OR.MIRRORPROCS(IPROC))THEN
189
CALL MAP_3_TO_1(J,IPROC,IMIRROR,MAXSPROC,2,LMAPPED)
190
CALL DS_ADD_BIN('grouped_processes',LMAPPED)
197
IF(MC_GROUPED_SUBPROC.AND.DS_DIM_INDEX(RUN_GRID, 'PDF_convolutio'
198
$ //'n',.TRUE.).EQ.-1) THEN
199
CALL DS_REGISTER_DIMENSION('PDF_convolution', 0, ALL_GRIDS=.FAL
203
C Select among the subprocesses based on PDF weight
205
C Turn caching on in dsigproc to avoid too many calls to switchmom
209
IF(CONFSUB(IPROC,SYMCONF(J)).NE.0) THEN
211
IF(IMIRROR.EQ.1.OR.MIRRORPROCS(IPROC))THEN
212
C Calculate PDF weight for all subprocesses
213
SELPROC(IMIRROR,IPROC,J)=DSIGPROC(PP,J,IPROC,IMIRROR
214
$ ,SYMCONF,CONFSUB,1D0,4)
215
IF(MC_GROUPED_SUBPROC) THEN
216
CALL MAP_3_TO_1(J,IPROC,IMIRROR,MAXSPROC,2,LMAPPED)
217
CALL DS_ADD_ENTRY('PDF_convolution',LMAPPED
218
$ ,SELPROC(IMIRROR,IPROC,J),.TRUE.)
220
SUMPROB=SUMPROB+SELPROC(IMIRROR,IPROC,J)
222
C Need to flip back x values
233
C Turn caching in dsigproc back off to avoid side effects.
236
C Cannot make a selection with all PDFs to zero, so we return now
237
IF(SUMPROB.EQ.0.0D0) THEN
241
C Perform the selection
244
C It is important to cache the status before adding any entries to
246
C routine since it might change it
247
GROUPED_MC_GRID_STATUS = DS_GET_DIM_STATUS('grouped_processes')
249
IF (MC_GROUPED_SUBPROC.AND.GROUPED_MC_GRID_STATUS.EQ.0) THEN
250
C We must initialize the grid and probe all channels
252
C Turn caching on in dsigproc to avoid too many calls to
257
IF(CONFSUB(I,SYMCONF(J)).NE.0) THEN
259
IF(K.EQ.1.OR.MIRRORPROCS(I))THEN
263
C The IMODE=5 computes the matrix_element only,
264
C without PDF convolution
265
DSIG=DSIGPROC(PP,ICONF,IPROC,IMIRROR,SYMCONF,CONFSUB
267
CALL MAP_3_TO_1(J,I,K,MAXSPROC,2,LMAPPED)
268
IF (SELPROC(K,I,J).NE.0.0D0) THEN
269
CALL DS_ADD_ENTRY('grouped_processes',LMAPPED,DSIG)
272
C Need to flip back x values
278
SELPROC(K,I,J) = DSIG*SELPROC(K,I,J)
279
SUMPROB = SUMPROB + SELPROC(K,I,J)
285
C Turn caching in dsigproc back off to avoid side effects.
287
C If these additional entries were enough to initialize the
288
C gird, then update it
289
C To do this check we must *not* used the cached varianble
290
C grouped_MC_grid_status
291
IF(DS_GET_DIM_STATUS('grouped_processes').GE.1) THEN
292
CALL DS_UPDATE_GRID('grouped_processes')
293
CALL RESET_CUMULATIVE_VARIABLE()
297
C If we are still initializing the grid or simply not using one at
298
C all, then we pick a point based on PDF only.
299
IF (.NOT.MC_GROUPED_SUBPROC.OR.GROUPED_MC_GRID_STATUS.EQ.0) THEN
307
TOTWGT=TOTWGT+SELPROC(K,I,J)
319
IF(IPROC.EQ.0) RETURN
321
C Update weigth w.r.t SELPROC normalized to selection probability
323
WGT=WGT*(SUMPROB/SELPROC(IMIRROR,IPROC,ICONF))
326
C We are using the grouped_processes grid and it is initialized.
327
CALL DS_GET_POINT('grouped_processes',R,LMAPPED,MC_GROUPED_PROC
328
$ _JACOBIAN,'norm',(/'PDF_convolution'/))
329
WGT=WGT*MC_GROUPED_PROC_JACOBIAN
330
CALL MAP_1_TO_3(LMAPPED,MAXSPROC,2,ICONF,IPROC,IMIRROR)
333
C Redo clustering to ensure consistent with final IPROC
336
IF(GROUPED_MC_GRID_STATUS.EQ.0) THEN
337
C If we were in the initialization phase of the grid for MC over
338
C grouped processes, we must instruct the matrix<i> subroutine
339
C not to add again an entry in the grid for this PS point at
340
C the call DSIGPROC just below.
341
ALLOW_HELICITY_GRID_ENTRIES = .FALSE.
343
C Call DSIGPROC to calculate sigma for process
344
DSIG=DSIGPROC(PP,ICONF,IPROC,IMIRROR,SYMCONF,CONFSUB,WGT,IMODE)
345
C Reset ALLOW_HELICITY_GRID_ENTRIES
346
ALLOW_HELICITY_GRID_ENTRIES = .TRUE.
348
IF(GROUPED_MC_GRID_STATUS.GE.1) THEN
349
CALL MAP_3_TO_1(ICONF,IPROC,IMIRROR,MAXSPROC,2,LMAPPED)
350
CALL DS_ADD_ENTRY('grouped_processes',LMAPPED,(DSIG/SELPROC(IMI
351
$ RROR,IPROC,ICONF)))
355
C Update summed weight and number of events
356
SUMWGT(IMIRROR,IPROC,ICONF)=SUMWGT(IMIRROR,IPROC,ICONF)
358
NUMEVTS(IMIRROR,IPROC,ICONF)=NUMEVTS(IMIRROR,IPROC,ICONF)+1
364
FUNCTION DSIGPROC(PP,ICONF,IPROC,IMIRROR,SYMCONF,CONFSUB,WGT
366
C ****************************************************
367
C RETURNS DIFFERENTIAL CROSS SECTION
370
C pp 4 momentum of external particles
371
C wgt weight from Monte Carlo
372
C imode 0 run, 1 init, 2 reweight, 3 finalize
374
C Amplitude squared and summed
375
C ****************************************************
380
INCLUDE 'maxconfigs.inc'
381
INCLUDE 'nexternal.inc'
382
INCLUDE 'maxamps.inc'
388
DOUBLE PRECISION DSIGPROC
389
DOUBLE PRECISION PP(0:3,NEXTERNAL), WGT
390
INTEGER ICONF,IPROC,IMIRROR,IMODE
391
INTEGER SYMCONF(0:LMAXCONFIGS)
392
INTEGER CONFSUB(MAXSPROC,LMAXCONFIGS)
396
C SUBDIAG is vector of diagram numbers for this config
397
C IB gives which beam is which (for mirror processes)
398
INTEGER SUBDIAG(MAXSPROC),IB(2)
399
COMMON/TO_SUB_DIAG/SUBDIAG,IB
400
C ICONFIG has this config number
401
INTEGER MAPCONFIG(0:LMAXCONFIGS), ICONFIG
402
COMMON/TO_MCONFIGS/MAPCONFIG, ICONFIG
403
C CM_RAP has parton-parton system rapidity
404
DOUBLE PRECISION CM_RAP
406
COMMON/TO_CM_RAP/SET_CM_RAP,CM_RAP
407
C To limit the number of calls to switchmom, use in DSIGPROC the
408
C cached variable last_iconfig. When set to -1, it ignores
409
C caching (to prevent undesired effect if this subroutine is
410
C called from elsewhere) and when set to 0, it resets the cache.
413
COMMON/TO_LAST_ICONF/LAST_ICONF
417
DOUBLE PRECISION DSIG1,DSIG2
422
DOUBLE PRECISION P1(0:3,NEXTERNAL),XDUM
423
INTEGER I,J,K,JC(NEXTERNAL)
424
INTEGER PERMS(NEXTERNAL,LMAXCONFIGS)
425
INCLUDE 'symperms.inc'
428
IF (LAST_ICONF.EQ.-1.OR.LAST_ICONF.NE.ICONF) THEN
430
ICONFIG=SYMCONF(ICONF)
432
SUBDIAG(I) = CONFSUB(I,SYMCONF(ICONF))
435
C Set momenta according to this permutation
436
CALL SWITCHMOM(PP,P1,PERMS(1,MAPCONFIG(ICONFIG)),JC,NEXTERNAL)
438
IF (LAST_ICONF.NE.-1) THEN
447
C Flip momenta (rotate around x axis)
455
C Flip x values (to get boost right)
459
C Flip CM_RAP (to get rapidity right)
465
IF (PASSCUTS(P1)) THEN
466
IF(IPROC.EQ.1) DSIGPROC=DSIG1(P1,WGT,IMODE) ! u u~ > u u~
467
IF(IPROC.EQ.2) DSIGPROC=DSIG2(P1,WGT,IMODE) ! u u~ > d d~
470
IF (LAST_ICONF.NE.-1.AND.IMIRROR.EQ.2) THEN
471
C Flip back local momenta P1 if cached
483
C -----------------------------------------
484
C Subroutine to map three positive integers
485
C I, J and K with upper bounds J_bound and
486
C K_bound to a one_dimensional
488
C -----------------------------------------
490
SUBROUTINE MAP_3_TO_1(I,J,K,J_BOUND,K_BOUND,L)
492
INTEGER, INTENT(IN) :: I,J,K,J_BOUND,K_BOUND
493
INTEGER, INTENT(OUT) :: L
495
L = I*(J_BOUND*(K_BOUND+1)+K_BOUND+1)+J*(K_BOUND+1)+K
497
END SUBROUTINE MAP_3_TO_1
499
C -----------------------------------------
500
C Subroutine to map back the positive
501
C integer L to the three integers
502
C I, J and K with upper bounds
503
C J_bound and K_bound.
504
C -----------------------------------------
506
SUBROUTINE MAP_1_TO_3(L,J_BOUND,K_BOUND,I,J,K)
508
INTEGER, INTENT(OUT) :: I,J,K
509
INTEGER, INTENT(IN) :: L, J_BOUND, K_BOUND
513
I = L_RUN/(J_BOUND*(K_BOUND+1)+K_BOUND+1)
514
L_RUN = L_RUN - I*((J_BOUND*(K_BOUND+1)+K_BOUND+1))
515
J = L_RUN/(K_BOUND+1)
516
L_RUN = L_RUN - J*(K_BOUND+1)
519
END SUBROUTINE MAP_1_TO_3
523
C Functionality to handling grid
526
SUBROUTINE WRITE_GOOD_HEL(STREAM_ID)
530
PARAMETER ( NCOMB=16)
531
LOGICAL GOODHEL(NCOMB, 2)
533
COMMON/BLOCK_GOODHEL/NTRY,GOODHEL
534
WRITE(STREAM_ID,*) GOODHEL
539
SUBROUTINE READ_GOOD_HEL(STREAM_ID)
544
PARAMETER ( NCOMB=16)
545
LOGICAL GOODHEL(NCOMB, 2)
547
COMMON/BLOCK_GOODHEL/NTRY,GOODHEL
548
READ(STREAM_ID,*) GOODHEL
549
NTRY(1) = MAXTRIES + 1
550
NTRY(2) = MAXTRIES + 1
554
SUBROUTINE INIT_GOOD_HEL()
557
PARAMETER ( NCOMB=16)
558
LOGICAL GOODHEL(NCOMB, 2)
563
GOODHEL(I,1) = .FALSE.
564
GOODHEL(I,2) = .FALSE.
570
INTEGER FUNCTION GET_MAXSPROC()
572
INCLUDE 'maxamps.inc'
574
GET_MAXSPROC = MAXSPROC