32
33
REAL*8 P(0:3,NEXTERNAL),ANS
35
c global (due to reading writting)
37
LOGICAL GOODHEL(NCOMB)
39
common/BLOCK_GOODHEL/NTRY,GOODHEL
36
INTEGER NHEL(NEXTERNAL,NCOMB),NTRY
43
INTEGER NHEL(NEXTERNAL,NCOMB)
37
44
REAL*8 T,MATRIX%(proc_id)s
38
45
REAL*8 R,SUMHEL,TS(NCOMB)
40
47
INTEGER IPROC,JC(NEXTERNAL),II
41
LOGICAL GOODHEL(NCOMB)
42
48
REAL*8 HWGT, XTOT, XTRY, XREJ, XR, YFRAC(0:NCOMB)
43
49
INTEGER IDUM, NGOOD, IGOOD(NCOMB), JHEL, J, JJ
59
65
LOGICAL MULTI_CHANNEL
60
66
COMMON/TO_MATRIX/ISUM_HEL, MULTI_CHANNEL
61
67
%(define_iconfigs_lines)s
63
69
DATA XTRY, XREJ, NGOOD /0,0,0/
64
70
SAVE YFRAC, IGOOD, JHEL
65
DATA GOODHEL/THEL*.FALSE./
67
72
%(den_factor_line)s
90
IF (ISUM_HEL .EQ. 0 .OR. NTRY .LE. MAXTRIES) THEN
96
! If the helicity grid status is 0, this means that it is not yet initialized.
97
IF (ISUM_HEL.EQ.0.or.(DS_get_dim_status('Helicity').eq.0)) THEN
92
IF (GOODHEL(I) .OR. NTRY .LE. MAXTRIES) THEN
99
IF (GOODHEL(I) .OR. NTRY .LE. MAXTRIES.OR.(ISUM_HEL.NE.0)) THEN
93
100
T=MATRIX%(proc_id)s(P ,NHEL(1,I),JC(1))
95
102
IF(POL(JJ).NE.1d0.AND.NHEL(JJ,I).EQ.INT(SIGN(1d0,POL(JJ)))) THEN
98
105
T=T*(2d0-ABS(POL(JJ)))
108
IF (ISUM_HEL.NE.0) then
109
call DS_add_entry('Helicity',I,T)
106
IF(NTRY.LE.MAXTRIES)THEN
108
IF (.NOT.GOODHEL(I) .AND. (TS(I).GT.ANS*LIMHEL/NCOMB)) THEN
112
print *,'Adding good helicity ',I,TS(I)/ANS
116
IF(NTRY.EQ.MAXTRIES)THEN
117
ISUM_HEL=MIN(ISUM_HEL,NGOOD)
115
IF(NTRY.EQ.(MAXTRIES+1)) THEN
116
call reset_cumulative_variable() ! avoid biais of the initialization
118
IF (ISUM_HEL.NE.0) then
119
! We set HEL_PICKED to -1 here so that later on, the call to DS_add_point in dsample.f does not add anything to the grid since it was already done here.
121
! For safety, hardset the helicity sampling jacobian to 0.0d0 to make sure it is not .
123
IF(DS_get_dim_status('Helicity').eq.1) then
124
! If we finished the initialization we can update the grid so as to start sampling over it.
125
! However the grid will now be filled by dsample with different kind of weights (including pdf, flux, etc...) so by setting the grid_mode of the reference grid to 'initialization' we make sure it will be overwritten (as opposed to 'combined') by the running grid at the next update.
126
CALL DS_UPDATE_GRID('Helicity')
127
CALL DS_SET_GRID_MODE('Helicity','init')
131
IF(NTRY.LE.MAXTRIES)THEN
133
IF (.NOT.GOODHEL(I) .AND. (TS(I).GT.ANS*LIMHEL/NCOMB)) THEN
137
print *,'Adding good helicity ',I,TS(I)/ANS
141
IF(NTRY.EQ.MAXTRIES)THEN
142
ISUM_HEL=MIN(ISUM_HEL,NGOOD)
119
145
ELSE !RANDOM HELICITY
122
IF (JHEL .GT. NGOOD) JHEL=1
123
HWGT = REAL(NGOOD)/REAL(ISUM_HEL)
125
T=MATRIX%(proc_id)s(P ,NHEL(1,I),JC(1))
147
C The helicity configuration was chosen already by genps and put in a common block defined in genps.inc.
150
T=MATRIX%(proc_id)s(P ,NHEL(1,I),JC(1))
126
151
DO JJ=1,nincoming
127
152
IF(POL(JJ).NE.1d0.AND.NHEL(JJ,I).EQ.INT(SIGN(1d0,POL(JJ)))) THEN
130
155
T=T*(2d0-ABS(POL(JJ)))
136
IF (ISUM_HEL .EQ. 1) THEN
137
WRITE(HEL_BUFF,'(20i5)')(NHEL(II,I),II=1,NEXTERNAL)
158
c Always one helicity at a time
160
c Include the Jacobian from helicity sampling
161
ANS = ANS * hel_jacobian
162
WRITE(HEL_BUFF,'(20i5)')(NHEL(II,I),II=1,NEXTERNAL)
140
IF (ISUM_HEL .NE. 1) THEN
164
IF (ISUM_HEL .NE. 1.or.(HEL_PICKED.eq.-1)) THEN
141
165
R=XRAN1(IDUM)*ANS
144
168
SUMHEL=SUMHEL+TS(I)
145
169
IF(R.LT.SUMHEL)THEN
146
170
WRITE(HEL_BUFF,'(20i5)')(NHEL(II,I),II=1,NEXTERNAL)