~maddevelopers/mg5amcnlo/2.9.4

« back to all changes in this revision

Viewing changes to tests/unit_tests/iolibs/test_export_fks.py

pass to v2.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
################################################################################
 
2
#
 
3
# Copyright (c) 2009 The MadGraph5_aMC@NLO Development team and Contributors
 
4
#
 
5
# This file is a part of the MadGraph5_aMC@NLO project, an application which 
 
6
# automatically generates Feynman diagrams and matrix elements for arbitrary
 
7
# high-energy processes in the Standard Model and beyond.
 
8
#
 
9
# It is subject to the MadGraph5_aMC@NLO license which should accompany this 
 
10
# distribution.
 
11
#
 
12
# For more information, visit madgraph.phys.ucl.ac.be and amcatnlo.web.cern.ch
 
13
#
 
14
################################################################################
 
15
 
 
16
"""Unit test library for the export_FKS format routines"""
 
17
 
 
18
import StringIO
 
19
import copy
 
20
import fractions
 
21
import os 
 
22
import sys
 
23
 
 
24
root_path = os.path.split(os.path.dirname(os.path.realpath( __file__ )))[0]
 
25
sys.path.append(os.path.join(root_path, os.path.pardir, os.path.pardir))
 
26
 
 
27
import tests.unit_tests as unittest
 
28
 
 
29
import madgraph.various.misc as misc
 
30
import madgraph.iolibs.export_fks as export_fks
 
31
import madgraph.fks.fks_base as fks_base
 
32
import madgraph.fks.fks_helas_objects as fks_helas
 
33
import madgraph.iolibs.file_writers as writers
 
34
import madgraph.iolibs.files as files
 
35
import madgraph.iolibs.group_subprocs as group_subprocs
 
36
import madgraph.iolibs.helas_call_writers as helas_call_writers
 
37
import madgraph.iolibs.save_load_object as save_load_object        
 
38
import madgraph.core.base_objects as MG
 
39
import madgraph.core.helas_objects as helas_objects
 
40
import madgraph.core.diagram_generation as diagram_generation
 
41
import madgraph.core.color_algebra as color
 
42
import madgraph.various.diagram_symmetry as diagram_symmetry
 
43
import madgraph.various.process_checks as process_checks
 
44
import madgraph.core.color_amp as color_amp
 
45
import tests.unit_tests.core.test_helas_objects as test_helas_objects
 
46
import tests.unit_tests.iolibs.test_file_writers as test_file_writers
 
47
import tests.unit_tests.iolibs.test_helas_call_writers as \
 
48
                                            test_helas_call_writers
 
49
import models.import_ufo as import_ufo
 
50
 
 
51
_file_path = os.path.dirname(os.path.realpath(__file__))
 
52
_input_file_path = os.path.join(_file_path, os.path.pardir, os.path.pardir,
 
53
                                'input_files')
 
54
#===============================================================================
 
55
# IOExportFKSTest
 
56
#===============================================================================
 
57
class IOExportFKSTest(unittest.TestCase,
 
58
                     test_file_writers.CheckFileCreate):
 
59
    """Test class for the export fks module"""
 
60
 
 
61
    def setUp(self):
 
62
        if not hasattr(self, 'myfks_me') or \
 
63
           not hasattr(self, 'myfortranmodel') or \
 
64
           not hasattr(self, 'myreals'):
 
65
 
 
66
            created_files = ['test']
 
67
 
 
68
            mymodel = import_ufo.import_model('sm')
 
69
            IOExportFKSTest.myfortranmodel = helas_call_writers.FortranUFOHelasCallWriter(mymodel)
 
70
 
 
71
            myleglist = MG.MultiLegList()
 
72
 
 
73
        # we test g g > t t~
 
74
            myleglist.append(MG.MultiLeg({'ids':[21], 'state':False}))
 
75
            myleglist.append(MG.MultiLeg({'ids':[21], 'state':False}))
 
76
            myleglist.append(MG.MultiLeg({'ids':[6], 'state':True}))
 
77
            myleglist.append(MG.MultiLeg({'ids':[-6], 'state':True}))
 
78
 
 
79
            myproc = MG.ProcessDefinition({'legs': myleglist,
 
80
                                 'model': mymodel,
 
81
                                 'orders':{'QCD': 2, 'QED': 0},
 
82
                                 'perturbation_couplings': ['QCD'],
 
83
                                 'NLO_mode': 'real'})
 
84
            my_process_definitions = MG.ProcessDefinitionList([myproc])
 
85
 
 
86
            myfksmulti = fks_base.FKSMultiProcess(\
 
87
                    {'process_definitions': my_process_definitions})
 
88
            
 
89
 
 
90
            fkshelasmulti = fks_helas.FKSHelasMultiProcess(myfksmulti)
 
91
            IOExportFKSTest.myfks_me = fkshelasmulti['matrix_elements'][0]
 
92
            IOExportFKSTest.myreals = fkshelasmulti['real_matrix_elements']
 
93
 
 
94
 
 
95
        tearDown = test_file_writers.CheckFileCreate.clean_files
 
96
 
 
97
 
 
98
    def test_write_maxconfigs(self):
 
99
        goal = \
 
100
"""      INTEGER LMAXCONFIGS
 
101
      PARAMETER (LMAXCONFIGS=22)"""
 
102
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
103
        process_exporter.write_maxconfigs_file(\
 
104
            writers.FortranWriter(self.give_pos('test')),\
 
105
            self.myreals)
 
106
        self.assertFileContains('test', goal)
 
107
 
 
108
 
 
109
    def test_write_mparticles(self):
 
110
        goal = \
 
111
"""      INTEGER MAX_PARTICLES, MAX_BRANCH
 
112
      PARAMETER (MAX_PARTICLES=5)
 
113
      PARAMETER (MAX_BRANCH=MAX_PARTICLES-1)"""
 
114
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
115
        process_exporter.write_maxparticles_file(\
 
116
            writers.FortranWriter(self.give_pos('test')),\
 
117
            self.myreals)
 
118
        self.assertFileContains('test', goal)
 
119
 
 
120
 
 
121
    def test_write_lh_order(self):
 
122
        """tests the correct writing of the B-LH order file"""
 
123
 
 
124
        goal = \
 
125
"""#OLE_order written by MadGraph5_aMC@NLO
 
126
 
 
127
MatrixElementSquareType CHaveraged
 
128
CorrectionType          QCD
 
129
IRregularisation        CDR
 
130
AlphasPower             2
 
131
AlphaPower              0
 
132
NJetSymmetrizeFinal     Yes
 
133
ModelFile               ./param_card.dat
 
134
Parameters              alpha_s
 
135
 
 
136
# process
 
137
21 21 -> 6 -6 
 
138
"""
 
139
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
140
        process_exporter.write_lh_order(\
 
141
            self.give_pos('test'),\
 
142
            self.myfks_me, 'MadLoop')
 
143
        self.assertFileContains('test', goal)
 
144
 
 
145
 
 
146
    def test_write_real_me_wrapper(self):
 
147
        """tests the correct writing of the real_me_chooser file, 
 
148
        that chooses among the different real emissions"""
 
149
 
 
150
        goal = \
 
151
"""      SUBROUTINE SMATRIX_REAL(P, WGT)
 
152
      IMPLICIT NONE
 
153
      INCLUDE 'nexternal.inc'
 
154
      DOUBLE PRECISION P(0:3, NEXTERNAL)
 
155
      DOUBLE PRECISION WGT
 
156
      INTEGER NFKSPROCESS
 
157
      COMMON/C_NFKSPROCESS/NFKSPROCESS
 
158
      REAL*4 TBEFORE, TAFTER
 
159
      REAL*4 TTOT, TOLP, TFASTJET, TPDF
 
160
      COMMON/TIMINGS/TTOT, TOLP, TFASTJET, TPDF
 
161
      CALL CPU_TIME(TBEFORE)
 
162
      IF (NFKSPROCESS.EQ.1) THEN
 
163
        CALL SMATRIX_1(P, WGT)
 
164
      ELSEIF (NFKSPROCESS.EQ.2) THEN
 
165
        CALL SMATRIX_1(P, WGT)
 
166
      ELSEIF (NFKSPROCESS.EQ.3) THEN
 
167
        CALL SMATRIX_1(P, WGT)
 
168
      ELSEIF (NFKSPROCESS.EQ.4) THEN
 
169
        CALL SMATRIX_1(P, WGT)
 
170
      ELSEIF (NFKSPROCESS.EQ.5) THEN
 
171
        CALL SMATRIX_2(P, WGT)
 
172
      ELSEIF (NFKSPROCESS.EQ.6) THEN
 
173
        CALL SMATRIX_3(P, WGT)
 
174
      ELSEIF (NFKSPROCESS.EQ.7) THEN
 
175
        CALL SMATRIX_4(P, WGT)
 
176
      ELSEIF (NFKSPROCESS.EQ.8) THEN
 
177
        CALL SMATRIX_5(P, WGT)
 
178
      ELSE
 
179
        WRITE(*,*) 'ERROR: invalid n in real_matrix :', NFKSPROCESS
 
180
        STOP
 
181
      ENDIF
 
182
      CALL CPU_TIME(TAFTER)
 
183
      TPDF = TPDF + (TAFTER-TBEFORE)
 
184
      RETURN
 
185
      END
 
186
 
 
187
"""
 
188
 
 
189
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
190
        process_exporter.write_real_me_wrapper(\
 
191
            writers.FortranWriter(self.give_pos('test')),
 
192
            self.myfks_me,
 
193
            self.myfortranmodel)
 
194
        self.assertFileContains('test', goal)
 
195
 
 
196
 
 
197
    def test_write_pdf_wrapper(self):
 
198
        """tests the correct writing of the parton_lum_chooser file, 
 
199
        that chooses thepdfs for the different real emissions"""
 
200
 
 
201
        goal = \
 
202
"""      DOUBLE PRECISION FUNCTION DLUM()
 
203
      IMPLICIT NONE
 
204
      INTEGER NFKSPROCESS
 
205
      COMMON/C_NFKSPROCESS/NFKSPROCESS
 
206
      IF (NFKSPROCESS.EQ.1) THEN
 
207
        CALL DLUM_1(DLUM)
 
208
      ELSEIF (NFKSPROCESS.EQ.2) THEN
 
209
        CALL DLUM_1(DLUM)
 
210
      ELSEIF (NFKSPROCESS.EQ.3) THEN
 
211
        CALL DLUM_1(DLUM)
 
212
      ELSEIF (NFKSPROCESS.EQ.4) THEN
 
213
        CALL DLUM_1(DLUM)
 
214
      ELSEIF (NFKSPROCESS.EQ.5) THEN
 
215
        CALL DLUM_2(DLUM)
 
216
      ELSEIF (NFKSPROCESS.EQ.6) THEN
 
217
        CALL DLUM_3(DLUM)
 
218
      ELSEIF (NFKSPROCESS.EQ.7) THEN
 
219
        CALL DLUM_4(DLUM)
 
220
      ELSEIF (NFKSPROCESS.EQ.8) THEN
 
221
        CALL DLUM_5(DLUM)
 
222
      ELSE
 
223
        WRITE(*,*) 'ERROR: invalid n in dlum :', NFKSPROCESS
 
224
        STOP
 
225
      ENDIF
 
226
 
 
227
      RETURN
 
228
      END
 
229
 
 
230
"""
 
231
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
232
        process_exporter.write_pdf_wrapper(\
 
233
            writers.FortranWriter(self.give_pos('test')),
 
234
            self.myfks_me,
 
235
            self.myfortranmodel)
 
236
        self.assertFileContains('test', goal)
 
237
 
 
238
 
 
239
    def test_write_leshouche_info_file(self):
 
240
        """tests the correct writing of fks_info.inc file, containing the 
 
241
        relevant informations for all the splittings"""
 
242
 
 
243
        goal = \
 
244
"""      INTEGER MAXPROC_USED, MAXFLOW_USED
 
245
      PARAMETER (MAXPROC_USED = 4)
 
246
      PARAMETER (MAXFLOW_USED = 6)
 
247
      INTEGER IDUP_D(8,5,MAXPROC_USED)
 
248
      INTEGER MOTHUP_D(8,2,5,MAXPROC_USED)
 
249
      INTEGER ICOLUP_D(8,2,5,MAXFLOW_USED)
 
250
      INTEGER ILH
 
251
 
 
252
      DATA (IDUP_D(1,ILH,1),ILH=1,5)/21,21,6,-6,21/
 
253
      DATA (MOTHUP_D(1,1,ILH,  1),ILH=1, 5)/  0,  0,  1,  1,  1/
 
254
      DATA (MOTHUP_D(1,2,ILH,  1),ILH=1, 5)/  0,  0,  2,  2,  2/
 
255
      DATA (ICOLUP_D(1,1,ILH,  1),ILH=1, 5)/501,502,501,  0,504/
 
256
      DATA (ICOLUP_D(1,2,ILH,  1),ILH=1, 5)/502,503,  0,504,503/
 
257
      DATA (ICOLUP_D(1,1,ILH,  2),ILH=1, 5)/501,504,501,  0,504/
 
258
      DATA (ICOLUP_D(1,2,ILH,  2),ILH=1, 5)/502,503,  0,503,502/
 
259
      DATA (ICOLUP_D(1,1,ILH,  3),ILH=1, 5)/503,501,501,  0,504/
 
260
      DATA (ICOLUP_D(1,2,ILH,  3),ILH=1, 5)/502,503,  0,504,502/
 
261
      DATA (ICOLUP_D(1,1,ILH,  4),ILH=1, 5)/504,501,501,  0,504/
 
262
      DATA (ICOLUP_D(1,2,ILH,  4),ILH=1, 5)/502,503,  0,502,503/
 
263
      DATA (ICOLUP_D(1,1,ILH,  5),ILH=1, 5)/504,502,501,  0,504/
 
264
      DATA (ICOLUP_D(1,2,ILH,  5),ILH=1, 5)/502,503,  0,503,501/
 
265
      DATA (ICOLUP_D(1,1,ILH,  6),ILH=1, 5)/503,504,501,  0,504/
 
266
      DATA (ICOLUP_D(1,2,ILH,  6),ILH=1, 5)/502,503,  0,502,501/
 
267
 
 
268
      DATA (IDUP_D(2,ILH,1),ILH=1,5)/21,21,6,-6,21/
 
269
      DATA (MOTHUP_D(2,1,ILH,  1),ILH=1, 5)/  0,  0,  1,  1,  1/
 
270
      DATA (MOTHUP_D(2,2,ILH,  1),ILH=1, 5)/  0,  0,  2,  2,  2/
 
271
      DATA (ICOLUP_D(2,1,ILH,  1),ILH=1, 5)/501,502,501,  0,504/
 
272
      DATA (ICOLUP_D(2,2,ILH,  1),ILH=1, 5)/502,503,  0,504,503/
 
273
      DATA (ICOLUP_D(2,1,ILH,  2),ILH=1, 5)/501,504,501,  0,504/
 
274
      DATA (ICOLUP_D(2,2,ILH,  2),ILH=1, 5)/502,503,  0,503,502/
 
275
      DATA (ICOLUP_D(2,1,ILH,  3),ILH=1, 5)/503,501,501,  0,504/
 
276
      DATA (ICOLUP_D(2,2,ILH,  3),ILH=1, 5)/502,503,  0,504,502/
 
277
      DATA (ICOLUP_D(2,1,ILH,  4),ILH=1, 5)/504,501,501,  0,504/
 
278
      DATA (ICOLUP_D(2,2,ILH,  4),ILH=1, 5)/502,503,  0,502,503/
 
279
      DATA (ICOLUP_D(2,1,ILH,  5),ILH=1, 5)/504,502,501,  0,504/
 
280
      DATA (ICOLUP_D(2,2,ILH,  5),ILH=1, 5)/502,503,  0,503,501/
 
281
      DATA (ICOLUP_D(2,1,ILH,  6),ILH=1, 5)/503,504,501,  0,504/
 
282
      DATA (ICOLUP_D(2,2,ILH,  6),ILH=1, 5)/502,503,  0,502,501/
 
283
 
 
284
      DATA (IDUP_D(3,ILH,1),ILH=1,5)/21,21,6,-6,21/
 
285
      DATA (MOTHUP_D(3,1,ILH,  1),ILH=1, 5)/  0,  0,  1,  1,  1/
 
286
      DATA (MOTHUP_D(3,2,ILH,  1),ILH=1, 5)/  0,  0,  2,  2,  2/
 
287
      DATA (ICOLUP_D(3,1,ILH,  1),ILH=1, 5)/501,502,501,  0,504/
 
288
      DATA (ICOLUP_D(3,2,ILH,  1),ILH=1, 5)/502,503,  0,504,503/
 
289
      DATA (ICOLUP_D(3,1,ILH,  2),ILH=1, 5)/501,504,501,  0,504/
 
290
      DATA (ICOLUP_D(3,2,ILH,  2),ILH=1, 5)/502,503,  0,503,502/
 
291
      DATA (ICOLUP_D(3,1,ILH,  3),ILH=1, 5)/503,501,501,  0,504/
 
292
      DATA (ICOLUP_D(3,2,ILH,  3),ILH=1, 5)/502,503,  0,504,502/
 
293
      DATA (ICOLUP_D(3,1,ILH,  4),ILH=1, 5)/504,501,501,  0,504/
 
294
      DATA (ICOLUP_D(3,2,ILH,  4),ILH=1, 5)/502,503,  0,502,503/
 
295
      DATA (ICOLUP_D(3,1,ILH,  5),ILH=1, 5)/504,502,501,  0,504/
 
296
      DATA (ICOLUP_D(3,2,ILH,  5),ILH=1, 5)/502,503,  0,503,501/
 
297
      DATA (ICOLUP_D(3,1,ILH,  6),ILH=1, 5)/503,504,501,  0,504/
 
298
      DATA (ICOLUP_D(3,2,ILH,  6),ILH=1, 5)/502,503,  0,502,501/
 
299
 
 
300
      DATA (IDUP_D(4,ILH,1),ILH=1,5)/21,21,6,-6,21/
 
301
      DATA (MOTHUP_D(4,1,ILH,  1),ILH=1, 5)/  0,  0,  1,  1,  1/
 
302
      DATA (MOTHUP_D(4,2,ILH,  1),ILH=1, 5)/  0,  0,  2,  2,  2/
 
303
      DATA (ICOLUP_D(4,1,ILH,  1),ILH=1, 5)/501,502,501,  0,504/
 
304
      DATA (ICOLUP_D(4,2,ILH,  1),ILH=1, 5)/502,503,  0,504,503/
 
305
      DATA (ICOLUP_D(4,1,ILH,  2),ILH=1, 5)/501,504,501,  0,504/
 
306
      DATA (ICOLUP_D(4,2,ILH,  2),ILH=1, 5)/502,503,  0,503,502/
 
307
      DATA (ICOLUP_D(4,1,ILH,  3),ILH=1, 5)/503,501,501,  0,504/
 
308
      DATA (ICOLUP_D(4,2,ILH,  3),ILH=1, 5)/502,503,  0,504,502/
 
309
      DATA (ICOLUP_D(4,1,ILH,  4),ILH=1, 5)/504,501,501,  0,504/
 
310
      DATA (ICOLUP_D(4,2,ILH,  4),ILH=1, 5)/502,503,  0,502,503/
 
311
      DATA (ICOLUP_D(4,1,ILH,  5),ILH=1, 5)/504,502,501,  0,504/
 
312
      DATA (ICOLUP_D(4,2,ILH,  5),ILH=1, 5)/502,503,  0,503,501/
 
313
      DATA (ICOLUP_D(4,1,ILH,  6),ILH=1, 5)/503,504,501,  0,504/
 
314
      DATA (ICOLUP_D(4,2,ILH,  6),ILH=1, 5)/502,503,  0,502,501/
 
315
 
 
316
      DATA (IDUP_D(5,ILH,1),ILH=1,5)/-1,21,6,-6,-1/
 
317
      DATA (MOTHUP_D(5,1,ILH,  1),ILH=1, 5)/  0,  0,  1,  1,  1/
 
318
      DATA (MOTHUP_D(5,2,ILH,  1),ILH=1, 5)/  0,  0,  2,  2,  2/
 
319
      DATA (ICOLUP_D(5,1,ILH,  1),ILH=1, 5)/  0,502,502,  0,  0/
 
320
      DATA (ICOLUP_D(5,2,ILH,  1),ILH=1, 5)/501,503,  0,501,503/
 
321
      DATA (ICOLUP_D(5,1,ILH,  2),ILH=1, 5)/  0,502,502,  0,  0/
 
322
      DATA (ICOLUP_D(5,2,ILH,  2),ILH=1, 5)/501,503,  0,503,501/
 
323
      DATA (ICOLUP_D(5,1,ILH,  3),ILH=1, 5)/  0,501,502,  0,  0/
 
324
      DATA (ICOLUP_D(5,2,ILH,  3),ILH=1, 5)/501,503,  0,503,502/
 
325
      DATA (ICOLUP_D(5,1,ILH,  4),ILH=1, 5)/  0,501,502,  0,  0/
 
326
      DATA (ICOLUP_D(5,2,ILH,  4),ILH=1, 5)/501,503,  0,502,503/
 
327
      DATA (IDUP_D(5,ILH,2),ILH=1,5)/-3,21,6,-6,-3/
 
328
      DATA (MOTHUP_D(5,1,ILH,  2),ILH=1, 5)/  0,  0,  1,  1,  1/
 
329
      DATA (MOTHUP_D(5,2,ILH,  2),ILH=1, 5)/  0,  0,  2,  2,  2/
 
330
      DATA (IDUP_D(5,ILH,3),ILH=1,5)/-2,21,6,-6,-2/
 
331
      DATA (MOTHUP_D(5,1,ILH,  3),ILH=1, 5)/  0,  0,  1,  1,  1/
 
332
      DATA (MOTHUP_D(5,2,ILH,  3),ILH=1, 5)/  0,  0,  2,  2,  2/
 
333
      DATA (IDUP_D(5,ILH,4),ILH=1,5)/-4,21,6,-6,-4/
 
334
      DATA (MOTHUP_D(5,1,ILH,  4),ILH=1, 5)/  0,  0,  1,  1,  1/
 
335
      DATA (MOTHUP_D(5,2,ILH,  4),ILH=1, 5)/  0,  0,  2,  2,  2/
 
336
 
 
337
      DATA (IDUP_D(6,ILH,1),ILH=1,5)/1,21,6,-6,1/
 
338
      DATA (MOTHUP_D(6,1,ILH,  1),ILH=1, 5)/  0,  0,  1,  1,  1/
 
339
      DATA (MOTHUP_D(6,2,ILH,  1),ILH=1, 5)/  0,  0,  2,  2,  2/
 
340
      DATA (ICOLUP_D(6,1,ILH,  1),ILH=1, 5)/503,501,501,  0,502/
 
341
      DATA (ICOLUP_D(6,2,ILH,  1),ILH=1, 5)/  0,503,  0,502,  0/
 
342
      DATA (ICOLUP_D(6,1,ILH,  2),ILH=1, 5)/502,501,501,  0,502/
 
343
      DATA (ICOLUP_D(6,2,ILH,  2),ILH=1, 5)/  0,503,  0,503,  0/
 
344
      DATA (ICOLUP_D(6,1,ILH,  3),ILH=1, 5)/503,502,501,  0,502/
 
345
      DATA (ICOLUP_D(6,2,ILH,  3),ILH=1, 5)/  0,503,  0,501,  0/
 
346
      DATA (ICOLUP_D(6,1,ILH,  4),ILH=1, 5)/501,502,501,  0,502/
 
347
      DATA (ICOLUP_D(6,2,ILH,  4),ILH=1, 5)/  0,503,  0,503,  0/
 
348
      DATA (IDUP_D(6,ILH,2),ILH=1,5)/3,21,6,-6,3/
 
349
      DATA (MOTHUP_D(6,1,ILH,  2),ILH=1, 5)/  0,  0,  1,  1,  1/
 
350
      DATA (MOTHUP_D(6,2,ILH,  2),ILH=1, 5)/  0,  0,  2,  2,  2/
 
351
      DATA (IDUP_D(6,ILH,3),ILH=1,5)/2,21,6,-6,2/
 
352
      DATA (MOTHUP_D(6,1,ILH,  3),ILH=1, 5)/  0,  0,  1,  1,  1/
 
353
      DATA (MOTHUP_D(6,2,ILH,  3),ILH=1, 5)/  0,  0,  2,  2,  2/
 
354
      DATA (IDUP_D(6,ILH,4),ILH=1,5)/4,21,6,-6,4/
 
355
      DATA (MOTHUP_D(6,1,ILH,  4),ILH=1, 5)/  0,  0,  1,  1,  1/
 
356
      DATA (MOTHUP_D(6,2,ILH,  4),ILH=1, 5)/  0,  0,  2,  2,  2/
 
357
 
 
358
      DATA (IDUP_D(7,ILH,1),ILH=1,5)/21,-1,6,-6,-1/
 
359
      DATA (MOTHUP_D(7,1,ILH,  1),ILH=1, 5)/  0,  0,  1,  1,  1/
 
360
      DATA (MOTHUP_D(7,2,ILH,  1),ILH=1, 5)/  0,  0,  2,  2,  2/
 
361
      DATA (ICOLUP_D(7,1,ILH,  1),ILH=1, 5)/501,  0,502,  0,  0/
 
362
      DATA (ICOLUP_D(7,2,ILH,  1),ILH=1, 5)/503,501,  0,503,502/
 
363
      DATA (ICOLUP_D(7,1,ILH,  2),ILH=1, 5)/501,  0,502,  0,  0/
 
364
      DATA (ICOLUP_D(7,2,ILH,  2),ILH=1, 5)/503,501,  0,502,503/
 
365
      DATA (ICOLUP_D(7,1,ILH,  3),ILH=1, 5)/502,  0,502,  0,  0/
 
366
      DATA (ICOLUP_D(7,2,ILH,  3),ILH=1, 5)/503,501,  0,503,501/
 
367
      DATA (ICOLUP_D(7,1,ILH,  4),ILH=1, 5)/502,  0,502,  0,  0/
 
368
      DATA (ICOLUP_D(7,2,ILH,  4),ILH=1, 5)/503,501,  0,501,503/
 
369
      DATA (IDUP_D(7,ILH,2),ILH=1,5)/21,-3,6,-6,-3/
 
370
      DATA (MOTHUP_D(7,1,ILH,  2),ILH=1, 5)/  0,  0,  1,  1,  1/
 
371
      DATA (MOTHUP_D(7,2,ILH,  2),ILH=1, 5)/  0,  0,  2,  2,  2/
 
372
      DATA (IDUP_D(7,ILH,3),ILH=1,5)/21,-2,6,-6,-2/
 
373
      DATA (MOTHUP_D(7,1,ILH,  3),ILH=1, 5)/  0,  0,  1,  1,  1/
 
374
      DATA (MOTHUP_D(7,2,ILH,  3),ILH=1, 5)/  0,  0,  2,  2,  2/
 
375
      DATA (IDUP_D(7,ILH,4),ILH=1,5)/21,-4,6,-6,-4/
 
376
      DATA (MOTHUP_D(7,1,ILH,  4),ILH=1, 5)/  0,  0,  1,  1,  1/
 
377
      DATA (MOTHUP_D(7,2,ILH,  4),ILH=1, 5)/  0,  0,  2,  2,  2/
 
378
 
 
379
      DATA (IDUP_D(8,ILH,1),ILH=1,5)/21,1,6,-6,1/
 
380
      DATA (MOTHUP_D(8,1,ILH,  1),ILH=1, 5)/  0,  0,  1,  1,  1/
 
381
      DATA (MOTHUP_D(8,2,ILH,  1),ILH=1, 5)/  0,  0,  2,  2,  2/
 
382
      DATA (ICOLUP_D(8,1,ILH,  1),ILH=1, 5)/501,503,501,  0,502/
 
383
      DATA (ICOLUP_D(8,2,ILH,  1),ILH=1, 5)/503,  0,  0,502,  0/
 
384
      DATA (ICOLUP_D(8,1,ILH,  2),ILH=1, 5)/501,502,501,  0,502/
 
385
      DATA (ICOLUP_D(8,2,ILH,  2),ILH=1, 5)/503,  0,  0,503,  0/
 
386
      DATA (ICOLUP_D(8,1,ILH,  3),ILH=1, 5)/502,503,501,  0,502/
 
387
      DATA (ICOLUP_D(8,2,ILH,  3),ILH=1, 5)/503,  0,  0,501,  0/
 
388
      DATA (ICOLUP_D(8,1,ILH,  4),ILH=1, 5)/502,501,501,  0,502/
 
389
      DATA (ICOLUP_D(8,2,ILH,  4),ILH=1, 5)/503,  0,  0,503,  0/
 
390
      DATA (IDUP_D(8,ILH,2),ILH=1,5)/21,3,6,-6,3/
 
391
      DATA (MOTHUP_D(8,1,ILH,  2),ILH=1, 5)/  0,  0,  1,  1,  1/
 
392
      DATA (MOTHUP_D(8,2,ILH,  2),ILH=1, 5)/  0,  0,  2,  2,  2/
 
393
      DATA (IDUP_D(8,ILH,3),ILH=1,5)/21,2,6,-6,2/
 
394
      DATA (MOTHUP_D(8,1,ILH,  3),ILH=1, 5)/  0,  0,  1,  1,  1/
 
395
      DATA (MOTHUP_D(8,2,ILH,  3),ILH=1, 5)/  0,  0,  2,  2,  2/
 
396
      DATA (IDUP_D(8,ILH,4),ILH=1,5)/21,4,6,-6,4/
 
397
      DATA (MOTHUP_D(8,1,ILH,  4),ILH=1, 5)/  0,  0,  1,  1,  1/
 
398
      DATA (MOTHUP_D(8,2,ILH,  4),ILH=1, 5)/  0,  0,  2,  2,  2/
 
399
 
 
400
"""
 
401
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
402
        process_exporter.write_leshouche_info_file(\
 
403
            writers.FortranWriter(self.give_pos('test')),
 
404
            self.myfks_me,
 
405
            self.myfortranmodel)
 
406
        self.assertFileContains('test', goal)
 
407
 
 
408
 
 
409
    def test_write_fks_info_file(self):
 
410
        """tests the correct writing of fks_info.inc file, containing the 
 
411
        relevant informations for all the splittings"""
 
412
 
 
413
        goal = \
 
414
"""      INTEGER IPOS, JPOS
 
415
      INTEGER FKS_I_D(8), FKS_J_D(8)
 
416
      INTEGER FKS_J_FROM_I_D(8, NEXTERNAL, 0:NEXTERNAL)
 
417
      INTEGER PARTICLE_TYPE_D(8, NEXTERNAL), PDG_TYPE_D(8, NEXTERNAL)
 
418
 
 
419
      DATA FKS_I_D / 5, 5, 5, 5, 5, 5, 5, 5 /
 
420
      DATA FKS_J_D / 1, 2, 3, 4, 1, 1, 2, 2 /
 
421
 
 
422
      DATA (FKS_J_FROM_I_D(1, 5, JPOS), JPOS = 0, 4)  / 4, 1, 2, 3, 4 /
 
423
 
 
424
      DATA (FKS_J_FROM_I_D(2, 5, JPOS), JPOS = 0, 4)  / 4, 1, 2, 3, 4 /
 
425
 
 
426
      DATA (FKS_J_FROM_I_D(3, 5, JPOS), JPOS = 0, 4)  / 4, 1, 2, 3, 4 /
 
427
 
 
428
      DATA (FKS_J_FROM_I_D(4, 5, JPOS), JPOS = 0, 4)  / 4, 1, 2, 3, 4 /
 
429
 
 
430
      DATA (FKS_J_FROM_I_D(5, 5, JPOS), JPOS = 0, 1)  / 1, 1 /
 
431
 
 
432
      DATA (FKS_J_FROM_I_D(6, 5, JPOS), JPOS = 0, 1)  / 1, 1 /
 
433
 
 
434
      DATA (FKS_J_FROM_I_D(7, 5, JPOS), JPOS = 0, 1)  / 1, 2 /
 
435
 
 
436
      DATA (FKS_J_FROM_I_D(8, 5, JPOS), JPOS = 0, 1)  / 1, 2 /
 
437
 
 
438
 
 
439
C     
 
440
C     Particle type:
 
441
C     octet = 8, triplet = 3, singlet = 1
 
442
      DATA (PARTICLE_TYPE_D(1, IPOS), IPOS=1, NEXTERNAL) / 8, 8, 3, 
 
443
     $ -3, 8 /
 
444
      DATA (PARTICLE_TYPE_D(2, IPOS), IPOS=1, NEXTERNAL) / 8, 8, 3, 
 
445
     $ -3, 8 /
 
446
      DATA (PARTICLE_TYPE_D(3, IPOS), IPOS=1, NEXTERNAL) / 8, 8, 3, 
 
447
     $ -3, 8 /
 
448
      DATA (PARTICLE_TYPE_D(4, IPOS), IPOS=1, NEXTERNAL) / 8, 8, 3, 
 
449
     $ -3, 8 /
 
450
      DATA (PARTICLE_TYPE_D(5, IPOS), IPOS=1, NEXTERNAL) / -3, 8, 3, 
 
451
     $ -3, -3 /
 
452
      DATA (PARTICLE_TYPE_D(6, IPOS), IPOS=1, NEXTERNAL) / 3, 8, 3, 
 
453
     $ -3, 3 /
 
454
      DATA (PARTICLE_TYPE_D(7, IPOS), IPOS=1, NEXTERNAL) / 8, -3, 3, 
 
455
     $ -3, -3 /
 
456
      DATA (PARTICLE_TYPE_D(8, IPOS), IPOS=1, NEXTERNAL) / 8, 3, 3, 
 
457
     $ -3, 3 /
 
458
 
 
459
C     
 
460
C     Particle type according to PDG:
 
461
C     
 
462
      DATA (PDG_TYPE_D(1, IPOS), IPOS=1, NEXTERNAL) / 21, 21, 6, 
 
463
     $ -6, 21 /
 
464
      DATA (PDG_TYPE_D(2, IPOS), IPOS=1, NEXTERNAL) / 21, 21, 6, 
 
465
     $ -6, 21 /
 
466
      DATA (PDG_TYPE_D(3, IPOS), IPOS=1, NEXTERNAL) / 21, 21, 6, 
 
467
     $ -6, 21 /
 
468
      DATA (PDG_TYPE_D(4, IPOS), IPOS=1, NEXTERNAL) / 21, 21, 6, 
 
469
     $ -6, 21 /
 
470
      DATA (PDG_TYPE_D(5, IPOS), IPOS=1, NEXTERNAL) / -1, 21, 6, -6, 
 
471
     $ -1 /
 
472
      DATA (PDG_TYPE_D(6, IPOS), IPOS=1, NEXTERNAL) / 1, 21, 6, -6, 1 /
 
473
      DATA (PDG_TYPE_D(7, IPOS), IPOS=1, NEXTERNAL) / 21, -1, 6, -6, 
 
474
     $ -1 /
 
475
      DATA (PDG_TYPE_D(8, IPOS), IPOS=1, NEXTERNAL) / 21, 1, 6, -6, 1 /
 
476
 
 
477
 
 
478
"""
 
479
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
480
        process_exporter.write_fks_info_file(\
 
481
            writers.FortranWriter(self.give_pos('test')),
 
482
            self.myfks_me,
 
483
            self.myfortranmodel)
 
484
        self.assertFileContains('test', goal)
 
485
 
 
486
 
 
487
    def test_write_sborn_sf(self):
 
488
        """Tests the correct writing of the sborn_sf file, containing the calls 
 
489
        to the different color linked borns."""
 
490
        
 
491
        goal = \
 
492
"""      SUBROUTINE SBORN_SF(P_BORN,M,N,WGT)
 
493
      IMPLICIT NONE
 
494
      INCLUDE 'nexternal.inc'
 
495
      DOUBLE PRECISION P_BORN(0:3,NEXTERNAL-1),WGT
 
496
      DOUBLE COMPLEX WGT1(2)
 
497
      INTEGER M,N
 
498
 
 
499
C     b_sf_001 links partons 1 and 2 
 
500
      IF ((M.EQ.1 .AND. N.EQ.2).OR.(M.EQ.2 .AND. N.EQ.1)) THEN
 
501
        CALL SB_SF_001(P_BORN,WGT)
 
502
 
 
503
C       b_sf_002 links partons 1 and 3 
 
504
      ELSEIF ((M.EQ.1 .AND. N.EQ.3).OR.(M.EQ.3 .AND. N.EQ.1)) THEN
 
505
        CALL SB_SF_002(P_BORN,WGT)
 
506
 
 
507
C       b_sf_003 links partons 1 and 4 
 
508
      ELSEIF ((M.EQ.1 .AND. N.EQ.4).OR.(M.EQ.4 .AND. N.EQ.1)) THEN
 
509
        CALL SB_SF_003(P_BORN,WGT)
 
510
 
 
511
C       b_sf_004 links partons 2 and 3 
 
512
      ELSEIF ((M.EQ.2 .AND. N.EQ.3).OR.(M.EQ.3 .AND. N.EQ.2)) THEN
 
513
        CALL SB_SF_004(P_BORN,WGT)
 
514
 
 
515
C       b_sf_005 links partons 2 and 4 
 
516
      ELSEIF ((M.EQ.2 .AND. N.EQ.4).OR.(M.EQ.4 .AND. N.EQ.2)) THEN
 
517
        CALL SB_SF_005(P_BORN,WGT)
 
518
 
 
519
C       b_sf_006 links partons 3 and 3 
 
520
      ELSEIF (M.EQ.3 .AND. N.EQ.3) THEN
 
521
        CALL SB_SF_006(P_BORN,WGT)
 
522
 
 
523
C       b_sf_007 links partons 3 and 4 
 
524
      ELSEIF ((M.EQ.3 .AND. N.EQ.4).OR.(M.EQ.4 .AND. N.EQ.3)) THEN
 
525
        CALL SB_SF_007(P_BORN,WGT)
 
526
 
 
527
C       b_sf_008 links partons 4 and 4 
 
528
      ELSEIF (M.EQ.4 .AND. N.EQ.4) THEN
 
529
        CALL SB_SF_008(P_BORN,WGT)
 
530
 
 
531
      ELSE
 
532
        WGT = 0D0
 
533
      ENDIF
 
534
 
 
535
      RETURN
 
536
      END
 
537
"""
 
538
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
539
 
 
540
        process_exporter.write_sborn_sf(\
 
541
            writers.FortranWriter(self.give_pos('test')),
 
542
            self.myfks_me.color_links,
 
543
            self.myfortranmodel)
 
544
 
 
545
        #print open(self.give_pos('test')).read()
 
546
        self.assertFileContains('test', goal)
 
547
 
 
548
 
 
549
    def test_write_leshouche_file(self):
 
550
        """tests if the leshouche.inc file is correctly written for the born process
 
551
        """
 
552
        goal = \
 
553
"""      DATA (IDUP(I,1),I=1,4)/21,21,6,-6/
 
554
      DATA (MOTHUP(1,I,  1),I=1, 4)/  0,  0,  1,  1/
 
555
      DATA (MOTHUP(2,I,  1),I=1, 4)/  0,  0,  2,  2/
 
556
      DATA (ICOLUP(1,I,  1),I=1, 4)/501,502,501,  0/
 
557
      DATA (ICOLUP(2,I,  1),I=1, 4)/502,503,  0,503/
 
558
      DATA (ICOLUP(1,I,  2),I=1, 4)/503,501,501,  0/
 
559
      DATA (ICOLUP(2,I,  2),I=1, 4)/502,503,  0,502/
 
560
"""    
 
561
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
562
 
 
563
        nflows = \
 
564
            process_exporter.write_leshouche_file(
 
565
                    writers.FortranWriter(self.give_pos('test')),
 
566
                    self.myfks_me.born_matrix_element,
 
567
                    self.myfortranmodel)  
 
568
 
 
569
        self.assertFileContains('test', goal) 
 
570
 
 
571
 
 
572
    def test_write_nexternal_file(self):
 
573
        """tests if the nexternal.inc file is correctly written.
 
574
        The real process used is uux_uxug (real_processes[5])
 
575
        """
 
576
        goal = \
 
577
"""      INTEGER    NEXTERNAL
 
578
      PARAMETER (NEXTERNAL=5)
 
579
      INTEGER    NINCOMING
 
580
      PARAMETER (NINCOMING=2)
 
581
"""
 
582
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
583
        
 
584
        process_exporter.write_nexternal_file(
 
585
                    writers.FortranWriter(self.give_pos('test')),
 
586
                    5, 2)        
 
587
 
 
588
        self.assertFileContains('test', goal)  
 
589
 
 
590
 
 
591
    def test_write_pmass_file(self):
 
592
        """tests if the pmass.inc file is correctly written.
 
593
        The function called is the one of the FortranProcessExporterV4 class.
 
594
        """
 
595
        goal = \
 
596
"""      PMASS(1)=ZERO
 
597
      PMASS(2)=ZERO
 
598
      PMASS(3)=ABS(MT)
 
599
      PMASS(4)=ABS(MT)
 
600
      PMASS(5)=ZERO
 
601
"""
 
602
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
603
        
 
604
        process_exporter.write_pmass_file(
 
605
                    writers.FortranWriter(self.give_pos('test')),
 
606
                    self.myfks_me.real_processes[0].matrix_element)        
 
607
 
 
608
        self.assertFileContains('test', goal) 
 
609
 
 
610
 
 
611
    def test_write_pdf_file(self):
 
612
        """tests if the parton_lum_x.f file containing the parton distributions 
 
613
        for a given real process is correctly written.
 
614
        The real process tested is gg > ttxg (real_processes[0])
 
615
        """
 
616
        goal = \
 
617
"""      SUBROUTINE DLUM_1(LUM)
 
618
C     ****************************************************            
 
619
C         
 
620
C     Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
 
621
C     By the MadGraph5_aMC@NLO Development Team
 
622
C     Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
 
623
C     RETURNS PARTON LUMINOSITIES FOR MADFKS                          
 
624
C        
 
625
C     
 
626
C     Process: g g > t t~ g WEIGHTED=3 QED=0 QCD=3 [ QCD ]
 
627
C     
 
628
C     ****************************************************            
 
629
C         
 
630
      IMPLICIT NONE
 
631
C     
 
632
C     CONSTANTS                                                       
 
633
C         
 
634
C     
 
635
      INCLUDE 'genps.inc'
 
636
      INCLUDE 'nexternal.inc'
 
637
      DOUBLE PRECISION       CONV
 
638
      PARAMETER (CONV=389379660D0)  !CONV TO PICOBARNS             
 
639
C     
 
640
C     ARGUMENTS                                                       
 
641
C         
 
642
C     
 
643
      DOUBLE PRECISION PP(0:3,NEXTERNAL), LUM
 
644
C     
 
645
C     LOCAL VARIABLES                                                 
 
646
C         
 
647
C     
 
648
      INTEGER I, ICROSS,ITYPE,LP
 
649
      DOUBLE PRECISION P1(0:3,NEXTERNAL)
 
650
      DOUBLE PRECISION G1
 
651
      DOUBLE PRECISION G2
 
652
      DOUBLE PRECISION XPQ(-7:7)
 
653
C     
 
654
C     EXTERNAL FUNCTIONS                                              
 
655
C         
 
656
C     
 
657
      DOUBLE PRECISION ALPHAS2,REWGT,PDG2PDF
 
658
C     
 
659
C     GLOBAL VARIABLES                                                
 
660
C         
 
661
C     
 
662
      INTEGER              IPROC
 
663
      DOUBLE PRECISION PD(0:MAXPROC)
 
664
      COMMON /SUBPROC/ PD, IPROC
 
665
      INCLUDE 'coupl.inc'
 
666
      INCLUDE 'run.inc'
 
667
      INTEGER IMIRROR
 
668
      COMMON/CMIRROR/IMIRROR
 
669
C     
 
670
C     DATA                                                            
 
671
C         
 
672
C     
 
673
      DATA G1/1*1D0/
 
674
      DATA G2/1*1D0/
 
675
      DATA ICROSS/1/
 
676
C     ----------                                                      
 
677
C         
 
678
C     BEGIN CODE                                                      
 
679
C         
 
680
C     ----------                                                      
 
681
C         
 
682
      LUM = 0D0
 
683
      IF (IMIRROR.EQ.2) THEN
 
684
        IF (ABS(LPP(2)) .GE. 1) THEN
 
685
          LP=SIGN(1,LPP(2))
 
686
          G1=PDG2PDF(ABS(LPP(2)),0*LP,XBK(2),DSQRT(Q2FACT(2)))
 
687
        ENDIF
 
688
        IF (ABS(LPP(1)) .GE. 1) THEN
 
689
          LP=SIGN(1,LPP(1))
 
690
          G2=PDG2PDF(ABS(LPP(1)),0*LP,XBK(1),DSQRT(Q2FACT(1)))
 
691
        ENDIF
 
692
        PD(0) = 0D0
 
693
        IPROC = 0
 
694
        IPROC=IPROC+1  ! g g > t t~ g
 
695
        PD(IPROC) = G1*G2
 
696
      ELSE
 
697
        IF (ABS(LPP(1)) .GE. 1) THEN
 
698
          LP=SIGN(1,LPP(1))
 
699
          G1=PDG2PDF(ABS(LPP(1)),0*LP,XBK(1),DSQRT(Q2FACT(1)))
 
700
        ENDIF
 
701
        IF (ABS(LPP(2)) .GE. 1) THEN
 
702
          LP=SIGN(1,LPP(2))
 
703
          G2=PDG2PDF(ABS(LPP(2)),0*LP,XBK(2),DSQRT(Q2FACT(2)))
 
704
        ENDIF
 
705
        PD(0) = 0D0
 
706
        IPROC = 0
 
707
        IPROC=IPROC+1  ! g g > t t~ g
 
708
        PD(IPROC) = G1*G2
 
709
      ENDIF
 
710
      DO I=1,IPROC
 
711
        LUM = LUM + PD(I) * CONV
 
712
      ENDDO
 
713
      RETURN
 
714
      END
 
715
 
 
716
""" % misc.get_pkg_info()
 
717
 
 
718
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
719
 
 
720
        nflows = \
 
721
            process_exporter.write_pdf_file(
 
722
                    writers.FortranWriter(self.give_pos('test')),
 
723
                    self.myfks_me.real_processes[0].matrix_element, 1,
 
724
                    self.myfortranmodel)  
 
725
 
 
726
        self.assertFileContains('test', goal) 
 
727
 
 
728
 
 
729
    def test_write_matrix_element_fks(self):
 
730
        """tests if the matrix_x.f file containing the matrix element 
 
731
        for a given real process is correctly written.
 
732
        The real process tested is gg > ttxg (real_processes[0])
 
733
        """
 
734
        goal = \
 
735
"""      SUBROUTINE SMATRIX_1(P,ANS)
 
736
C     
 
737
C     Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
 
738
C     By the MadGraph5_aMC@NLO Development Team
 
739
C     Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
 
740
C     
 
741
C     Returns amplitude squared summed/avg over colors
 
742
C     and helicities
 
743
C     for the point in phase space P(0:3,NEXTERNAL)
 
744
C     
 
745
C     Process: g g > t t~ g WEIGHTED=3 QED=0 QCD=3 [ QCD ]
 
746
C     
 
747
      IMPLICIT NONE
 
748
C     
 
749
C     CONSTANTS
 
750
C     
 
751
      INCLUDE 'nexternal.inc'
 
752
      INTEGER     NCOMB
 
753
      PARAMETER ( NCOMB=32)
 
754
C     
 
755
C     ARGUMENTS 
 
756
C     
 
757
      REAL*8 P(0:3,NEXTERNAL),ANS
 
758
C     
 
759
C     LOCAL VARIABLES 
 
760
C     
 
761
      INTEGER IHEL,IDEN,I,T_IDENT(NCOMB)
 
762
      REAL*8 MATRIX_1
 
763
      REAL*8 T,T_SAVE(NCOMB)
 
764
      SAVE T_SAVE,T_IDENT
 
765
      INTEGER NHEL(NEXTERNAL,NCOMB)
 
766
      DATA (NHEL(I,   1),I=1,5) /-1,-1,-1,-1,-1/
 
767
      DATA (NHEL(I,   2),I=1,5) /-1,-1,-1,-1, 1/
 
768
      DATA (NHEL(I,   3),I=1,5) /-1,-1,-1, 1,-1/
 
769
      DATA (NHEL(I,   4),I=1,5) /-1,-1,-1, 1, 1/
 
770
      DATA (NHEL(I,   5),I=1,5) /-1,-1, 1,-1,-1/
 
771
      DATA (NHEL(I,   6),I=1,5) /-1,-1, 1,-1, 1/
 
772
      DATA (NHEL(I,   7),I=1,5) /-1,-1, 1, 1,-1/
 
773
      DATA (NHEL(I,   8),I=1,5) /-1,-1, 1, 1, 1/
 
774
      DATA (NHEL(I,   9),I=1,5) /-1, 1,-1,-1,-1/
 
775
      DATA (NHEL(I,  10),I=1,5) /-1, 1,-1,-1, 1/
 
776
      DATA (NHEL(I,  11),I=1,5) /-1, 1,-1, 1,-1/
 
777
      DATA (NHEL(I,  12),I=1,5) /-1, 1,-1, 1, 1/
 
778
      DATA (NHEL(I,  13),I=1,5) /-1, 1, 1,-1,-1/
 
779
      DATA (NHEL(I,  14),I=1,5) /-1, 1, 1,-1, 1/
 
780
      DATA (NHEL(I,  15),I=1,5) /-1, 1, 1, 1,-1/
 
781
      DATA (NHEL(I,  16),I=1,5) /-1, 1, 1, 1, 1/
 
782
      DATA (NHEL(I,  17),I=1,5) / 1,-1,-1,-1,-1/
 
783
      DATA (NHEL(I,  18),I=1,5) / 1,-1,-1,-1, 1/
 
784
      DATA (NHEL(I,  19),I=1,5) / 1,-1,-1, 1,-1/
 
785
      DATA (NHEL(I,  20),I=1,5) / 1,-1,-1, 1, 1/
 
786
      DATA (NHEL(I,  21),I=1,5) / 1,-1, 1,-1,-1/
 
787
      DATA (NHEL(I,  22),I=1,5) / 1,-1, 1,-1, 1/
 
788
      DATA (NHEL(I,  23),I=1,5) / 1,-1, 1, 1,-1/
 
789
      DATA (NHEL(I,  24),I=1,5) / 1,-1, 1, 1, 1/
 
790
      DATA (NHEL(I,  25),I=1,5) / 1, 1,-1,-1,-1/
 
791
      DATA (NHEL(I,  26),I=1,5) / 1, 1,-1,-1, 1/
 
792
      DATA (NHEL(I,  27),I=1,5) / 1, 1,-1, 1,-1/
 
793
      DATA (NHEL(I,  28),I=1,5) / 1, 1,-1, 1, 1/
 
794
      DATA (NHEL(I,  29),I=1,5) / 1, 1, 1,-1,-1/
 
795
      DATA (NHEL(I,  30),I=1,5) / 1, 1, 1,-1, 1/
 
796
      DATA (NHEL(I,  31),I=1,5) / 1, 1, 1, 1,-1/
 
797
      DATA (NHEL(I,  32),I=1,5) / 1, 1, 1, 1, 1/
 
798
      LOGICAL GOODHEL(NCOMB)
 
799
      DATA GOODHEL/NCOMB*.FALSE./
 
800
      INTEGER NTRY
 
801
      DATA NTRY/0/
 
802
      DATA IDEN/256/
 
803
C     ----------
 
804
C     BEGIN CODE
 
805
C     ----------
 
806
      NTRY=NTRY+1
 
807
      ANS = 0D0
 
808
      DO IHEL=1,NCOMB
 
809
        IF (GOODHEL(IHEL) .OR. NTRY .LT. 2) THEN
 
810
          IF (NTRY.LT.2) THEN
 
811
C           for the first ps-point, check for helicities that give
 
812
C           identical matrix elements
 
813
            T=MATRIX_1(P ,NHEL(1,IHEL))
 
814
            T_SAVE(IHEL)=T
 
815
            T_IDENT(IHEL)=-1
 
816
            DO I=1,IHEL-1
 
817
              IF (T.EQ.0D0) EXIT
 
818
              IF (T_SAVE(I).EQ.0D0) CYCLE
 
819
              IF (ABS(T/T_SAVE(I)-1D0) .LT. 1D-12) THEN
 
820
C               WRITE (*,*) 'FOUND IDENTICAL',T,IHEL,T_SAVE(I),I
 
821
                T_IDENT(IHEL) = I
 
822
              ENDIF
 
823
            ENDDO
 
824
          ELSE
 
825
            IF (T_IDENT(IHEL).GT.0) THEN
 
826
C             if two helicity states are identical, dont recompute
 
827
              T=T_SAVE(T_IDENT(IHEL))
 
828
              T_SAVE(IHEL)=T
 
829
            ELSE
 
830
              T=MATRIX_1(P ,NHEL(1,IHEL))
 
831
              T_SAVE(IHEL)=T
 
832
            ENDIF
 
833
          ENDIF
 
834
C         add to the sum of helicities
 
835
          ANS=ANS+T
 
836
          IF (T .NE. 0D0 .AND. .NOT. GOODHEL(IHEL)) THEN
 
837
            GOODHEL(IHEL)=.TRUE.
 
838
          ENDIF
 
839
        ENDIF
 
840
      ENDDO
 
841
      ANS=ANS/DBLE(IDEN)
 
842
      END
 
843
 
 
844
 
 
845
      REAL*8 FUNCTION MATRIX_1(P,NHEL)
 
846
C     
 
847
C     Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
 
848
C     By the MadGraph5_aMC@NLO Development Team
 
849
C     Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
 
850
C     
 
851
C     Returns amplitude squared summed/avg over colors
 
852
C     for the point with external lines W(0:6,NEXTERNAL)
 
853
C     
 
854
C     Process: g g > t t~ g WEIGHTED=3 QED=0 QCD=3 [ QCD ]
 
855
C     
 
856
      IMPLICIT NONE
 
857
C     
 
858
C     CONSTANTS
 
859
C     
 
860
      INTEGER    NGRAPHS
 
861
      PARAMETER (NGRAPHS=18)
 
862
      INTEGER    NWAVEFUNCS, NCOLOR
 
863
      PARAMETER (NWAVEFUNCS=12, NCOLOR=6)
 
864
      REAL*8     ZERO
 
865
      PARAMETER (ZERO=0D0)
 
866
      COMPLEX*16 IMAG1
 
867
      PARAMETER (IMAG1=(0D0,1D0))
 
868
      INCLUDE 'nexternal.inc'
 
869
      INCLUDE 'coupl.inc'
 
870
C     
 
871
C     ARGUMENTS 
 
872
C     
 
873
      REAL*8 P(0:3,NEXTERNAL)
 
874
      INTEGER NHEL(NEXTERNAL)
 
875
C     
 
876
C     LOCAL VARIABLES 
 
877
C     
 
878
      INTEGER I,J
 
879
      INTEGER IC(NEXTERNAL)
 
880
      DATA IC /NEXTERNAL*1/
 
881
      REAL*8 DENOM(NCOLOR), CF(NCOLOR,NCOLOR)
 
882
      COMPLEX*16 ZTEMP, AMP(NGRAPHS), JAMP(NCOLOR), W(20,NWAVEFUNCS)
 
883
C     
 
884
C     COLOR DATA
 
885
C     
 
886
      DATA DENOM(1)/9/
 
887
      DATA (CF(I,  1),I=  1,  6) /   64,   -8,   -8,    1,    1,   10/
 
888
C     1 T(1,2,5,3,4)
 
889
      DATA DENOM(2)/9/
 
890
      DATA (CF(I,  2),I=  1,  6) /   -8,   64,    1,   10,   -8,    1/
 
891
C     1 T(1,5,2,3,4)
 
892
      DATA DENOM(3)/9/
 
893
      DATA (CF(I,  3),I=  1,  6) /   -8,    1,   64,   -8,   10,    1/
 
894
C     1 T(2,1,5,3,4)
 
895
      DATA DENOM(4)/9/
 
896
      DATA (CF(I,  4),I=  1,  6) /    1,   10,   -8,   64,    1,   -8/
 
897
C     1 T(2,5,1,3,4)
 
898
      DATA DENOM(5)/9/
 
899
      DATA (CF(I,  5),I=  1,  6) /    1,   -8,   10,    1,   64,   -8/
 
900
C     1 T(5,1,2,3,4)
 
901
      DATA DENOM(6)/9/
 
902
      DATA (CF(I,  6),I=  1,  6) /   10,    1,    1,   -8,   -8,   64/
 
903
C     1 T(5,2,1,3,4)
 
904
C     ----------
 
905
C     BEGIN CODE
 
906
C     ----------
 
907
      CALL VXXXXX(P(0,1),ZERO,NHEL(1),-1*IC(1),W(1,1))
 
908
      CALL VXXXXX(P(0,2),ZERO,NHEL(2),-1*IC(2),W(1,2))
 
909
      CALL OXXXXX(P(0,3),MT,NHEL(3),+1*IC(3),W(1,3))
 
910
      CALL IXXXXX(P(0,4),MT,NHEL(4),-1*IC(4),W(1,4))
 
911
      CALL VXXXXX(P(0,5),ZERO,NHEL(5),+1*IC(5),W(1,5))
 
912
      CALL VVV1P0_1(W(1,1),W(1,2),GC_10,ZERO,ZERO,W(1,6))
 
913
      CALL FFV1P0_3(W(1,4),W(1,3),GC_11,ZERO,ZERO,W(1,7))
 
914
C     Amplitude(s) for diagram number 1
 
915
      CALL VVV1_0(W(1,6),W(1,7),W(1,5),GC_10,AMP(1))
 
916
      CALL FFV1_1(W(1,3),W(1,5),GC_11,MT,WT,W(1,8))
 
917
C     Amplitude(s) for diagram number 2
 
918
      CALL FFV1_0(W(1,4),W(1,8),W(1,6),GC_11,AMP(2))
 
919
      CALL FFV1_2(W(1,4),W(1,5),GC_11,MT,WT,W(1,9))
 
920
C     Amplitude(s) for diagram number 3
 
921
      CALL FFV1_0(W(1,9),W(1,3),W(1,6),GC_11,AMP(3))
 
922
      CALL FFV1_1(W(1,3),W(1,1),GC_11,MT,WT,W(1,6))
 
923
      CALL FFV1_2(W(1,4),W(1,2),GC_11,MT,WT,W(1,10))
 
924
C     Amplitude(s) for diagram number 4
 
925
      CALL FFV1_0(W(1,10),W(1,6),W(1,5),GC_11,AMP(4))
 
926
      CALL VVV1P0_1(W(1,2),W(1,5),GC_10,ZERO,ZERO,W(1,11))
 
927
C     Amplitude(s) for diagram number 5
 
928
      CALL FFV1_0(W(1,4),W(1,6),W(1,11),GC_11,AMP(5))
 
929
C     Amplitude(s) for diagram number 6
 
930
      CALL FFV1_0(W(1,9),W(1,6),W(1,2),GC_11,AMP(6))
 
931
      CALL FFV1_2(W(1,4),W(1,1),GC_11,MT,WT,W(1,6))
 
932
      CALL FFV1_1(W(1,3),W(1,2),GC_11,MT,WT,W(1,12))
 
933
C     Amplitude(s) for diagram number 7
 
934
      CALL FFV1_0(W(1,6),W(1,12),W(1,5),GC_11,AMP(7))
 
935
C     Amplitude(s) for diagram number 8
 
936
      CALL FFV1_0(W(1,6),W(1,3),W(1,11),GC_11,AMP(8))
 
937
C     Amplitude(s) for diagram number 9
 
938
      CALL FFV1_0(W(1,6),W(1,8),W(1,2),GC_11,AMP(9))
 
939
      CALL VVV1P0_1(W(1,1),W(1,5),GC_10,ZERO,ZERO,W(1,6))
 
940
C     Amplitude(s) for diagram number 10
 
941
      CALL FFV1_0(W(1,4),W(1,12),W(1,6),GC_11,AMP(10))
 
942
C     Amplitude(s) for diagram number 11
 
943
      CALL FFV1_0(W(1,10),W(1,3),W(1,6),GC_11,AMP(11))
 
944
C     Amplitude(s) for diagram number 12
 
945
      CALL VVV1_0(W(1,6),W(1,2),W(1,7),GC_10,AMP(12))
 
946
C     Amplitude(s) for diagram number 13
 
947
      CALL FFV1_0(W(1,9),W(1,12),W(1,1),GC_11,AMP(13))
 
948
C     Amplitude(s) for diagram number 14
 
949
      CALL FFV1_0(W(1,10),W(1,8),W(1,1),GC_11,AMP(14))
 
950
C     Amplitude(s) for diagram number 15
 
951
      CALL VVV1_0(W(1,1),W(1,11),W(1,7),GC_10,AMP(15))
 
952
      CALL VVVV1P0_1(W(1,1),W(1,2),W(1,5),GC_12,ZERO,ZERO,W(1,11))
 
953
      CALL VVVV3P0_1(W(1,1),W(1,2),W(1,5),GC_12,ZERO,ZERO,W(1,7))
 
954
      CALL VVVV4P0_1(W(1,1),W(1,2),W(1,5),GC_12,ZERO,ZERO,W(1,10))
 
955
C     Amplitude(s) for diagram number 16
 
956
      CALL FFV1_0(W(1,4),W(1,3),W(1,11),GC_11,AMP(16))
 
957
      CALL FFV1_0(W(1,4),W(1,3),W(1,7),GC_11,AMP(17))
 
958
      CALL FFV1_0(W(1,4),W(1,3),W(1,10),GC_11,AMP(18))
 
959
      JAMP(1)=-AMP(1)+IMAG1*AMP(3)+IMAG1*AMP(5)-AMP(6)+AMP(15)-AMP(18)
 
960
     $ +AMP(16)
 
961
      JAMP(2)=-AMP(4)-IMAG1*AMP(5)+IMAG1*AMP(11)+AMP(12)-AMP(15)
 
962
     $ -AMP(17)-AMP(16)
 
963
      JAMP(3)=+AMP(1)-IMAG1*AMP(3)+IMAG1*AMP(10)-AMP(12)-AMP(13)
 
964
     $ +AMP(18)+AMP(17)
 
965
      JAMP(4)=-AMP(7)+IMAG1*AMP(8)-IMAG1*AMP(10)+AMP(12)-AMP(15)
 
966
     $ -AMP(17)-AMP(16)
 
967
      JAMP(5)=+AMP(1)+IMAG1*AMP(2)-IMAG1*AMP(11)-AMP(12)-AMP(14)
 
968
     $ +AMP(18)+AMP(17)
 
969
      JAMP(6)=-AMP(1)-IMAG1*AMP(2)-IMAG1*AMP(8)-AMP(9)+AMP(15)-AMP(18)
 
970
     $ +AMP(16)
 
971
      MATRIX_1 = 0.D0
 
972
      DO I = 1, NCOLOR
 
973
        ZTEMP = (0.D0,0.D0)
 
974
        DO J = 1, NCOLOR
 
975
          ZTEMP = ZTEMP + CF(J,I)*JAMP(J)
 
976
        ENDDO
 
977
        MATRIX_1 = MATRIX_1+ZTEMP*DCONJG(JAMP(I))/DENOM(I)
 
978
      ENDDO
 
979
      END
 
980
 
 
981
 
 
982
""" % misc.get_pkg_info()
 
983
 
 
984
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
985
 
 
986
        nflows = \
 
987
            process_exporter.write_matrix_element_fks(
 
988
                    writers.FortranWriter(self.give_pos('test')),
 
989
                    self.myfks_me.real_processes[0].matrix_element, 1,
 
990
                    self.myfortranmodel)  
 
991
 
 
992
        self.assertFileContains('test', goal) 
 
993
 
 
994
 
 
995
 
 
996
    def test_write_born_fks(self):
 
997
        """tests if the born.f file containing the born matrix element
 
998
        is correctly written
 
999
        """
 
1000
        goal = \
 
1001
"""      SUBROUTINE SBORN(P1,ANS)
 
1002
C     
 
1003
C     Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
 
1004
C     By the MadGraph5_aMC@NLO Development Team
 
1005
C     Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
 
1006
C     
 
1007
C     RETURNS AMPLITUDE SQUARED SUMMED/AVG OVER COLORS
 
1008
C     AND HELICITIES
 
1009
C     FOR THE POINT IN PHASE SPACE P1(0:3,NEXTERNAL-1)
 
1010
C     
 
1011
C     Process: g g > t t~ QED=0 QCD=2 [ QCD ]
 
1012
C     
 
1013
      IMPLICIT NONE
 
1014
C     
 
1015
C     CONSTANTS
 
1016
C     
 
1017
      INCLUDE 'nexternal.inc'
 
1018
      INCLUDE 'born_nhel.inc'
 
1019
      INCLUDE 'genps.inc'
 
1020
      INTEGER     NCOMB
 
1021
      PARAMETER ( NCOMB=  16 )
 
1022
      INTEGER    THEL
 
1023
      PARAMETER (THEL=NCOMB*8)
 
1024
      INTEGER NGRAPHS
 
1025
      PARAMETER (NGRAPHS=   3)
 
1026
C     
 
1027
C     ARGUMENTS 
 
1028
C     
 
1029
      REAL*8 P1(0:3,NEXTERNAL-1)
 
1030
      COMPLEX*16 ANS(2)
 
1031
C     
 
1032
C     LOCAL VARIABLES 
 
1033
C     
 
1034
      INTEGER IHEL,IDEN,I,J,JJ,GLU_IJ
 
1035
      REAL*8 BORN,BORNS(2)
 
1036
      COMPLEX*16 BORNTILDE
 
1037
      INTEGER NTRY(8)
 
1038
      DATA NTRY /8*0/
 
1039
      INTEGER NHEL(NEXTERNAL-1,NCOMB)
 
1040
      DATA (NHEL(I,   1),I=1,4) /-1,-1,-1,-1/
 
1041
      DATA (NHEL(I,   2),I=1,4) /-1,-1,-1, 1/
 
1042
      DATA (NHEL(I,   3),I=1,4) /-1,-1, 1,-1/
 
1043
      DATA (NHEL(I,   4),I=1,4) /-1,-1, 1, 1/
 
1044
      DATA (NHEL(I,   5),I=1,4) /-1, 1,-1,-1/
 
1045
      DATA (NHEL(I,   6),I=1,4) /-1, 1,-1, 1/
 
1046
      DATA (NHEL(I,   7),I=1,4) /-1, 1, 1,-1/
 
1047
      DATA (NHEL(I,   8),I=1,4) /-1, 1, 1, 1/
 
1048
      DATA (NHEL(I,   9),I=1,4) / 1,-1,-1,-1/
 
1049
      DATA (NHEL(I,  10),I=1,4) / 1,-1,-1, 1/
 
1050
      DATA (NHEL(I,  11),I=1,4) / 1,-1, 1,-1/
 
1051
      DATA (NHEL(I,  12),I=1,4) / 1,-1, 1, 1/
 
1052
      DATA (NHEL(I,  13),I=1,4) / 1, 1,-1,-1/
 
1053
      DATA (NHEL(I,  14),I=1,4) / 1, 1,-1, 1/
 
1054
      DATA (NHEL(I,  15),I=1,4) / 1, 1, 1,-1/
 
1055
      DATA (NHEL(I,  16),I=1,4) / 1, 1, 1, 1/
 
1056
      INTEGER IDEN_VALUES(8)
 
1057
      DATA IDEN_VALUES /256, 256, 256, 256, 256, 256, 256, 256/
 
1058
      INTEGER IJ_VALUES(8)
 
1059
      DATA IJ_VALUES /1, 2, 3, 4, 1, 1, 2, 2/
 
1060
C     
 
1061
C     GLOBAL VARIABLES
 
1062
C     
 
1063
      DOUBLE PRECISION AMP2(MAXAMPS), JAMP2(0:MAXAMPS)
 
1064
      COMMON/TO_AMPS/  AMP2,       JAMP2
 
1065
      DATA JAMP2(0) /   2/
 
1066
      LOGICAL GOODHEL(NCOMB,8)
 
1067
      COMMON /C_GOODHEL/GOODHEL
 
1068
      DOUBLE COMPLEX SAVEAMP(NGRAPHS,MAX_BHEL)
 
1069
      COMMON/TO_SAVEAMP/SAVEAMP
 
1070
      DOUBLE PRECISION SAVEMOM(NEXTERNAL-1,2)
 
1071
      COMMON/TO_SAVEMOM/SAVEMOM
 
1072
      DOUBLE PRECISION HEL_FAC
 
1073
      INTEGER GET_HEL,SKIP(8)
 
1074
      COMMON/CBORN/HEL_FAC,GET_HEL,SKIP
 
1075
      LOGICAL CALCULATEDBORN
 
1076
      COMMON/CCALCULATEDBORN/CALCULATEDBORN
 
1077
      INTEGER NFKSPROCESS
 
1078
      COMMON/C_NFKSPROCESS/NFKSPROCESS
 
1079
C     ----------
 
1080
C     BEGIN CODE
 
1081
C     ----------
 
1082
      IDEN=IDEN_VALUES(NFKSPROCESS)
 
1083
      GLU_IJ = IJ_VALUES(NFKSPROCESS)
 
1084
      NTRY(NFKSPROCESS)=NTRY(NFKSPROCESS)+1
 
1085
      IF (NTRY(NFKSPROCESS).LT.2) THEN
 
1086
        SKIP(NFKSPROCESS)=1
 
1087
        DO WHILE(NHEL(GLU_IJ ,SKIP(NFKSPROCESS)).NE.1)
 
1088
          SKIP(NFKSPROCESS)=SKIP(NFKSPROCESS)+1
 
1089
        ENDDO
 
1090
        SKIP(NFKSPROCESS)=SKIP(NFKSPROCESS)-1
 
1091
      ENDIF
 
1092
      DO JJ=1,NGRAPHS
 
1093
        AMP2(JJ)=0D0
 
1094
      ENDDO
 
1095
      DO JJ=1,INT(JAMP2(0))
 
1096
        JAMP2(JJ)=0D0
 
1097
      ENDDO
 
1098
      IF (CALCULATEDBORN) THEN
 
1099
        DO J=1,NEXTERNAL-1
 
1100
          IF (SAVEMOM(J,1).NE.P1(0,J) .OR. SAVEMOM(J,2).NE.P1(3
 
1101
     $     ,J)) THEN
 
1102
            CALCULATEDBORN=.FALSE.
 
1103
            WRITE (*,*) 'momenta not the same in Born'
 
1104
            STOP
 
1105
          ENDIF
 
1106
        ENDDO
 
1107
      ENDIF
 
1108
      IF (.NOT.CALCULATEDBORN) THEN
 
1109
        DO J=1,NEXTERNAL-1
 
1110
          SAVEMOM(J,1)=P1(0,J)
 
1111
          SAVEMOM(J,2)=P1(3,J)
 
1112
        ENDDO
 
1113
        DO J=1,MAX_BHEL
 
1114
          DO JJ=1,NGRAPHS
 
1115
            SAVEAMP(JJ,J)=(0D0,0D0)
 
1116
          ENDDO
 
1117
        ENDDO
 
1118
      ENDIF
 
1119
      ANS(1) = 0D0
 
1120
      ANS(2) = 0D0
 
1121
      HEL_FAC=1D0
 
1122
      DO IHEL=1,NCOMB
 
1123
        IF (NHEL(GLU_IJ,IHEL).LE.0) THEN
 
1124
          IF ((GOODHEL(IHEL,NFKSPROCESS) .OR. GOODHEL(IHEL+SKIP(NFKSPRO
 
1125
     $     CESS),NFKSPROCESS) .OR. NTRY(NFKSPROCESS) .LT. 2) ) THEN
 
1126
            ANS(1)=ANS(1)+BORN(P1,NHEL(1,IHEL),IHEL,BORNTILDE,BORNS)
 
1127
            ANS(2)=ANS(2)+BORNTILDE
 
1128
            IF ( BORNS(1).NE.0D0 .AND. .NOT. GOODHEL(IHEL,NFKSPROCESS
 
1129
     $       ) ) THEN
 
1130
              GOODHEL(IHEL,NFKSPROCESS)=.TRUE.
 
1131
            ENDIF
 
1132
            IF ( BORNS(2).NE.0D0 .AND. .NOT. GOODHEL(IHEL+SKIP(NFKSPROC
 
1133
     $       ESS),NFKSPROCESS) ) THEN
 
1134
              GOODHEL(IHEL+SKIP(NFKSPROCESS),NFKSPROCESS)=.TRUE.
 
1135
            ENDIF
 
1136
          ENDIF
 
1137
        ENDIF
 
1138
      ENDDO
 
1139
      ANS(1)=ANS(1)/DBLE(IDEN)
 
1140
      ANS(2)=ANS(2)/DBLE(IDEN)
 
1141
      CALCULATEDBORN=.TRUE.
 
1142
      END
 
1143
 
 
1144
 
 
1145
      REAL*8 FUNCTION BORN(P,NHEL,HELL,BORNTILDE,BORNS)
 
1146
C     
 
1147
C     Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
 
1148
C     By the MadGraph5_aMC@NLO Development Team
 
1149
C     Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
 
1150
C     RETURNS AMPLITUDE SQUARED SUMMED/AVG OVER COLORS
 
1151
C     FOR THE POINT WITH EXTERNAL LINES W(0:6,NEXTERNAL-1)
 
1152
 
 
1153
C     Process: g g > t t~ QED=0 QCD=2 [ QCD ]
 
1154
C     
 
1155
      IMPLICIT NONE
 
1156
C     
 
1157
C     CONSTANTS
 
1158
C     
 
1159
      INTEGER    NGRAPHS,    NEIGEN
 
1160
      PARAMETER (NGRAPHS=   3,NEIGEN=  1)
 
1161
      INTEGER    NWAVEFUNCS, NCOLOR
 
1162
      PARAMETER (NWAVEFUNCS=7, NCOLOR=2)
 
1163
      REAL*8     ZERO
 
1164
      PARAMETER (ZERO=0D0)
 
1165
      COMPLEX*16 IMAG1
 
1166
      PARAMETER (IMAG1 = (0D0,1D0))
 
1167
      INCLUDE 'nexternal.inc'
 
1168
      INCLUDE 'born_nhel.inc'
 
1169
      INCLUDE 'coupl.inc'
 
1170
      INCLUDE 'genps.inc'
 
1171
C     
 
1172
C     ARGUMENTS 
 
1173
C     
 
1174
      REAL*8 P(0:3,NEXTERNAL-1),BORNS(2)
 
1175
      INTEGER NHEL(NEXTERNAL-1), HELL
 
1176
      COMPLEX*16 BORNTILDE
 
1177
C     
 
1178
C     LOCAL VARIABLES 
 
1179
C     
 
1180
      INTEGER I,J,IHEL,BACK_HEL,GLU_IJ
 
1181
      INTEGER IC(NEXTERNAL-1),NMO
 
1182
      PARAMETER (NMO=NEXTERNAL-1)
 
1183
      DATA IC /NMO*1/
 
1184
      REAL*8 DENOM(NCOLOR), CF(NCOLOR,NCOLOR)
 
1185
      COMPLEX*16 ZTEMP, AMP(NGRAPHS), JAMP(NCOLOR), W(20,NWAVEFUNCS)
 
1186
     $ , JAMPH(2, NCOLOR)
 
1187
C     
 
1188
C     GLOBAL VARIABLES
 
1189
C     
 
1190
      DOUBLE PRECISION AMP2(MAXAMPS), JAMP2(0:MAXAMPS)
 
1191
      COMMON/TO_AMPS/  AMP2,       JAMP2
 
1192
      DOUBLE COMPLEX SAVEAMP(NGRAPHS,MAX_BHEL)
 
1193
      COMMON/TO_SAVEAMP/SAVEAMP
 
1194
      DOUBLE PRECISION HEL_FAC
 
1195
      INTEGER GET_HEL,SKIP(8)
 
1196
      COMMON/CBORN/HEL_FAC,GET_HEL,SKIP
 
1197
      LOGICAL CALCULATEDBORN
 
1198
      COMMON/CCALCULATEDBORN/CALCULATEDBORN
 
1199
      INTEGER NFKSPROCESS
 
1200
      COMMON/C_NFKSPROCESS/NFKSPROCESS
 
1201
      INTEGER IJ_VALUES(8)
 
1202
      DATA IJ_VALUES /1, 2, 3, 4, 1, 1, 2, 2/
 
1203
C     
 
1204
C     COLOR DATA
 
1205
C     
 
1206
      DATA DENOM(1)/3/
 
1207
      DATA (CF(I,  1),I=  1,  2) /   16,   -2/
 
1208
C     1 T(1,2,3,4)
 
1209
      DATA DENOM(2)/3/
 
1210
      DATA (CF(I,  2),I=  1,  2) /   -2,   16/
 
1211
C     1 T(2,1,3,4)
 
1212
C     ----------
 
1213
C     BEGIN CODE
 
1214
C     ----------
 
1215
      GLU_IJ = IJ_VALUES(NFKSPROCESS)
 
1216
      BORN = 0D0
 
1217
      BORNTILDE = (0D0,0D0)
 
1218
      BACK_HEL = NHEL(GLU_IJ)
 
1219
      BORNS(1) = 0D0
 
1220
      BORNS(2) = 0D0
 
1221
      DO IHEL=-1,1,2
 
1222
        IF (IHEL.EQ.-1.OR.NHEL(GLU_IJ).NE.0) THEN
 
1223
          IF (NHEL(GLU_IJ).NE.0) NHEL(GLU_IJ) = IHEL
 
1224
          IF (.NOT. CALCULATEDBORN) THEN
 
1225
            CALL VXXXXX(P(0,1),ZERO,NHEL(1),-1*IC(1),W(1,1))
 
1226
            CALL VXXXXX(P(0,2),ZERO,NHEL(2),-1*IC(2),W(1,2))
 
1227
            CALL OXXXXX(P(0,3),MT,NHEL(3),+1*IC(3),W(1,3))
 
1228
            CALL IXXXXX(P(0,4),MT,NHEL(4),-1*IC(4),W(1,4))
 
1229
            CALL VVV1P0_1(W(1,1),W(1,2),GC_10,ZERO,ZERO,W(1,5))
 
1230
C           Amplitude(s) for diagram number 1
 
1231
            CALL FFV1_0(W(1,4),W(1,3),W(1,5),GC_11,AMP(1))
 
1232
            CALL FFV1_1(W(1,3),W(1,1),GC_11,MT,WT,W(1,5))
 
1233
C           Amplitude(s) for diagram number 2
 
1234
            CALL FFV1_0(W(1,4),W(1,5),W(1,2),GC_11,AMP(2))
 
1235
            CALL FFV1_2(W(1,4),W(1,1),GC_11,MT,WT,W(1,5))
 
1236
C           Amplitude(s) for diagram number 3
 
1237
            CALL FFV1_0(W(1,5),W(1,3),W(1,2),GC_11,AMP(3))
 
1238
            DO I=1,NGRAPHS
 
1239
              IF(IHEL.EQ.-1)THEN
 
1240
                SAVEAMP(I,HELL)=AMP(I)
 
1241
              ELSEIF(IHEL.EQ.1)THEN
 
1242
                SAVEAMP(I,HELL+SKIP(NFKSPROCESS))=AMP(I)
 
1243
              ELSE
 
1244
                WRITE(*,*) 'ERROR #1 in born.f'
 
1245
                STOP
 
1246
              ENDIF
 
1247
            ENDDO
 
1248
          ELSEIF (CALCULATEDBORN) THEN
 
1249
            DO I=1,NGRAPHS
 
1250
              IF(IHEL.EQ.-1)THEN
 
1251
                AMP(I)=SAVEAMP(I,HELL)
 
1252
              ELSEIF(IHEL.EQ.1)THEN
 
1253
                AMP(I)=SAVEAMP(I,HELL+SKIP(NFKSPROCESS))
 
1254
              ELSE
 
1255
                WRITE(*,*) 'ERROR #1 in born.f'
 
1256
                STOP
 
1257
              ENDIF
 
1258
            ENDDO
 
1259
          ENDIF
 
1260
          JAMP(1)=+IMAG1*AMP(1)-AMP(2)
 
1261
          JAMP(2)=-IMAG1*AMP(1)-AMP(3)
 
1262
          DO I = 1, NCOLOR
 
1263
            ZTEMP = (0.D0,0.D0)
 
1264
            DO J = 1, NCOLOR
 
1265
              ZTEMP = ZTEMP + CF(J,I)*JAMP(J)
 
1266
            ENDDO
 
1267
            BORNS(2-(1-IHEL)/2)=BORNS(2-(1-IHEL)/2)+ZTEMP*DCONJG(JAMP(I
 
1268
     $       ))/DENOM(I)
 
1269
          ENDDO
 
1270
          DO I = 1, NGRAPHS
 
1271
            AMP2(I)=AMP2(I)+AMP(I)*DCONJG(AMP(I))
 
1272
          ENDDO
 
1273
          DO I = 1, NCOLOR
 
1274
            JAMP2(I)=JAMP2(I)+JAMP(I)*DCONJG(JAMP(I))
 
1275
            JAMPH(2-(1-IHEL)/2,I)=JAMP(I)
 
1276
          ENDDO
 
1277
        ENDIF
 
1278
      ENDDO
 
1279
      BORN=BORNS(1)+BORNS(2)
 
1280
      DO I = 1, NCOLOR
 
1281
        ZTEMP = (0.D0,0.D0)
 
1282
        DO J = 1, NCOLOR
 
1283
          ZTEMP = ZTEMP + CF(J,I)*JAMPH(2,J)
 
1284
        ENDDO
 
1285
        BORNTILDE = BORNTILDE + ZTEMP*DCONJG(JAMPH(1,I))/DENOM(I)
 
1286
      ENDDO
 
1287
      NHEL(GLU_IJ) = BACK_HEL
 
1288
      END
 
1289
 
 
1290
 
 
1291
      BLOCK DATA GOODHELS
 
1292
      INTEGER     NCOMB
 
1293
      PARAMETER ( NCOMB=  16 )
 
1294
      INTEGER    THEL
 
1295
      PARAMETER (THEL=NCOMB*8)
 
1296
      LOGICAL GOODHEL(NCOMB,8)
 
1297
      COMMON /C_GOODHEL/GOODHEL
 
1298
      DATA GOODHEL/THEL*.FALSE./
 
1299
      END
 
1300
 
 
1301
 
 
1302
 
 
1303
"""  % misc.get_pkg_info()
 
1304
 
 
1305
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
1306
 
 
1307
        nflows = \
 
1308
            process_exporter.write_born_fks(
 
1309
                    writers.FortranWriter(self.give_pos('test')),
 
1310
                    self.myfks_me, 
 
1311
                    self.myfortranmodel)  
 
1312
 
 
1313
        self.assertFileContains('test', goal) 
 
1314
 
 
1315
 
 
1316
    def test_write_born_hel(self):
 
1317
        """tests if the born_hel.f file containing the born matrix element
 
1318
        is correctly written
 
1319
        """
 
1320
        goal = \
 
1321
"""      SUBROUTINE SBORN_HEL(P1,ANS)
 
1322
C     
 
1323
C     Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
 
1324
C     By the MadGraph5_aMC@NLO Development Team
 
1325
C     Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
 
1326
C     
 
1327
C     RETURNS AMPLITUDE SQUARED SUMMED/AVG OVER COLORS
 
1328
C     AND HELICITIES
 
1329
C     FOR THE POINT IN PHASE SPACE P1(0:3,NEXTERNAL-1)
 
1330
C     
 
1331
C     Process: g g > t t~ QED=0 QCD=2 [ QCD ]
 
1332
C     
 
1333
      IMPLICIT NONE
 
1334
C     
 
1335
C     CONSTANTS
 
1336
C     
 
1337
      INCLUDE 'nexternal.inc'
 
1338
      INCLUDE 'born_nhel.inc'
 
1339
      INTEGER     NCOMB
 
1340
      PARAMETER ( NCOMB=  16 )
 
1341
      INTEGER    THEL
 
1342
      PARAMETER (THEL=NCOMB*8)
 
1343
      INTEGER NGRAPHS
 
1344
      PARAMETER (NGRAPHS = 3)
 
1345
C     
 
1346
C     ARGUMENTS 
 
1347
C     
 
1348
      REAL*8 P1(0:3,NEXTERNAL-1),ANS
 
1349
C     
 
1350
C     LOCAL VARIABLES 
 
1351
C     
 
1352
      INTEGER IHEL,IDEN,J
 
1353
      REAL*8 BORN_HEL
 
1354
      INTEGER IDEN_VALUES(8)
 
1355
      DATA IDEN_VALUES /256, 256, 256, 256, 256, 256, 256, 256/
 
1356
C     
 
1357
C     GLOBAL VARIABLES
 
1358
C     
 
1359
      LOGICAL GOODHEL(NCOMB,8)
 
1360
      COMMON /C_GOODHEL/ GOODHEL
 
1361
      DOUBLE PRECISION SAVEMOM(NEXTERNAL-1,2)
 
1362
      COMMON/TO_SAVEMOM/SAVEMOM
 
1363
      LOGICAL CALCULATEDBORN
 
1364
      COMMON/CCALCULATEDBORN/CALCULATEDBORN
 
1365
      INTEGER NFKSPROCESS
 
1366
      COMMON/C_NFKSPROCESS/NFKSPROCESS
 
1367
      DOUBLE PRECISION WGT_HEL(MAX_BHEL)
 
1368
      COMMON/C_BORN_HEL/WGT_HEL
 
1369
 
 
1370
C     ----------
 
1371
C     BEGIN CODE
 
1372
C     ----------
 
1373
      IDEN=IDEN_VALUES(NFKSPROCESS)
 
1374
      IF (CALCULATEDBORN) THEN
 
1375
        DO J=1,NEXTERNAL-1
 
1376
          IF (SAVEMOM(J,1).NE.P1(0,J) .OR. SAVEMOM(J,2).NE.P1(3
 
1377
     $     ,J)) THEN
 
1378
            CALCULATEDBORN=.FALSE.
 
1379
            WRITE (*,*) 'momenta not the same in Born_hel'
 
1380
            STOP
 
1381
          ENDIF
 
1382
        ENDDO
 
1383
      ELSE
 
1384
        WRITE(*,*) 'Error in born_hel: should be called only with
 
1385
     $    calculatedborn = true'
 
1386
        STOP
 
1387
      ENDIF
 
1388
      ANS = 0D0
 
1389
      DO IHEL=1,NCOMB
 
1390
        WGT_HEL(IHEL)=0D0
 
1391
        IF (GOODHEL(IHEL,NFKSPROCESS)) THEN
 
1392
          WGT_HEL(IHEL)=BORN_HEL(P1,IHEL)/DBLE(IDEN)
 
1393
          ANS=ANS+WGT_HEL(IHEL)
 
1394
        ENDIF
 
1395
      ENDDO
 
1396
      END
 
1397
 
 
1398
 
 
1399
      REAL*8 FUNCTION BORN_HEL(P,HELL)
 
1400
C     
 
1401
C     Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
 
1402
C     By the MadGraph5_aMC@NLO Development Team
 
1403
C     Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
 
1404
C     RETURNS AMPLITUDE SQUARED SUMMED/AVG OVER COLORS
 
1405
C     FOR THE POINT WITH EXTERNAL LINES W(0:6,NEXTERNAL-1)
 
1406
 
 
1407
C     Process: g g > t t~ QED=0 QCD=2 [ QCD ]
 
1408
C     
 
1409
      IMPLICIT NONE
 
1410
C     
 
1411
C     CONSTANTS
 
1412
C     
 
1413
      INTEGER     NGRAPHS
 
1414
      PARAMETER ( NGRAPHS = 3 )
 
1415
      INTEGER    NCOLOR
 
1416
      PARAMETER (NCOLOR=2)
 
1417
      REAL*8     ZERO
 
1418
      PARAMETER (ZERO=0D0)
 
1419
      COMPLEX*16 IMAG1
 
1420
      PARAMETER (IMAG1 = (0D0,1D0))
 
1421
      INCLUDE 'nexternal.inc'
 
1422
      INCLUDE 'born_nhel.inc'
 
1423
C     
 
1424
C     ARGUMENTS 
 
1425
C     
 
1426
      REAL*8 P(0:3,NEXTERNAL-1)
 
1427
      INTEGER HELL
 
1428
C     
 
1429
C     LOCAL VARIABLES 
 
1430
C     
 
1431
      INTEGER I,J
 
1432
      REAL*8 DENOM(NCOLOR), CF(NCOLOR,NCOLOR)
 
1433
      COMPLEX*16 ZTEMP, AMP(NGRAPHS), JAMP(NCOLOR)
 
1434
C     
 
1435
C     GLOBAL VARIABLES
 
1436
C     
 
1437
      DOUBLE COMPLEX SAVEAMP(NGRAPHS,MAX_BHEL)
 
1438
      COMMON/TO_SAVEAMP/SAVEAMP
 
1439
      LOGICAL CALCULATEDBORN
 
1440
      COMMON/CCALCULATEDBORN/CALCULATEDBORN
 
1441
C     
 
1442
C     COLOR DATA
 
1443
C     
 
1444
      DATA DENOM(1)/3/
 
1445
      DATA (CF(I,  1),I=  1,  2) /   16,   -2/
 
1446
C     1 T(1,2,3,4)
 
1447
      DATA DENOM(2)/3/
 
1448
      DATA (CF(I,  2),I=  1,  2) /   -2,   16/
 
1449
C     1 T(2,1,3,4)
 
1450
C     ----------
 
1451
C     BEGIN CODE
 
1452
C     ----------
 
1453
      IF (.NOT. CALCULATEDBORN) THEN
 
1454
        WRITE(*,*) 'Error in born_hel.f: this should be called only
 
1455
     $    with calculatedborn = true'
 
1456
        STOP
 
1457
      ELSEIF (CALCULATEDBORN) THEN
 
1458
        DO I=1,NGRAPHS
 
1459
          AMP(I)=SAVEAMP(I,HELL)
 
1460
        ENDDO
 
1461
      ENDIF
 
1462
      JAMP(1)=+IMAG1*AMP(1)-AMP(2)
 
1463
      JAMP(2)=-IMAG1*AMP(1)-AMP(3)
 
1464
      BORN_HEL = 0.D0
 
1465
      DO I = 1, NCOLOR
 
1466
        ZTEMP = (0.D0,0.D0)
 
1467
        DO J = 1, NCOLOR
 
1468
          ZTEMP = ZTEMP + CF(J,I)*JAMP(J)
 
1469
        ENDDO
 
1470
        BORN_HEL =BORN_HEL+ZTEMP*DCONJG(JAMP(I))/DENOM(I)
 
1471
      ENDDO
 
1472
      END
 
1473
 
 
1474
 
 
1475
 
 
1476
"""  % misc.get_pkg_info()
 
1477
 
 
1478
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
1479
 
 
1480
        nflows = \
 
1481
            process_exporter.write_born_hel(
 
1482
                    writers.FortranWriter(self.give_pos('test')),
 
1483
                    self.myfks_me, 
 
1484
                    self.myfortranmodel)  
 
1485
 
 
1486
        self.assertFileContains('test', goal) 
 
1487
 
 
1488
 
 
1489
    def test_write_b_sf_fks(self):
 
1490
        """Tests the correct writing of a b_sf_xxx.f file, containing one color
 
1491
        linked born.
 
1492
        """
 
1493
        goal = \
 
1494
"""      SUBROUTINE SB_SF_001(P1,ANS)
 
1495
C     
 
1496
C     Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
 
1497
C     By the MadGraph5_aMC@NLO Development Team
 
1498
C     Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
 
1499
C     
 
1500
C     RETURNS AMPLITUDE SQUARED SUMMED/AVG OVER COLORS
 
1501
C     AND HELICITIES
 
1502
C     FOR THE POINT IN PHASE SPACE P(0:3,NEXTERNAL-1)
 
1503
C     
 
1504
C     Process: g g > t t~ QED=0 QCD=2 [ QCD ]
 
1505
C     spectators: 1 2 
 
1506
 
 
1507
C     
 
1508
      IMPLICIT NONE
 
1509
C     
 
1510
C     CONSTANTS
 
1511
C     
 
1512
      INCLUDE 'nexternal.inc'
 
1513
      INTEGER     NCOMB
 
1514
      PARAMETER ( NCOMB=  16 )
 
1515
      INTEGER    THEL
 
1516
      PARAMETER (THEL=NCOMB*8)
 
1517
      INTEGER NGRAPHS
 
1518
      PARAMETER (NGRAPHS=   3)
 
1519
C     
 
1520
C     ARGUMENTS 
 
1521
C     
 
1522
      REAL*8 P1(0:3,NEXTERNAL-1),ANS
 
1523
C     
 
1524
C     LOCAL VARIABLES 
 
1525
C     
 
1526
      INTEGER IHEL,IDEN,J
 
1527
      REAL*8 B_SF_001
 
1528
      INTEGER IDEN_VALUES(8)
 
1529
      DATA IDEN_VALUES /256, 256, 256, 256, 256, 256, 256, 256/
 
1530
C     
 
1531
C     GLOBAL VARIABLES
 
1532
C     
 
1533
      LOGICAL GOODHEL(NCOMB,8)
 
1534
      COMMON /C_GOODHEL/ GOODHEL
 
1535
      DOUBLE PRECISION SAVEMOM(NEXTERNAL-1,2)
 
1536
      COMMON/TO_SAVEMOM/SAVEMOM
 
1537
      LOGICAL CALCULATEDBORN
 
1538
      COMMON/CCALCULATEDBORN/CALCULATEDBORN
 
1539
      INTEGER NFKSPROCESS
 
1540
      COMMON/C_NFKSPROCESS/NFKSPROCESS
 
1541
C     ----------
 
1542
C     BEGIN CODE
 
1543
C     ----------
 
1544
      IDEN=IDEN_VALUES(NFKSPROCESS)
 
1545
      IF (CALCULATEDBORN) THEN
 
1546
        DO J=1,NEXTERNAL-1
 
1547
          IF (SAVEMOM(J,1).NE.P1(0,J) .OR. SAVEMOM(J,2).NE.P1(3
 
1548
     $     ,J)) THEN
 
1549
            CALCULATEDBORN=.FALSE.
 
1550
            WRITE(*,*) 'Error in sb_sf: momenta not the same in the
 
1551
     $        born'
 
1552
            STOP
 
1553
          ENDIF
 
1554
        ENDDO
 
1555
      ELSE
 
1556
        WRITE(*,*) 'Error in sb_sf: color_linked borns should be
 
1557
     $    called only with calculatedborn = true'
 
1558
        STOP
 
1559
      ENDIF
 
1560
      ANS = 0D0
 
1561
      DO IHEL=1,NCOMB
 
1562
        IF (GOODHEL(IHEL,NFKSPROCESS)) THEN
 
1563
          ANS=ANS+B_SF_001(P1,IHEL)
 
1564
        ENDIF
 
1565
      ENDDO
 
1566
      ANS=ANS/DBLE(IDEN)
 
1567
      END
 
1568
 
 
1569
 
 
1570
      REAL*8 FUNCTION B_SF_001(P,HELL)
 
1571
C     
 
1572
C     Generated by MadGraph5_aMC@NLO v. %(version)s, %(date)s
 
1573
C     By the MadGraph5_aMC@NLO Development Team
 
1574
C     Visit launchpad.net/madgraph5 and amcatnlo.web.cern.ch
 
1575
C     RETURNS AMPLITUDE SQUARED SUMMED/AVG OVER COLORS
 
1576
C     FOR THE POINT WITH EXTERNAL LINES W(0:6,NEXTERNAL-1)
 
1577
 
 
1578
C     Process: g g > t t~ QED=0 QCD=2 [ QCD ]
 
1579
C     spectators: 1 2 
 
1580
 
 
1581
C     
 
1582
      IMPLICIT NONE
 
1583
C     
 
1584
C     CONSTANTS
 
1585
C     
 
1586
      INTEGER     NGRAPHS
 
1587
      PARAMETER ( NGRAPHS = 3 )
 
1588
      INTEGER NCOLOR1, NCOLOR2
 
1589
      PARAMETER (NCOLOR1=2, NCOLOR2=3)
 
1590
      REAL*8     ZERO
 
1591
      PARAMETER (ZERO=0D0)
 
1592
      COMPLEX*16 IMAG1
 
1593
      PARAMETER (IMAG1 = (0D0,1D0))
 
1594
      INCLUDE 'nexternal.inc'
 
1595
      INCLUDE 'born_nhel.inc'
 
1596
C     
 
1597
C     ARGUMENTS 
 
1598
C     
 
1599
      REAL*8 P(0:3,NEXTERNAL-1)
 
1600
      INTEGER HELL
 
1601
C     
 
1602
C     LOCAL VARIABLES 
 
1603
C     
 
1604
      INTEGER I,J
 
1605
      REAL*8 DENOM(NCOLOR1), CF(NCOLOR2,NCOLOR1)
 
1606
      COMPLEX*16 ZTEMP, AMP(NGRAPHS), JAMP1(NCOLOR1), JAMP2(NCOLOR2)
 
1607
C     
 
1608
C     GLOBAL VARIABLES
 
1609
C     
 
1610
      DOUBLE COMPLEX SAVEAMP(NGRAPHS,MAX_BHEL)
 
1611
      COMMON/TO_SAVEAMP/SAVEAMP
 
1612
      LOGICAL CALCULATEDBORN
 
1613
      COMMON/CCALCULATEDBORN/CALCULATEDBORN
 
1614
C     
 
1615
C     COLOR DATA
 
1616
C     
 
1617
      DATA DENOM(1)/3/
 
1618
      DATA (CF(I,  1),I=  1,  3) /   16,   -2,    6/
 
1619
      DATA DENOM(2)/3/
 
1620
      DATA (CF(I,  2),I=  1,  3) /   -2,   16,    6/
 
1621
C     ----------
 
1622
C     BEGIN CODE
 
1623
C     ----------
 
1624
      IF (.NOT. CALCULATEDBORN) THEN
 
1625
        WRITE(*,*) 'Error in b_sf: color_linked borns should be called
 
1626
     $    only with calculatedborn = true'
 
1627
        STOP
 
1628
      ELSEIF (CALCULATEDBORN) THEN
 
1629
        DO I=1,NGRAPHS
 
1630
          AMP(I)=SAVEAMP(I,HELL)
 
1631
        ENDDO
 
1632
      ENDIF
 
1633
      JAMP1(1)=+IMAG1*AMP(1)-AMP(2)
 
1634
      JAMP1(2)=-IMAG1*AMP(1)-AMP(3)
 
1635
      JAMP2(1)=+1D0/2D0*(-3D0*IMAG1*AMP(1)+3D0*AMP(2))
 
1636
      JAMP2(2)=+1D0/2D0*(+3D0*IMAG1*AMP(1)+3D0*AMP(3))
 
1637
      JAMP2(3)=+1D0/2D0*(+AMP(2)+AMP(3))
 
1638
      B_SF_001 = 0.D0
 
1639
      DO I = 1, NCOLOR1
 
1640
        ZTEMP = (0.D0,0.D0)
 
1641
        DO J = 1, NCOLOR2
 
1642
          ZTEMP = ZTEMP + CF(J,I)*JAMP2(J)
 
1643
        ENDDO
 
1644
        B_SF_001 =B_SF_001+ZTEMP*DCONJG(JAMP1(I))/DENOM(I)
 
1645
      ENDDO
 
1646
      END
 
1647
 
 
1648
 
 
1649
 
 
1650
""" % misc.get_pkg_info()
 
1651
        
 
1652
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
1653
 
 
1654
        process_exporter.write_b_sf_fks(\
 
1655
            writers.FortranWriter(self.give_pos('test')),
 
1656
            self.myfks_me, 0, self.myfortranmodel)
 
1657
 
 
1658
        #print open(self.give_pos('test')).read()
 
1659
        self.assertFileContains('test', goal)
 
1660
 
 
1661
 
 
1662
    def test_write_born_nhel_file(self):
 
1663
        """tests if the born_nhel.inc file is correctly written"""
 
1664
        goal = \
 
1665
"""      INTEGER    MAX_BHEL, MAX_BCOL
 
1666
      PARAMETER (MAX_BHEL=16)
 
1667
      PARAMETER(MAX_BCOL=2)
 
1668
"""        
 
1669
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
1670
 
 
1671
        calls, ncolor = \
 
1672
            process_exporter.write_born_fks(
 
1673
                    writers.FortranWriter(self.give_pos('test1')),
 
1674
                    self.myfks_me,
 
1675
                    self.myfortranmodel)    
 
1676
 
 
1677
        nflows = \
 
1678
            process_exporter.write_leshouche_file(
 
1679
                    writers.FortranWriter(self.give_pos('test2')),
 
1680
                    self.myfks_me.born_matrix_element,
 
1681
                    self.myfortranmodel)  
 
1682
                
 
1683
        process_exporter.write_born_nhel_file(
 
1684
                    writers.FortranWriter(self.give_pos('test')),
 
1685
                    self.myfks_me.born_matrix_element,
 
1686
                    nflows,
 
1687
                    self.myfortranmodel,
 
1688
                    ncolor)  
 
1689
 
 
1690
        self.assertFileContains('test', goal) 
 
1691
 
 
1692
 
 
1693
    def test_write_nfksconfigs_file(self):
 
1694
        """tests if the nFKSconfigs.inc file is correctly written"""
 
1695
        goal = \
 
1696
"""      INTEGER FKS_CONFIGS
 
1697
      PARAMETER (FKS_CONFIGS=8)
 
1698
 
 
1699
 
 
1700
"""        
 
1701
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
1702
        process_exporter.write_nfksconfigs_file(\
 
1703
            writers.FortranWriter(self.give_pos('test')),
 
1704
            self.myfks_me,
 
1705
            self.myfortranmodel)
 
1706
        self.assertFileContains('test', goal)
 
1707
 
 
1708
 
 
1709
    def test_write_configs_file_born(self):
 
1710
        """Tests if the configs.inc file is corretly written 
 
1711
        for the born matrix element.
 
1712
        """
 
1713
        goal = \
 
1714
"""C     Diagram 1, Amplitude 1
 
1715
      DATA MAPCONFIG(   1)/   1/
 
1716
      DATA (IFOREST(I, -1,   1),I=1,2)/  4,  3/
 
1717
      DATA SPROP(  -1,   1)/      21/
 
1718
C     Diagram 2, Amplitude 2
 
1719
      DATA MAPCONFIG(   2)/   2/
 
1720
      DATA (IFOREST(I, -1,   2),I=1,2)/  1,  3/
 
1721
      DATA TPRID(  -1,   2)/       6/
 
1722
      DATA (IFOREST(I, -2,   2),I=1,2)/ -1,  4/
 
1723
C     Diagram 3, Amplitude 3
 
1724
      DATA MAPCONFIG(   3)/   3/
 
1725
      DATA (IFOREST(I, -1,   3),I=1,2)/  1,  4/
 
1726
      DATA TPRID(  -1,   3)/       6/
 
1727
      DATA (IFOREST(I, -2,   3),I=1,2)/ -1,  3/
 
1728
C     Number of configs
 
1729
      DATA MAPCONFIG(0)/   3/
 
1730
"""
 
1731
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
1732
        
 
1733
        nconfigs, mapconfigs, s_and_t_channels = \
 
1734
            process_exporter.write_configs_file(
 
1735
                    writers.FortranWriter(self.give_pos('test')),
 
1736
                    self.myfks_me.born_matrix_element,
 
1737
                    self.myfortranmodel)
 
1738
 
 
1739
        self.assertFileContains('test', goal)    
 
1740
 
 
1741
    
 
1742
    def test_write_props_file_born(self):
 
1743
        """Tests if the props.inc file is corretly written 
 
1744
        for the born matrix element.
 
1745
        """
 
1746
        goal = \
 
1747
"""      PMASS( -1,   1)  = ZERO
 
1748
      PWIDTH( -1,   1) = ZERO
 
1749
      POW( -1,   1) = 2
 
1750
      PMASS( -1,   2)  = ABS(MT)
 
1751
      PWIDTH( -1,   2) = ABS(WT)
 
1752
      POW( -1,   2) = 1
 
1753
      PMASS( -1,   3)  = ABS(MT)
 
1754
      PWIDTH( -1,   3) = ABS(WT)
 
1755
      POW( -1,   3) = 1
 
1756
"""
 
1757
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
1758
        
 
1759
        nconfigs, mapconfigs, s_and_t_channels = \
 
1760
            process_exporter.write_configs_file(
 
1761
                    writers.FortranWriter(self.give_pos('test1')),
 
1762
                    self.myfks_me.born_matrix_element,
 
1763
                    self.myfortranmodel)
 
1764
        
 
1765
        process_exporter.write_props_file(
 
1766
                    writers.FortranWriter(self.give_pos('test')),
 
1767
                    self.myfks_me.born_matrix_element,
 
1768
                    self.myfortranmodel,
 
1769
                    s_and_t_channels)        
 
1770
 
 
1771
        self.assertFileContains('test', goal)    
 
1772
 
 
1773
 
 
1774
    def test_write_coloramps_file(self):
 
1775
        """Tests if the coloramps.inc file is corretly written 
 
1776
        for the born process
 
1777
        """
 
1778
        goal = \
 
1779
"""      LOGICAL ICOLAMP(2,3,1)
 
1780
      DATA(ICOLAMP(I,1,1),I=1,2)/.TRUE.,.TRUE./
 
1781
      DATA(ICOLAMP(I,2,1),I=1,2)/.TRUE.,.FALSE./
 
1782
      DATA(ICOLAMP(I,3,1),I=1,2)/.FALSE.,.TRUE./
 
1783
"""
 
1784
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
1785
 
 
1786
        nconfigs, mapconfigs, s_and_t_channels = \
 
1787
            process_exporter.write_configs_file(
 
1788
                    writers.FortranWriter(self.give_pos('test1')),
 
1789
                    self.myfks_me.born_matrix_element,
 
1790
                    self.myfortranmodel)
 
1791
        
 
1792
        process_exporter.write_coloramps_file(
 
1793
                    writers.FortranWriter(self.give_pos('test')),
 
1794
                    mapconfigs,
 
1795
                    self.myfks_me.born_matrix_element,
 
1796
                    self.myfortranmodel)        
 
1797
 
 
1798
        self.assertFileContains('test', goal)    
 
1799
 
 
1800
 
 
1801
    def test_write_decayBW_file(self):
 
1802
        """Tests if the decayBW.inc file is correctly written 
 
1803
        for the born process.
 
1804
        """
 
1805
        goal = \
 
1806
"""      DATA GFORCEBW(-1,1)/.FALSE./
 
1807
"""
 
1808
 
 
1809
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
1810
 
 
1811
        nconfigs, mapconfigs, s_and_t_channels = \
 
1812
            process_exporter.write_configs_file(
 
1813
                    writers.FortranWriter(self.give_pos('test1')),
 
1814
                    self.myfks_me.born_matrix_element,
 
1815
                    self.myfortranmodel)
 
1816
 
 
1817
        process_exporter.write_decayBW_file(
 
1818
                    writers.FortranWriter(self.give_pos('test')),
 
1819
                    s_and_t_channels)        
 
1820
 
 
1821
        self.assertFileContains('test', goal)    
 
1822
 
 
1823
 
 
1824
 
 
1825
 
 
1826
    def test_get_fks_j_from_i_lines(self):
 
1827
        """Test that the lines corresponding to the fks_j_from_i array, to be 
 
1828
        written in fks.inc. 
 
1829
        """
 
1830
        lines = ['DATA (FKS_J_FROM_I_D(2, 5, JPOS), JPOS = 0, 1)  / 1, 1 /','']
 
1831
 
 
1832
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
1833
        self.assertEqual(lines, process_exporter.get_fks_j_from_i_lines(self.myfks_me.real_processes[1], 2))
 
1834
 
 
1835
 
 
1836
    def test_get_color_data_lines_from_color_matrix(self):
 
1837
        """tests if the color data lines are correctly extracted from a given
 
1838
        color matrix. 
 
1839
        The first color link is used.
 
1840
        """
 
1841
        
 
1842
        goal = ["DATA DENOM(1)/3/",
 
1843
                "DATA (CF(I,  1),I=  1,  3) /   16,   -2,    6/",
 
1844
                "DATA DENOM(2)/3/",
 
1845
                "DATA (CF(I,  2),I=  1,  3) /   -2,   16,    6/"
 
1846
                ]
 
1847
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
1848
 
 
1849
        lines = process_exporter.get_color_data_lines_from_color_matrix(
 
1850
                    self.myfks_me.color_links[0]['link_matrix'])
 
1851
        
 
1852
        for line, goalline in zip(lines, goal):
 
1853
            self.assertEqual(line.upper(), goalline)        
 
1854
 
 
1855
 
 
1856
    def test_den_factor_lines(self):
 
1857
        """Tests if the den_factor lines for a given matrix element are correctly 
 
1858
        returned.
 
1859
        """
 
1860
        
 
1861
        goal = \
 
1862
            ["INTEGER IDEN_VALUES(8)",
 
1863
             "DATA IDEN_VALUES /256, 256, 256, 256, 256, 256, 256, 256/"]
 
1864
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
1865
 
 
1866
        self.assertEqual(goal,
 
1867
                process_exporter.get_den_factor_lines(
 
1868
                        self.myfks_me))
 
1869
 
 
1870
 
 
1871
    def test_write_ij_lines(self):
 
1872
        """Tests if the ij lines for a given matrix element are correctly 
 
1873
        returned.
 
1874
        """
 
1875
        
 
1876
        goal = \
 
1877
            ["INTEGER IJ_VALUES(8)",
 
1878
             "DATA IJ_VALUES /1, 2, 3, 4, 1, 1, 2, 2/"]
 
1879
        process_exporter = export_fks.ProcessExporterFortranFKS()
 
1880
 
 
1881
        self.assertEqual(goal,
 
1882
                process_exporter.get_ij_lines(
 
1883
                        self.myfks_me))
 
1884
 
 
1885
 
 
1886