Merge lp:~madteam/mg5amcnlo/new_color_stuffs into lp:~maddevelopers/mg5amcnlo/combine_v0_6_0

Proposed by Johan Alwall
Status: Merged
Merged at revision: 61
Proposed branch: lp:~madteam/mg5amcnlo/new_color_stuffs
Merge into: lp:~maddevelopers/mg5amcnlo/combine_v0_6_0
Diff against target: 5804 lines (+4775/-200) (has conflicts)
39 files modified
.project (+1/-1)
.pydevproject (+10/-0)
madgraph/core/base_objects.py (+2/-2)
madgraph/core/color_algebra.py (+277/-4)
madgraph/core/color_amp.py (+96/-27)
madgraph/core/diagram_generation.py (+1/-0)
madgraph/core/helas_objects.py (+100/-51)
madgraph/interface/cmd_interface.py (+20/-16)
madgraph/iolibs/helas_call_writers.py (+9/-9)
madgraph/iolibs/import_v4.py (+14/-12)
madgraph/various/process_checks.py (+10/-16)
models/import_ufo.py (+12/-13)
models/sextet_diquarks/__init__.py (+15/-0)
models/sextet_diquarks/couplings.py (+131/-0)
models/sextet_diquarks/function_library.py (+54/-0)
models/sextet_diquarks/lorentz.py (+79/-0)
models/sextet_diquarks/object_library.py (+194/-0)
models/sextet_diquarks/parameters.py (+253/-0)
models/sextet_diquarks/particles.py (+400/-0)
models/sextet_diquarks/vertices.py (+383/-0)
models/sextet_diquarks/write_param_card.py (+65/-0)
models/triplet_diquarks/Epsijk_SM_UFO.log (+65/-0)
models/triplet_diquarks/__init__.py (+15/-0)
models/triplet_diquarks/couplings.py (+127/-0)
models/triplet_diquarks/function_library.py (+54/-0)
models/triplet_diquarks/lorentz.py (+79/-0)
models/triplet_diquarks/object_library.py (+194/-0)
models/triplet_diquarks/parameters.py (+245/-0)
models/triplet_diquarks/particles.py (+400/-0)
models/triplet_diquarks/vertices.py (+371/-0)
models/triplet_diquarks/write_param_card.py (+65/-0)
tests/acceptance_tests/test_cmd.py (+55/-0)
tests/parallel_tests/me_comparator.py (+29/-1)
tests/parallel_tests/sample_script.py (+32/-2)
tests/unit_tests/core/test_color_algebra.py (+216/-1)
tests/unit_tests/core/test_color_amp.py (+67/-29)
tests/unit_tests/core/test_helas_objects.py (+6/-3)
tests/unit_tests/iolibs/test_export_v4.py (+120/-13)
tests/unit_tests/various/test_diquark_models.py (+509/-0)
Text conflict in madgraph/various/process_checks.py
Text conflict in tests/parallel_tests/me_comparator.py
Text conflict in tests/parallel_tests/sample_script.py
To merge this branch: bzr merge lp:~madteam/mg5amcnlo/new_color_stuffs
Reviewer Review Type Date Requested Status
Olivier Mattelaer Approve
FabioMaltoni Pending
Review via email: mp+41756@code.launchpad.net

Description of the change

Overhaul of the color modules:
- Added support for color sextets and Epsilon^{ijk}
- Changed ordering of particles in color calculation, to agree with UFO standard (ordering according to interaction order)
- Moved resulting particle in wavefunction to first in the color calculation, giving more reasonable naming of wavefunctions (VVVV_1 instead of VVVV_4 for 4-gluon vertices)

To post a comment you must log in.
98. By Johan Alwall <alwall@alwall-laptop>

Updated triplet coupling to reflect factor 1/sqrt(2) between Epsilon and K3. Need test though

Revision history for this message
Olivier Mattelaer (olivier-mattelaer) wrote :
Download full text (3.4 KiB)

Excellent!!

Did you run an extensive parralel test, since those changes are quite deep in the code.
Otherwise I've some very minor comment/question:

1) madgraph/core/helas_objects.py
line 770
is the comment:
# take the last index in case of identical particles
still makes sense?

2) madgraph/core/helas_objects.py
line 814 + 1537.

why not:
 mothers = self.get('mothers')
    if not mothers:
         return vertices
 for mother in mothers

3) madgraph/core/helas_objects.py
line: 1255
Add comment to explain what are the effect and the usefullness of my_pdg_code.
Should it have a default value (potentially to None or 0)?

4) madgraph/core/helas_objects.py
line: 1814
not beautifull indentation (not 4 spaces).
+ should specify the reason of the zero in
mothers.sort_by_pdg_codes(self.get('pdg_codes'), 0)
either by putting my_pdg_code=0 or by removing it
(and assign my_pdg_code a default value --my favourite options--)

5) This part can certainly be optimised in a better way. (That's not crucial)
@@ -246,32 +249,31 @@
1036 elif colors == [-3, 3]:
1037 # triplet-triplet-singlet coupling
1038 myinter.set('color', [color.ColorString(\
1039 - [color.T(1, 0)])])
1040 + [color.T(ind[1], ind[0])])])

Could you explain to me why you need to change this?

6)
+++ madgraph/various/process_checks.py 2010-11-29 00:15:14 +0000
1079 @@ -221,6 +221,9 @@
1080 # Add this process to tested_processes
1081 sorted_ids.append(ids)
1082
1083 + # Skip adding antiprocess below, since might be relevant too
1084 + return False
1085 +

Shouldn't we remove the code after the return False?

7) models/import_ufo
line 256:
Shouldn't we remove those lines? (or explain why they are commented)
        # Compute how change indices to match MG5 convention
        #info = [(i+1,part.color) for i,part in enumerate(interaction_info.particles)
        # if part.color!=1]
        #order = sorted(info, lambda p1, p2:p1[1] - p2[1])

        #new_indices={}
 #for i,(j, pcolor) in enumerate(order):
        # new_indices[j]=i

8) madgraph/core/color_algebra.py
line: 321

Basic verification that everything is normal, should be done in principle only in debug mode:
(except if you worried about wrong model input)
then I would suggest to replace
+ if len(args...

Read more...

review: Needs Information
Revision history for this message
Johan Alwall (johan-alwall) wrote :

Many thanks for an excellent review. Please see the following for
answers to the comments.

> Did you run an extensive parralel test, since those changes are quite deep in the code.

I ran a number of parallel tests, but we should run the complete list
before merging combine_v0_6_0 to trunk.

> 1) madgraph/core/helas_objects.py
> 2) madgraph/core/helas_objects.py
> 3) madgraph/core/helas_objects.py
All fixed.

> 4) madgraph/core/helas_objects.py
> line: 1814
It is 4 spaces, just that the line continuation is lined up at 3
spaces (to simplify reading the if statement).
> (and assign my_pdg_code a default value --my favourite options--)
Done.

> 5) This part can certainly be optimised in a better way. (That's not crucial)
> @@ -246,32 +249,31 @@
> 1036                     elif colors == [-3, 3]:
> 1037                         # triplet-triplet-singlet coupling
> 1038                         myinter.set('color', [color.ColorString(\
> 1039    -                        [color.T(1, 0)])])
> 1040    +                        [color.T(ind[1], ind[0])])])
For e.g. u~ n1 su1, it is not indices 1,0, but ind[1], ind[0].
> Could you explain to me why you need to change this?
I changed the color indices to conform with the actual order of
particles in the interaction (in accordance with the convention in UFO
model files).

> 6)
> 7) models/import_ufo
> 8) madgraph/core/color_algebra.py
> 9) Same comment for Epsilon_Bar/K6/... definition
All done!

99. By Johan Alwall

Fixes according to review. Many thanks Olivier.

Revision history for this message
Olivier Mattelaer (olivier-mattelaer) wrote :

Perfect!!!!!

Thanks

Olivier

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file '.project'
2--- .project 2010-05-20 12:24:23 +0000
3+++ .project 2010-12-15 07:31:31 +0000
4@@ -1,6 +1,6 @@
5 <?xml version="1.0" encoding="UTF-8"?>
6 <projectDescription>
7- <name>correct_tuto_bug</name>
8+ <name>MG-new_color_stuff</name>
9 <comment></comment>
10 <projects>
11 </projects>
12
13=== added file '.pydevproject'
14--- .pydevproject 1970-01-01 00:00:00 +0000
15+++ .pydevproject 2010-12-15 07:31:31 +0000
16@@ -0,0 +1,10 @@
17+<?xml version="1.0" encoding="UTF-8"?>
18+<?eclipse-pydev version="1.0"?>
19+
20+<pydev_project>
21+<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.6</pydev_property>
22+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
23+<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
24+<path>/MG-new_color_stuff</path>
25+</pydev_pathproperty>
26+</pydev_project>
27
28=== modified file 'madgraph/core/base_objects.py'
29--- madgraph/core/base_objects.py 2010-12-09 20:01:53 +0000
30+++ madgraph/core/base_objects.py 2010-12-15 07:31:31 +0000
31@@ -312,7 +312,7 @@
32 def get_color(self):
33 """Return the color code with a correct minus sign"""
34
35- if not self['is_part'] and self['color'] in [3, 6]:
36+ if not self['is_part'] and abs(self['color']) in [3, 6]:
37 return - self['color']
38 else:
39 return self['color']
40@@ -321,7 +321,7 @@
41 """Return the color code of the antiparticle with a correct minus sign
42 """
43
44- if self['is_part'] and self['color'] in [3, 6]:
45+ if self['is_part'] and self['color'] not in [1, 8]:
46 return - self['color']
47 else:
48 return self['color']
49
50=== modified file 'madgraph/core/color_algebra.py'
51--- madgraph/core/color_algebra.py 2010-08-13 08:25:50 +0000
52+++ madgraph/core/color_algebra.py 2010-12-15 07:31:31 +0000
53@@ -60,6 +60,7 @@
54 reversed. Can be overwritten for specific color objects like T,..."""
55
56 self.reverse()
57+ return self
58
59 def replace_indices(self, repl_dict):
60 """Replace current indices following the rules listed in the replacement
61@@ -216,6 +217,7 @@
62 col_obj[:-2] + \
63 array.array('i', [ij1[0],
64 ij2[1]])))])])
65+
66 # T(a,x,b,i,j)T(c,x,d,k,l) = 1/2(T(a,d,i,l)T(c,b,k,j)
67 # -1/Nc T(a,b,i,j)T(c,d,k,l))
68 for i1, index1 in enumerate(self[:-2]):
69@@ -252,6 +254,7 @@
70 l2 = self[-2:]
71 l2.reverse()
72 self[:] = l1 + l2
73+ return self
74
75 #===============================================================================
76 # f
77@@ -305,6 +308,263 @@
78 return ColorFactor([col_str1, col_str2])
79
80 #===============================================================================
81+# Epsilon and EpsilonBar, the totally antisymmetric tensors of three triplet
82+# (antitriplet) indices
83+#===============================================================================
84+class Epsilon(ColorObject):
85+ """Epsilon_ijk color object for three triplets"""
86+
87+ def __init__(self, *args):
88+ """Ensure e_ijk objects have strictly 3 indices"""
89+
90+ super(Epsilon, self).__init__()
91+ assert len(args) == 3, "Epsilon objects must have three indices!"
92+
93+ def pair_simplify(self, col_obj):
94+ """Implement e_ijk ae_ilm = T(j,l)T(k,m) - T(j,m)T(k,l) and
95+ e_ijk T(l,k) = e_ikl"""
96+
97+ # e_ijk ae_ilm = T(j,l)T(k,m) - T(j,m)T(k,l)
98+ if isinstance(col_obj, EpsilonBar):
99+
100+ incommon = False
101+ eps_indices = self[:]
102+ aeps_indices = col_obj[:]
103+ for i in self:
104+ if i in col_obj:
105+ incommon = True
106+ com_index_eps = self.index(i)
107+ com_index_aeps = col_obj.index(i)
108+
109+ if incommon:
110+ eps_indices = self[com_index_eps:] + self[:com_index_eps]
111+ aeps_indices = col_obj[com_index_aeps:] + col_obj[:com_index_aeps]
112+ col_str1 = ColorString([T(eps_indices[1], aeps_indices[1]),
113+ T(eps_indices[2], aeps_indices[2])])
114+ col_str2 = ColorString([T(eps_indices[1], aeps_indices[2]),
115+ T(eps_indices[2], aeps_indices[1])])
116+
117+ col_str2.coeff = fractions.Fraction(-1, 1)
118+
119+ return ColorFactor([col_str1, col_str2])
120+
121+ # e_ijk T(l,k) = e_ikl
122+ if isinstance(col_obj, T) and len(col_obj) == 2 and col_obj[1] in self:
123+
124+ com_index = self.index(col_obj[1])
125+ new_self = copy.copy(self)
126+ new_self[com_index] = col_obj[0]
127+
128+ return ColorFactor([ColorString([new_self])])
129+
130+
131+ def complex_conjugate(self):
132+ """Complex conjugation. Overwritten here because complex conjugation
133+ interchange triplets and antitriplets."""
134+
135+ return EpsilonBar(*self)
136+
137+
138+class EpsilonBar(ColorObject):
139+ """Epsilon_ijk color object for three antitriplets"""
140+
141+ def __init__(self, *args):
142+ """Ensure e_ijk objects have strictly 3 indices"""
143+
144+ super(EpsilonBar, self).__init__()
145+ assert len(args) == 3, "EpsilonBar objects must have three indices!"
146+
147+ def pair_simplify(self, col_obj):
148+ """Implement ebar_ijk T(k,l) = e_ikl"""
149+
150+ # ebar_ijk T(k,l) = ebar_ijl
151+ if isinstance(col_obj, T) and len(col_obj) == 2 and col_obj[0] in self:
152+
153+ com_index = self.index(col_obj[0])
154+ new_self = copy.copy(self)
155+ new_self[com_index] = col_obj[1]
156+
157+ return ColorFactor([ColorString([new_self])])
158+
159+
160+ def complex_conjugate(self):
161+ """Complex conjugation. Overwritten here because complex conjugation
162+ interchange triplets and antitriplets."""
163+
164+ return Epsilon(*self)
165+
166+
167+#===============================================================================
168+# Color sextet objects: K6, K6Bar, T6
169+# Note that delta3 = T, delta6 = T6, delta8 = 1/2 Tr
170+#===============================================================================
171+
172+class K6(ColorObject):
173+ """K6, the symmetry clebsch coefficient, mapping into the symmetric
174+ tensor."""
175+
176+ def __init__(self, *args):
177+ """Ensure sextet color objects have strictly 3 indices"""
178+
179+ super(K6, self).__init__()
180+ assert len(args) == 3, "sextet color objects must have three indices!"
181+
182+ def pair_simplify(self, col_obj):
183+ """Implement the replacement rules
184+ K6(m,i,j)K6Bar(m,k,l) = 1/2(delta3(l,i)delta3(k,j)
185+ + delta3(k,i)delta3(l,j))
186+ = 1/2(T(l,i)T(k,j) + T(k,i)T(l,j))
187+ K6(m,i,j)K6Bar(n,j,i) = delta6(m,n)
188+ K6(m,i,j)K6Bar(n,i,j) = delta6(m,n)
189+ delta3(i,j)K6(m,i,k) = K6(m,j,k)
190+ delta3(i,k)K6(m,j,i) = K6(m,j,k)."""
191+
192+ if isinstance(col_obj, K6Bar):
193+
194+ m = self[0]
195+ n = col_obj[0]
196+
197+ ij1 = self[-2:]
198+ ij2 = col_obj[-2:]
199+
200+ # K6(m,i,j)K6Bar(m,k,l) = 1/2(T(l,i)T(k,j)
201+ # + T(k,i)T(l,j)
202+ if m == n:
203+ col_str1 = ColorString([T(ij2[1], ij1[0]),
204+ T(ij2[0], ij1[1])])
205+ col_str2 = ColorString([T(ij2[0], ij1[0]),
206+ T(ij2[1], ij1[1])])
207+ col_str1.coeff = fractions.Fraction(1, 2)
208+ col_str2.coeff = fractions.Fraction(1, 2)
209+
210+ return ColorFactor([col_str1, col_str2])
211+
212+ # K6(m,i,j)K6Bar(n,j,i) = delta6(m,n)
213+ if ij1[1] == ij2[0] and ij1[0] == ij2[1]:
214+ return ColorFactor([ColorString([T6(m, n)])])
215+
216+ # K6(m,i,j)K6Bar(n,i,j) = delta6(m,n)
217+ if ij1[0] == ij2[0] and ij1[1] == ij2[1]:
218+ return ColorFactor([ColorString([T6(m, n)])])
219+
220+ if isinstance(col_obj, T) and len(col_obj) == 2:
221+ # delta3(i,j)K6(m,i,k) = K6(m,j,k)
222+ # delta3(i,k)K6(m,j,i) = K6(m,j,k)
223+ if col_obj[0] in self[-2:]:
224+ index1 = self[-2:].index(col_obj[0])
225+ return ColorFactor([ColorString([K6(self[0],
226+ self[2-index1],
227+ col_obj[1])])])
228+
229+ def complex_conjugate(self):
230+ """Complex conjugation. By default, the ordering of color index is
231+ reversed. Can be overwritten for specific color objects like T,..."""
232+
233+ return K6Bar(*self)
234+
235+
236+class K6Bar(ColorObject):
237+ """K6Bar, the barred symmetry clebsch coefficient, mapping into the symmetric
238+ tensor."""
239+
240+ def __init__(self, *args):
241+ """Ensure sextet color objects have strictly 3 indices"""
242+
243+ super(K6Bar, self).__init__()
244+ assert len(args) == 3, "sextet color objects must have three indices!"
245+
246+ def pair_simplify(self, col_obj):
247+ """Implement the replacement rules
248+ delta3(i,j)K6Bar(m,j,k) = K6Bar(m,i,k)
249+ delta3(k,j)K6Bar(m,i,j) = K6Bar(m,i,k)."""
250+
251+ if isinstance(col_obj, T) and len(col_obj) == 2:
252+ # delta3(i,j)K6Bar(m,j,k) = K6Bar(m,i,k)
253+ # delta3(k,j)K6Bar(m,i,j) = K6Bar(m,i,k)
254+ if col_obj[1] in self[-2:]:
255+ index1 = self[-2:].index(col_obj[1])
256+ return ColorFactor([ColorString([K6Bar(self[0],
257+ self[2-index1],
258+ col_obj[0])])])
259+
260+ def complex_conjugate(self):
261+ """Complex conjugation. By default, the ordering of color index is
262+ reversed. Can be overwritten for specific color objects like T,..."""
263+
264+ return K6(*self)
265+
266+class T6(ColorObject):
267+ """The T6 sextet trace color object."""
268+
269+ new_index = 10000
270+
271+ def __init__(self, *args):
272+ """Check for exactly three indices"""
273+
274+ super(T6, self).__init__()
275+ assert len(args) >= 2 and len(args) <= 3, \
276+ "T6 objects must have two or three indices!"
277+
278+ def simplify(self):
279+ """Implement delta6(i,i) = 1/2 Nc(Nc+1),
280+ T6(a,i,j) = 2(K6(i,ii,jj)T(a,jj,kk)K6Bar(j,kk,ii))"""
281+
282+ # delta6(i,i) = Nc
283+ if len(self) == 2 and self[0] == self[1]:
284+ col_str1 = ColorString()
285+ col_str1.Nc_power = 2
286+ col_str1.coeff = fractions.Fraction(1, 2)
287+ col_str2 = ColorString()
288+ col_str2.Nc_power = 1
289+ col_str2.coeff = fractions.Fraction(1, 2)
290+ return ColorFactor([col_str1, col_str2])
291+
292+ if len(self) == 2:
293+ return
294+
295+ # Set new indices according to the Mathematica template
296+ ii = T6.new_index
297+ jj = ii + 1
298+ kk = jj + 1
299+ T6.new_index += 3
300+ # Create the resulting color objects
301+ col_string = ColorString([K6(self[1], ii, jj),
302+ T(self[0], jj, kk),
303+ K6Bar(self[2], kk, ii)])
304+ col_string.coeff = fractions.Fraction(2, 1)
305+ return ColorFactor([col_string])
306+
307+ def pair_simplify(self, col_obj):
308+ """Implement the replacement rules
309+ delta6(i,j)delta6(j,k) = delta6(i,k)
310+ delta6(m,n)K6(n,i,j) = K6(m,i,j)
311+ delta6(m,n)K6Bar(m,i,j) = K6Bar(n,i,j)."""
312+
313+ if len(self) == 3:
314+ return
315+
316+ if isinstance(col_obj, T6) and len(col_obj) == 2:
317+ #delta6(i,j)delta6(j,k) = delta6(i,k)
318+ if col_obj[0] == self[1]:
319+ return ColorFactor([ColorString([T6(self[0],
320+ col_obj[1])])])
321+
322+ if isinstance(col_obj, K6):
323+ # delta6(m,n)K6(n,i,j) = K6(m,i,j)
324+ if col_obj[0] == self[1]:
325+ return ColorFactor([ColorString([K6(self[0],
326+ col_obj[1],
327+ col_obj[2])])])
328+
329+
330+ if isinstance(col_obj, K6Bar):
331+ # delta6(m,n)K6Bar(m,i,j) = K6Bar(n,i,j)."""
332+ if col_obj[0] == self[0]:
333+ return ColorFactor([ColorString([K6Bar(self[1],
334+ col_obj[1],
335+ col_obj[2])])])
336+
337+#===============================================================================
338 # ColorString
339 #===============================================================================
340 class ColorString(list):
341@@ -371,7 +631,7 @@
342 """Simplify the current ColorString by applying simplify rules on
343 each element and building a new ColorFactor to return if necessary"""
344
345- # First, try sto simplify element by element
346+ # First, try to simplify element by element
347 for i1, col_obj1 in enumerate(self):
348 res = col_obj1.simplify()
349 # If a simplification possibility is found...
350@@ -388,6 +648,7 @@
351 # remains the same for comparison
352 first_col_str.sort()
353 res_col_factor.append(first_col_str)
354+
355 return res_col_factor
356
357 # Second, try to simplify pairs
358@@ -419,9 +680,10 @@
359 def complex_conjugate(self):
360 """Returns the complex conjugate of the current color string"""
361
362- compl_conj_str = copy.copy(self)
363- for col_obj in compl_conj_str:
364- col_obj.complex_conjugate()
365+ compl_conj_str = ColorString([], self.coeff, self.is_imaginary,
366+ self.Nc_power)
367+ for col_obj in self:
368+ compl_conj_str.append(col_obj.complex_conjugate())
369 if compl_conj_str.is_imaginary:
370 compl_conj_str.coeff = -compl_conj_str.coeff
371
372@@ -551,6 +813,17 @@
373 self.is_imaginary == col_str.is_imaginary and \
374 self.to_canonical() == col_str.to_canonical()
375
376+ def near_equivalent(self, col_str):
377+ """Check if two color strings are equivalent looking only at
378+ the color objects (used in color flow string calculation)"""
379+
380+ if len(self.to_canonical()) != len(col_str.to_canonical()):
381+ return False
382+
383+ return all([co1[0] == co2[0] and sorted(co1[1]) == sorted(co2[1]) \
384+ for (co1,co2) in zip(self.to_canonical()[0],
385+ col_str.to_canonical()[0])])
386+
387 #===============================================================================
388 # ColorFactor
389 #===============================================================================
390
391=== modified file 'madgraph/core/color_amp.py'
392--- madgraph/core/color_amp.py 2010-08-13 08:25:50 +0000
393+++ madgraph/core/color_amp.py 2010-12-15 07:31:31 +0000
394@@ -106,10 +106,13 @@
395 # can be negative for anti particles
396
397 color_num_pairs = []
398+ pdg_codes = []
399
400 for index, leg in enumerate(vertex.get('legs')):
401 curr_num = leg.get('number')
402- curr_color = model.get('particle_dict')[leg.get('id')].get_color()
403+ curr_part = model.get('particle_dict')[leg.get('id')]
404+ curr_color = curr_part.get_color()
405+ curr_pdg = curr_part.get_pdg_code()
406
407 # If this is the next-to-last vertex and the last vertex is
408 # the special identity id=0, start by applying the replacement rule
409@@ -123,8 +126,8 @@
410 # before an id=0 vertex, replace last index by a new summed index.
411 if index == len(vertex.get('legs')) - 1 and \
412 vertex != diagram.get('vertices')[-1]:
413- curr_color = \
414- model.get('particle_dict')[leg.get('id')].get_anti_color()
415+ curr_color = curr_part.get_anti_color()
416+ curr_pdg = curr_part.get_anti_pdg_code()
417 if not id0_rep:
418 repl_dict[curr_num] = min_index
419 min_index = min_index - 1
420@@ -135,14 +138,32 @@
421 except KeyError:
422 pass
423
424- # Discard color singlets
425- if curr_color != 1:
426- color_num_pairs.append((curr_color, curr_num))
427-
428- # Order the color/number pairs according to increasing color (assumed
429- # to be the ordering choose in interactions.py). For identical colors,
430- # keep the normal leg ordering.
431- color_num_pairs = sorted(color_num_pairs, lambda p1, p2:p1[0] - p2[0])
432+ color_num_pairs.append((curr_color, curr_num))
433+ pdg_codes.append(curr_pdg)
434+
435+ if vertex != diagram.get('vertices')[-1]:
436+ # Put the resulting wavefunction first, to make
437+ # wavefunction call more natural
438+ last_color_num = color_num_pairs.pop(-1)
439+ color_num_pairs.insert(0, last_color_num)
440+ last_pdg = pdg_codes.pop(-1)
441+ pdg_codes.insert(0, last_pdg)
442+
443+ # Order the legs according to the interaction particles
444+ interaction_pdgs = [p.get_pdg_code() for p in \
445+ model.get_interaction(vertex.get('id')).\
446+ get('particles')]
447+
448+ sorted_color_num_pairs = []
449+ for i, pdg in enumerate(interaction_pdgs):
450+ index = pdg_codes.index(pdg)
451+ pdg_codes.pop(index)
452+ sorted_color_num_pairs.append(color_num_pairs.pop(index))
453+
454+ if color_num_pairs:
455+ raise base_objects.PhysicsObject.PhysicsObjectError
456+
457+ color_num_pairs = sorted_color_num_pairs
458
459 # Create a list of associated leg number following the same order
460 list_numbers = [p[1] for p in color_num_pairs]
461@@ -199,6 +220,7 @@
462 new_col_str_chain.product(mod_col_str)
463 new_res_dict[tuple(list(ind_chain) + [i])] = \
464 new_col_str_chain
465+
466 return (min_index, new_res_dict)
467
468
469@@ -210,7 +232,6 @@
470
471 # loop over possible color chains
472 for col_chain, col_str in colorize_dict.items():
473-
474 # Create a canonical immutable representation of the the string
475 canonical_rep, rep_dict = col_str.to_canonical()
476
477@@ -345,10 +366,34 @@
478
479 # Add one T per external octet
480 for indices in octet_indices:
481- my_cf[0].append(color_algebra.T(indices[0],
482- indices[1],
483- indices[2]))
484-
485+ if indices[0] == -6:
486+ # Add a K6 which contracts the antisextet index to a
487+ # pair of antitriplets
488+ my_cf[0].append(color_algebra.K6(indices[1],
489+ indices[2],
490+ indices[3]))
491+ # ... and then contract the pair of antitriplets to a
492+ # single triplet
493+ my_cf[0].append(color_algebra.Epsilon(indices[2],
494+ indices[3],
495+ indices[4]))
496+ if indices[0] == 6:
497+ # Add a K6Bar which contracts the sextet index to a
498+ # pair of triplets
499+ my_cf[0].append(color_algebra.K6Bar(indices[1],
500+ indices[2],
501+ indices[3]))
502+ # ... and then contract the pair of triplets to a
503+ # single antitriplet
504+ my_cf[0].append(color_algebra.EpsilonBar(indices[2],
505+ indices[3],
506+ indices[4]))
507+ if indices[0] == 8:
508+ # Add a T which contracts the octet to a
509+ # triplet-antitriplet pair
510+ my_cf[0].append(color_algebra.T(indices[1],
511+ indices[2],
512+ indices[3]))
513 # Simplify the whole thing
514 my_cf = my_cf.full_simplify()
515
516@@ -359,19 +404,22 @@
517 res_cs = [cs for cs in my_cf if cs.Nc_power == max_coeff]
518
519 # If more than one string at leading N...
520- if len(res_cs) > 1:
521+ if len(res_cs) > 1 and any([not cs.near_equivalent(res_cs[0]) \
522+ for cs in res_cs]):
523 raise ColorBasis.ColorBasisError, \
524 "More than one color string with leading N coeff: %s" % str(res_cs)
525
526 res_cs = res_cs[0]
527
528 # If the result string does not contain only T's with two indices
529+ # and Epsilon/EpsilonBar objects
530 for col_obj in res_cs:
531- if col_obj.__class__.__name__ != 'T':
532+ if not isinstance(col_obj, color_algebra.T) and \
533+ not col_obj.__class__.__name__.startswith('Epsilon'):
534 raise ColorBasis.ColorBasisError, \
535- "Color flow decomposition %s contains non T elements" % \
536+ "Color flow decomposition %s contains non T/Epsilon elements" % \
537 str(res_cs)
538- if len(col_obj) != 2:
539+ if isinstance(col_obj, color_algebra.T) and len(col_obj) != 2:
540 raise ColorBasis.ColorBasisError, \
541 "Color flow decomposition %s contains T's w/o 2 indices" % \
542 str(res_cs)
543@@ -390,6 +438,7 @@
544 # Offsets used to introduce fake quark indices for gluons
545 offset1 = 1000
546 offset2 = 2000
547+ offset3 = 3000
548
549 res = []
550
551@@ -407,31 +456,51 @@
552 res_dict[leg_num] = [0, 0]
553
554 # Raise an error if external legs contain non supported repr
555- if leg_repr not in [1, 3, -3, 8]:
556+ if leg_repr not in [1, 3, -3, 6, -6, 8]:
557 raise ColorBasis.ColorBasisError, \
558 "Particle ID=%i has an unsupported color representation" % leg_repr
559
560 # Build the fake indices replacements for octets
561 if leg_repr == 8:
562- fake_repl.append((leg_num,
563+ fake_repl.append((leg_repr, leg_num,
564 offset1 + leg_num,
565 offset2 + leg_num))
566+ # Build the fake indices for sextets
567+ elif leg_repr in [-6, 6]:
568+ fake_repl.append((leg_repr, leg_num,
569+ offset1 + leg_num,
570+ offset2 + leg_num,
571+ offset3 + leg_num))
572
573 # Get the actual color flow
574 col_str_flow = self.get_color_flow_string(col_str, fake_repl)
575
576 # Offset for color flow
577- offset = 501
578+ offset = 500
579
580 for col_obj in col_str_flow:
581+ if isinstance(col_obj, color_algebra.T):
582+ # For T, all color indices should be the same
583+ offset = offset + 1
584 for i, index in enumerate(col_obj):
585+ if isinstance(col_obj, color_algebra.Epsilon):
586+ # Epsilon contracts with antitriplets,
587+ i = 0
588+ # ...and requires all different color indices
589+ offset = offset+1
590+ elif isinstance(col_obj, color_algebra.EpsilonBar):
591+ # EpsilonBar contracts with antitriplets
592+ i = 1
593+ # ...and requires all different color indices
594+ offset = offset+1
595 if index < offset1:
596 res_dict[index][i] = offset
597 elif index > offset1 and index < offset2:
598- res_dict[index - offset1][0] = offset
599- elif index > offset2:
600- res_dict[index - offset2][1] = offset
601- offset = offset + 1
602+ res_dict[index - offset1][i] = offset
603+ elif index > offset2 and index < offset3:
604+ res_dict[index - offset2][i] = offset
605+ elif index > offset3:
606+ res_dict[index - offset3][i] = offset
607
608 # Reverse ordering for initial state to stick to the (weird)
609 # les houches convention
610
611=== modified file 'madgraph/core/diagram_generation.py'
612--- madgraph/core/diagram_generation.py 2010-11-04 14:34:26 +0000
613+++ madgraph/core/diagram_generation.py 2010-12-15 07:31:31 +0000
614@@ -338,6 +338,7 @@
615 # If all legs can be combined in one single vertex, add this
616 # vertex to res and continue.
617 # Special treatment for decay chain legs
618+
619 if curr_leglist.can_combine_to_0(ref_dict_to0, is_decay_proc):
620 # Extract the interaction id associated to the vertex
621 vertex_ids = ref_dict_to0[tuple(sorted([leg.get('id') for \
622
623=== modified file 'madgraph/core/helas_objects.py'
624--- madgraph/core/helas_objects.py 2010-11-24 20:10:07 +0000
625+++ madgraph/core/helas_objects.py 2010-12-15 07:31:31 +0000
626@@ -12,7 +12,7 @@
627 # For more information, please visit: http://madgraph.phys.ucl.ac.be
628 #
629 ################################################################################
630-from madgraph.core import base_objects
631+
632 """Definitions of objects used to generate language-independent Helas
633 calls: HelasWavefunction, HelasAmplitude, HelasDiagram for the
634 generation of wavefunctions and amplitudes, HelasMatrixElement and
635@@ -412,13 +412,14 @@
636 """For octet Majorana fermions, need an extra minus sign in
637 the FVI (and FSI?) wavefunction in UFO models."""
638
639+ # Add minus sign to coupling of color octet Majorana
640+ # particles to g for FVI vertex
641 if self.get('color') == 8 and \
642 self.get_spin_state_number() == -2 and \
643 self.get('self_antipart') and \
644 [m.get('color') for m in self.get('mothers')] == [8, 8]:
645 self.set('coupling', '-' + self.get('coupling'))
646
647-
648 def set_state_and_particle(self, model):
649 """Set incoming/outgoing state according to mother states and
650 Lorentz structure of the interaction, and set PDG code
651@@ -769,11 +770,8 @@
652 return 0
653
654 wf_indices = self.get('pdg_codes')
655- # take the last index in case of identical particles
656- wf_indices.reverse()
657- wf_index = len(wf_indices) - wf_indices.index(self.get_anti_pdg_code()) - 1
658- wf_indices.reverse() # restore the ordering
659- #wf_index = self.get('pdg_codes').index(self.get_anti_pdg_code())
660+ # Take the first index in case of identical particles
661+ wf_index = wf_indices.index(self.get_anti_pdg_code())
662 # If fermion, then we need to correct for I/O status
663 spin_state = self.get_spin_state_number()
664 if spin_state % 2 == 0:
665@@ -812,14 +810,17 @@
666
667 vertices = base_objects.VertexList()
668
669- if not self.get('mothers'):
670+ mothers = self.get('mothers')
671+
672+ if not mothers:
673 return vertices
674
675 # Add vertices for all mothers
676- for mother in self.get('mothers'):
677+ for mother in mothers:
678 # This is where recursion happens
679- vertices.extend(mother.get_base_vertices(wf_dict, vx_list,
680- optimization))
681+ vertices.extend(mother.get_base_vertices(\
682+ wf_dict, vx_list,optimization))
683+
684 # Generate last vertex
685 legs = base_objects.LegList()
686
687@@ -837,7 +838,7 @@
688 if optimization != 0:
689 wf_dict[self.get('number')] = lastleg
690
691- for mother in self.get('mothers'):
692+ for mother in mothers:
693 try:
694 leg = wf_dict[mother.get('number')]
695 except KeyError:
696@@ -1219,6 +1220,44 @@
697
698 return res
699
700+ def sort_by_pdg_codes(self, pdg_codes, my_pdg_code = 0):
701+ """Sort this HelasWavefunctionList according to the cyclic
702+ order of the pdg codes given. my_pdg_code is the pdg code of
703+ the daughter wavefunction (or 0 if daughter is amplitude)."""
704+
705+ pdg_codes = copy.copy(pdg_codes)
706+
707+ # Remove the argument wavefunction code from pdg_codes
708+
709+ my_index = -1
710+ if my_pdg_code:
711+ # Find the last index instead of the first, to work with UFO models
712+ my_index = pdg_codes.index(my_pdg_code)
713+ pdg_codes.pop(my_index)
714+
715+ mothers = copy.copy(self)
716+
717+ # Sort according to interaction pdg codes
718+
719+ mother_codes = [ wf.get_pdg_code() for wf \
720+ in mothers ]
721+
722+ if pdg_codes == mother_codes:
723+ # Already sorted - skip sort below
724+ return mothers, my_index
725+
726+ sorted_mothers = []
727+ for i, code in enumerate(pdg_codes):
728+ index = mother_codes.index(code)
729+ mother_codes.pop(index)
730+ mother = mothers.pop(index)
731+ sorted_mothers.append(mother)
732+
733+ if mothers:
734+ raise base_objects.PhysicsObject.PhysicsObjectError
735+
736+ return sorted_mothers, my_index
737+
738 @staticmethod
739 def extract_wavefunctions(mothers):
740 """Recursively extract the wavefunctions from mothers of mothers"""
741@@ -1537,9 +1576,11 @@
742 for mother in self.get('mothers'):
743 vertices.extend(mother.get_base_vertices(wf_dict, vx_list,
744 optimization))
745+ mothers = self.get('mothers')
746+
747 # Generate last vertex
748 legs = base_objects.LegList()
749- for mother in self.get('mothers'):
750+ for mother in mothers:
751 try:
752 leg = wf_dict[mother.get('number')]
753 except KeyError:
754@@ -1725,9 +1766,32 @@
755 else:
756 return ()
757
758+ def set_coupling_color_factor(self):
759+ """Check if there is a mismatch between order of fermions
760+ w.r.t. color"""
761+ mothers = self.get('mothers')
762+
763+ # Sort mothers according to pdg codes if fermions with indentical
764+ # color but not identical pdg code. Needed for antisymmetric
765+ # color eps^{ijk}.
766+ for imo in range(len(mothers)-1):
767+ if mothers[imo].get('color') != 1 and \
768+ mothers[imo].is_fermion() and \
769+ mothers[imo].get('color') == mothers[imo+1].get('color') and \
770+ mothers[imo].get('spin') == mothers[imo+1].get('spin') and \
771+ mothers[imo].get('pdg_code') != mothers[imo+1].get('pdg_code'):
772+ mothers, my_index = \
773+ mothers.sort_by_pdg_codes(self.get('pdg_codes'))
774+ break
775+
776+ if mothers != self.get('mothers'):
777+ # We have mismatch between fermion order for color and lorentz
778+ self.set('coupling', '-'+self.get('coupling'))
779+
780 # Comparison between different amplitudes, to allow check for
781 # identical processes. Note that we are then not interested in
782 # interaction id, but in all other properties.
783+
784 def __eq__(self, other):
785 """Comparison between different amplitudes, to allow check for
786 identical processes.
787@@ -2237,6 +2301,7 @@
788 # Sort all mothers according to the order wanted in Helas calls
789 for wf in self.get_all_wavefunctions():
790 wf.set('mothers', HelasMatrixElement.sorted_mothers(wf))
791+
792 for amp in self.get_all_amplitudes():
793 amp.set('mothers', HelasMatrixElement.sorted_mothers(amp))
794 amp.set('color_indices', amp.get_color_indices())
795@@ -3317,45 +3382,30 @@
796 if not arg.get('interaction_id'):
797 return arg.get('mothers')
798
799- pdg_codes = copy.copy(arg.get('pdg_codes'))
800-
801- # Remove the argument wavefunction code from pdg_codes
802-
803+ sorted_mothers = copy.copy(arg.get('mothers'))
804+ my_pdg_code = 0
805+ my_spin = 0
806 if isinstance(arg, HelasWavefunction):
807+ my_pdg_code = arg.get_anti_pdg_code()
808 my_spin = arg.get_spin_state_number()
809- # Find the last index instead of the first, to work with UFO models
810- pdg_codes.reverse()
811- my_index = len(pdg_codes) - pdg_codes.index(arg.get_anti_pdg_code()) - 1
812- pdg_codes.reverse()
813- pdg_codes.pop(my_index)
814-
815- mothers = copy.copy(arg.get('mothers'))
816-
817- # First sort according to interaction pdg codes
818-
819- mother_codes = [ wf.get_pdg_code() for wf \
820- in mothers ]
821-
822- sorted_mothers = []
823+
824+ sorted_mothers, my_index = arg.get('mothers').sort_by_pdg_codes(\
825+ arg.get('pdg_codes'), my_pdg_code)
826+
827 same_spin_mothers = []
828- same_spin_index = -1
829- for i, code in enumerate(pdg_codes):
830- index = mother_codes.index(code)
831- mother_codes.pop(index)
832- mother = mothers.pop(index)
833- if isinstance(arg, HelasWavefunction) and \
834- my_spin % 2 == 1 and \
835- mother.get_spin_state_number() == my_spin:
836- # For bosons with same spin as this wf, need special treatment
837- if same_spin_index < 0:
838- # Remember starting index for same spin states
839- same_spin_index = i
840- same_spin_mothers.append(mother)
841- else:
842- sorted_mothers.append(mother)
843-
844- if mothers:
845- raise base_objects.PhysicsObject.PhysicsObjectError
846+ if isinstance(arg, HelasWavefunction) and \
847+ my_spin % 2 == 1:
848+ # For bosons with same spin as this wf, need special treatment
849+ same_spin_index = -1
850+ i=0
851+ while i < len(sorted_mothers):
852+ if sorted_mothers[i].get_spin_state_number() == my_spin:
853+ if same_spin_index < 0:
854+ # Remember starting index for same spin states
855+ same_spin_index = i
856+ same_spin_mothers.append(sorted_mothers.pop(i))
857+ else:
858+ i += 1
859
860 # Make cyclic reordering of mothers with same spin as this wf
861 if same_spin_mothers:
862@@ -3404,7 +3454,7 @@
863 # Put back partner into sorted_mothers
864 if partner:
865 sorted_mothers.insert(partner_index, partner)
866-
867+
868 # Next sort according to spin_state_number
869 return HelasWavefunctionList(sorted_mothers)
870
871@@ -3796,7 +3846,6 @@
872 new_amp = matrix_element.get_base_amplitude()
873 matrix_element.set('base_amplitude', new_amp)
874 colorize_obj = col_basis.create_color_dict_list(new_amp)
875-
876 try:
877 # If the color configuration of the ME has
878 # already been considered before, recycle
879
880=== modified file 'madgraph/interface/cmd_interface.py'
881--- madgraph/interface/cmd_interface.py 2010-12-10 11:24:36 +0000
882+++ madgraph/interface/cmd_interface.py 2010-12-15 07:31:31 +0000
883@@ -504,16 +504,15 @@
884
885 logger.info("syntax: check " + "|".join(self._check_opts) + " [param_card] process_definition")
886 logger.info("-- check a process or set of processes. Options:")
887- logger.info("full: Checks that the model and MG5 are working properly")
888- logger.info(" by generating the all permutations of the process and")
889- logger.info(" checking that the result of calculating the resulting")
890- logger.info(" matrix elements give the same result. For processes with")
891- logger.info(" gauge bosons, check gauge invariance.")
892- logger.info("quick: A faster version of the above checks.")
893- logger.info(" Only checks a subset of permutations.")
894- logger.info("gauge: Only check that processes with massless gauge bosons")
895+ logger.info("full: Perform all three checks described below:")
896+ logger.info(" permutation, gauge and lorentz_invariance.")
897+ logger.info("permutation: Check that the model and MG5 are working")
898+ logger.info(" properly by generating permutations of the process and")
899+ logger.info(" checking that the resulting matrix elements give the")
900+ logger.info(" same value.")
901+ logger.info("gauge: Check that processes with massless gauge bosons")
902 logger.info(" are gauge invariant")
903- logger.info("lorentz_invariance: Only check that the amplitude is lorentz")
904+ logger.info("lorentz_invariance: Check that the amplitude is lorentz")
905 logger.info(" invariant by comparing the amplitiude in different frames")
906 logger.info("If param_card is given, that param_card is used instead")
907 logger.info(" of the default values for the model.")
908@@ -1374,7 +1373,7 @@
909 _add_opts = ['process']
910 _save_opts = ['model', 'processes']
911 _tutorial_opts = ['start', 'stop']
912- _check_opts = ['full', 'quick', 'gauge', 'lorentz_invariance']
913+ _check_opts = ['full', 'permutation', 'gauge', 'lorentz_invariance']
914 _import_formats = ['model_v4', 'model', 'proc_v4', 'command']
915 _v4_export_formats = ['madevent', 'standalone','matrix']
916 _export_formats = _v4_export_formats + ['standalone_cpp',
917@@ -1753,7 +1752,7 @@
918 lorentz_result =[]
919 nb_processes = 0
920
921- if args[0] in ['quick', 'full']:
922+ if args[0] in ['permutation', 'full']:
923 comparisons = process_checks.check_processes(myprocdef,
924 param_card = param_card,
925 quick = True)
926@@ -1775,18 +1774,23 @@
927 % (nb_processes,
928 (cpu_time2 - cpu_time1)))
929
930+ text = ""
931+
932 if gauge_result:
933- logger.info('gauge results:')
934- logger.info(process_checks.output_gauge(gauge_result))
935+ text += 'Gauge results:\n'
936+ text += process_checks.output_gauge(gauge_result) + '\n'
937
938 if lorentz_result:
939- logger.info('lorentz invariance results:')
940- logger.info(process_checks.output_lorentz_inv(lorentz_result))
941+ text += 'Lorentz invariance results:\n'
942+ text += process_checks.output_lorentz_inv(lorentz_result) + '\n'
943
944 if comparisons:
945- logger.info(process_checks.output_comparisons(comparisons[0]))
946+ text += 'Process permutation results:\n'
947+ text += process_checks.output_comparisons(comparisons[0]) + '\n'
948 self._comparisons = comparisons
949
950+ logger.info(text)
951+ pydoc.pager(text)
952 # Restore diagram logger
953 diag_logger.setLevel(old_level)
954
955
956=== modified file 'madgraph/iolibs/helas_call_writers.py'
957--- madgraph/iolibs/helas_call_writers.py 2010-12-07 22:16:53 +0000
958+++ madgraph/iolibs/helas_call_writers.py 2010-12-15 07:31:31 +0000
959@@ -254,11 +254,11 @@
960
961 # SM gluon 4-vertex components
962
963- key = ((3, 3, 3, 3, 4), 'gggg1')
964+ key = ((3, 3, 3, 3, 1), 'gggg3')
965 call = lambda wf: \
966 "CALL JGGGXX(W(1,%d),W(1,%d),W(1,%d),%s,W(1,%d))" % \
967- (wf.get('mothers')[0].get('number'),
968- wf.get('mothers')[1].get('number'),
969+ (wf.get('mothers')[1].get('number'),
970+ wf.get('mothers')[0].get('number'),
971 wf.get('mothers')[2].get('number'),
972 wf.get('coupling'),
973 wf.get('number'))
974@@ -273,11 +273,11 @@
975 amp.get('coupling'),
976 amp.get('number'))
977 self.add_amplitude(key, call)
978- key = ((3, 3, 3, 3, 4), 'gggg2')
979+ key = ((3, 3, 3, 3, 1), 'gggg2')
980 call = lambda wf: \
981 "CALL JGGGXX(W(1,%d),W(1,%d),W(1,%d),%s,W(1,%d))" % \
982- (wf.get('mothers')[2].get('number'),
983- wf.get('mothers')[0].get('number'),
984+ (wf.get('mothers')[0].get('number'),
985+ wf.get('mothers')[2].get('number'),
986 wf.get('mothers')[1].get('number'),
987 wf.get('coupling'),
988 wf.get('number'))
989@@ -292,11 +292,11 @@
990 amp.get('coupling'),
991 amp.get('number'))
992 self.add_amplitude(key, call)
993- key = ((3, 3, 3, 3, 4), 'gggg3')
994+ key = ((3, 3, 3, 3, 1), 'gggg1')
995 call = lambda wf: \
996 "CALL JGGGXX(W(1,%d),W(1,%d),W(1,%d),%s,W(1,%d))" % \
997- (wf.get('mothers')[1].get('number'),
998- wf.get('mothers')[2].get('number'),
999+ (wf.get('mothers')[2].get('number'),
1000+ wf.get('mothers')[1].get('number'),
1001 wf.get('mothers')[0].get('number'),
1002 wf.get('coupling'),
1003 wf.get('number'))
1004
1005=== modified file 'madgraph/iolibs/import_v4.py'
1006--- madgraph/iolibs/import_v4.py 2010-12-07 22:16:53 +0000
1007+++ madgraph/iolibs/import_v4.py 2010-12-15 07:31:31 +0000
1008@@ -107,6 +107,7 @@
1009
1010 color_equiv = {'s': 1,
1011 't': 3,
1012+ '6': 6,
1013 'o': 8}
1014
1015 line_equiv = {'d': 'dashed',
1016@@ -233,10 +234,12 @@
1017 # Give color structure
1018 # Order particles according to color
1019 # Don't consider singlets
1020- color_parts = sorted(part_list, lambda p1, p2:\
1021- p1.get_color() - p2.get_color())
1022- colors = [part.get_color() for part in color_parts \
1023- if part.get_color() !=1]
1024+ color_parts = sorted(enumerate(part_list), lambda p1, p2:\
1025+ p1[1].get_color() - p2[1].get_color())
1026+ color_ind = [(i, part.get_color()) for i, part in \
1027+ color_parts if part.get_color() !=1]
1028+ colors = [c for i,c in color_ind]
1029+ ind = [i for i,c in color_ind]
1030
1031 # Set color empty by default
1032 myinter.set('color', [])
1033@@ -246,32 +249,31 @@
1034 elif colors == [-3, 3]:
1035 # triplet-triplet-singlet coupling
1036 myinter.set('color', [color.ColorString(\
1037- [color.T(1, 0)])])
1038+ [color.T(ind[1], ind[0])])])
1039 elif colors == [8, 8]:
1040 # octet-octet-singlet coupling
1041 my_cs = color.ColorString(\
1042- [color.Tr(0, 1)])
1043+ [color.Tr(ind[0], ind[1])])
1044 my_cs.coeff = fractions.Fraction(2)
1045 myinter.set('color', [my_cs])
1046 elif colors == [-3, 3, 8]:
1047 # triplet-triplet-octet coupling
1048 myinter.set('color', [color.ColorString(\
1049- [color.T(2, 1, 0)])])
1050+ [color.T(ind[2], ind[1], ind[0])])])
1051 elif colors == [8, 8, 8]:
1052 # Triple glue coupling
1053 my_color_string = color.ColorString(\
1054- [color.f(0, 1, 2)])
1055+ [color.f(ind[0], ind[1], ind[2])])
1056 my_color_string.is_imaginary = True
1057 myinter.set('color', [my_color_string])
1058 elif colors == [-3, 3, 8, 8]:
1059 my_cs1 = color.ColorString(\
1060- [color.T(2, 3, 1, 0)])
1061+ [color.T(ind[2], ind[3], ind[1], ind[0])])
1062 my_cs2 = color.ColorString(\
1063- [color.T(3, 2, 1, 0)])
1064+ [color.T(ind[3], ind[2], ind[1], ind[0])])
1065 myinter.set('color', [my_cs1, my_cs2])
1066-
1067 elif colors == [8, 8, 8, 8]:
1068- # 4-glue / glue-glue-gluino-gluino coupling
1069+ # 4-glue coupling
1070 cs1 = color.ColorString([color.f(0, 1, -1),
1071 color.f(2, 3, -1)])
1072 #cs1.coeff = fractions.Fraction(-1)
1073
1074=== modified file 'madgraph/various/process_checks.py'
1075--- madgraph/various/process_checks.py 2010-12-09 16:34:19 +0000
1076+++ madgraph/various/process_checks.py 2010-12-15 07:31:31 +0000
1077@@ -223,18 +223,7 @@
1078 # Add this process to tested_processes
1079 sorted_ids.append(ids)
1080
1081- # Add also antiprocess, since these are identical
1082- if id_anti_id_dict:
1083- anti_ids = sorted([id_anti_id_dict[id] \
1084- for id in ids[:-1]]) + [process.get('id')]
1085- else:
1086- anti_ids = sorted([model.get_particle(id).get_anti_pdg_code() \
1087- for id in ids[:-1]]) + [process.get('id')]
1088- anti_ids = array.array('i', anti_ids)
1089-
1090- if anti_ids != ids:
1091- sorted_ids.append(anti_ids)
1092-
1093+ # Skip adding antiprocess below, since might be relevant too
1094 return False
1095
1096 #===============================================================================
1097@@ -382,6 +371,8 @@
1098 full_model,
1099 quick)
1100
1101+ if "used_lorentz" not in stored_quantities:
1102+ stored_quantities["used_lorentz"] = []
1103 return results, stored_quantities["used_lorentz"]
1104
1105 elif isinstance(processes, base_objects.Process):
1106@@ -426,12 +417,11 @@
1107 if res:
1108 comparison_results.append(res)
1109
1110+ if "used_lorentz" not in stored_quantities:
1111+ stored_quantities["used_lorentz"] = []
1112 return comparison_results, stored_quantities["used_lorentz"]
1113
1114
1115-
1116-
1117-
1118 def check_process(process, stored_quantities, helas_writer, full_model, quick):
1119 """Check the helas calls for a process by generating the process
1120 using all different permutations of the process legs (or, if
1121@@ -1075,8 +1065,12 @@
1122 res_str += "\nFailed processes: %s" % ', '.join(failed_proc_list)
1123 if no_check_proc:
1124 res_str += "\nNot checked processes: %s" % ', '.join(no_check_proc_list)
1125+<<<<<<< TREE
1126
1127 if output == 'text':
1128 return res_str
1129 else:
1130- return fail_proc
1131\ No newline at end of file
1132+ return fail_proc=======
1133+ return res_str
1134+
1135+>>>>>>> MERGE-SOURCE
1136
1137=== modified file 'models/import_ufo.py'
1138--- models/import_ufo.py 2010-11-11 00:31:20 +0000
1139+++ models/import_ufo.py 2010-12-15 07:31:31 +0000
1140@@ -240,6 +240,10 @@
1141 output.append(self._pat_id.sub('color.T(\g<second>,\g<first>)', term))
1142 elif particle.color == 3:
1143 output.append(self._pat_id.sub('color.T(\g<first>,\g<second>)', term))
1144+ elif particle.color == -6 :
1145+ output.append(self._pat_id.sub('color.T6(\g<second>,\g<first>)', term))
1146+ elif particle.color == 6:
1147+ output.append(self._pat_id.sub('color.T6(\g<first>,\g<second>)', term))
1148 elif particle.color == 8:
1149 output.append(self._pat_id.sub('color.Tr(\g<first>,\g<second>)', term))
1150 factor *= 2
1151@@ -255,25 +259,20 @@
1152 p = re.compile(r'''\'\w(?P<number>\d+)\'''')
1153 data_string = p.sub('-\g<number>', data_string)
1154
1155- # Compute how change indices to match MG5 convention
1156- info = [(i+1,part.color) for i,part in enumerate(interaction_info.particles)
1157- if part.color!=1]
1158- order = sorted(info, lambda p1, p2:p1[1] - p2[1])
1159- new_indices={}
1160- for i,(j, pcolor) in enumerate(order):
1161- new_indices[j]=i
1162+ # Shift indices by -1
1163+ new_indices = {}
1164+ new_indices = dict([(j,i) for (i,j) in \
1165+ enumerate(range(1,
1166+ len(interaction_info.particles)+1))])
1167+
1168
1169-# p = re.compile(r'''(?P<prefix>[^-@])(?P<nb>%s)(?P<postfix>\D)''' % j)
1170-# data_string = p.sub('\g<prefix>@%s\g<postfix>' % i, data_string)
1171-# data_string = data_string.replace('@','')
1172-
1173 output = data_string.split('*')
1174 output = color.ColorString([eval(data) \
1175- for data in output if data !='1'])
1176+ for data in output if data !='1'])
1177 output.coeff = fractions.Fraction(factor)
1178 for col_obj in output:
1179 col_obj.replace_indices(new_indices)
1180-
1181+
1182 return output
1183
1184 class OrganizeModelExpression:
1185
1186=== added directory 'models/sextet_diquarks'
1187=== added file 'models/sextet_diquarks/__init__.py'
1188--- models/sextet_diquarks/__init__.py 1970-01-01 00:00:00 +0000
1189+++ models/sextet_diquarks/__init__.py 2010-12-15 07:31:31 +0000
1190@@ -0,0 +1,15 @@
1191+
1192+import particles
1193+import couplings
1194+import lorentz
1195+import parameters
1196+import vertices
1197+import write_param_card
1198+
1199+
1200+all_particles = particles.all_particles
1201+all_vertices = vertices.all_vertices
1202+all_couplings = couplings.all_couplings
1203+all_lorentz = lorentz.all_lorentz
1204+all_parameters = parameters.all_parameters
1205+all_functions = function_library.all_functions
1206
1207=== added file 'models/sextet_diquarks/couplings.py'
1208--- models/sextet_diquarks/couplings.py 1970-01-01 00:00:00 +0000
1209+++ models/sextet_diquarks/couplings.py 2010-12-15 07:31:31 +0000
1210@@ -0,0 +1,131 @@
1211+# This file was automatically created by FeynRules $Revision: 347 $
1212+# Mathematica version: 7.0 for Mac OS X x86 (64-bit) (November 11, 2008)
1213+# Date: Wed 20 Oct 2010 11:37:56
1214+
1215+
1216+from object_library import all_couplings, Coupling
1217+
1218+from function_library import complexconjugate, re, im, csc, sec, acsc, asec
1219+
1220+
1221+
1222+GC_1 = Coupling(name = 'GC_1',
1223+ value = '-(ee*complex(0,1))/3.',
1224+ order = {'QED':1})
1225+
1226+GC_2 = Coupling(name = 'GC_2',
1227+ value = '(2*ee*complex(0,1))/3.',
1228+ order = {'QED':1})
1229+
1230+GC_3 = Coupling(name = 'GC_3',
1231+ value = '-(ee*complex(0,1))',
1232+ order = {'QED':1})
1233+
1234+GC_4 = Coupling(name = 'GC_4',
1235+ value = '-G',
1236+ order = {'QCD':1})
1237+
1238+GC_5 = Coupling(name = 'GC_5',
1239+ value = '-(complex(0,1)*G)',
1240+ order = {'QCD':1})
1241+
1242+GC_6 = Coupling(name = 'GC_6',
1243+ value = 'complex(0,1)*G',
1244+ order = {'QCD':1})
1245+
1246+GC_7 = Coupling(name = 'GC_7',
1247+ value = 'complex(0,1)*G**2',
1248+ order = {'QCD':2})
1249+
1250+GC_8 = Coupling(name = 'GC_8',
1251+ value = 'cw*complex(0,1)*gw',
1252+ order = {'QED':1})
1253+
1254+GC_9 = Coupling(name = 'GC_9',
1255+ value = '-(complex(0,1)*gw**2)',
1256+ order = {'QED':2})
1257+
1258+GC_10 = Coupling(name = 'GC_10',
1259+ value = 'cw**2*complex(0,1)*gw**2',
1260+ order = {'QED':2})
1261+
1262+GC_11 = Coupling(name = 'GC_11',
1263+ value = '-6*complex(0,1)*lam',
1264+ order = {'QED':2})
1265+
1266+GC_12 = Coupling(name = 'GC_12',
1267+ value = '(ee**2*complex(0,1))/(2.*sw**2)',
1268+ order = {'QED':2})
1269+
1270+GC_13 = Coupling(name = 'GC_13',
1271+ value = '(ee*complex(0,1))/(sw*cmath.sqrt(2))',
1272+ order = {'QED':1})
1273+
1274+GC_14 = Coupling(name = 'GC_14',
1275+ value = '-(cw*ee*complex(0,1))/(2.*sw)',
1276+ order = {'QED':1})
1277+
1278+GC_15 = Coupling(name = 'GC_15',
1279+ value = '(cw*ee*complex(0,1))/(2.*sw)',
1280+ order = {'QED':1})
1281+
1282+GC_16 = Coupling(name = 'GC_16',
1283+ value = '-(ee*complex(0,1)*sw)/(6.*cw)',
1284+ order = {'QED':1})
1285+
1286+GC_17 = Coupling(name = 'GC_17',
1287+ value = '(ee*complex(0,1)*sw)/(2.*cw)',
1288+ order = {'QED':1})
1289+
1290+GC_18 = Coupling(name = 'GC_18',
1291+ value = 'complex(0,1)*gw*sw',
1292+ order = {'QED':1})
1293+
1294+GC_19 = Coupling(name = 'GC_19',
1295+ value = '-2*cw*complex(0,1)*gw**2*sw',
1296+ order = {'QED':2})
1297+
1298+GC_20 = Coupling(name = 'GC_20',
1299+ value = 'complex(0,1)*gw**2*sw**2',
1300+ order = {'QED':2})
1301+
1302+GC_21 = Coupling(name = 'GC_21',
1303+ value = '(cw*ee*complex(0,1))/(2.*sw) + (ee*complex(0,1)*sw)/(2.*cw)',
1304+ order = {'QED':1})
1305+
1306+GC_22 = Coupling(name = 'GC_22',
1307+ value = 'ee**2*complex(0,1) + (cw**2*ee**2*complex(0,1))/(2.*sw**2) + (ee**2*complex(0,1)*sw**2)/(2.*cw**2)',
1308+ order = {'QED':2})
1309+
1310+GC_23 = Coupling(name = 'GC_23',
1311+ value = 'complex(0,1)*ttsix',
1312+ order = {'QED':1})
1313+
1314+GC_24 = Coupling(name = 'GC_24',
1315+ value = 'complex(0,1)*uusix',
1316+ order = {'QED':1})
1317+
1318+GC_25 = Coupling(name = 'GC_25',
1319+ value = '-6*complex(0,1)*lam*v',
1320+ order = {'QED':1})
1321+
1322+GC_26 = Coupling(name = 'GC_26',
1323+ value = '(ee**2*complex(0,1)*v)/(2.*sw**2)',
1324+ order = {'QED':1})
1325+
1326+GC_27 = Coupling(name = 'GC_27',
1327+ value = 'ee**2*complex(0,1)*v + (cw**2*ee**2*complex(0,1)*v)/(2.*sw**2) + (ee**2*complex(0,1)*sw**2*v)/(2.*cw**2)',
1328+ order = {'QED':1})
1329+
1330+GC_28 = Coupling(name = 'GC_28',
1331+ value = '-((complex(0,1)*yb)/cmath.sqrt(2))',
1332+ order = {'QED':1})
1333+
1334+GC_29 = Coupling(name = 'GC_29',
1335+ value = '-((complex(0,1)*yt)/cmath.sqrt(2))',
1336+ order = {'QED':1})
1337+
1338+GC_30 = Coupling(name = 'GC_30',
1339+ value = '-((complex(0,1)*ytau)/cmath.sqrt(2))',
1340+ order = {'QED':1})
1341+
1342
1343=== added file 'models/sextet_diquarks/function_library.py'
1344--- models/sextet_diquarks/function_library.py 1970-01-01 00:00:00 +0000
1345+++ models/sextet_diquarks/function_library.py 2010-12-15 07:31:31 +0000
1346@@ -0,0 +1,54 @@
1347+# This file is part of the UFO.
1348+#
1349+# This file contains definitions for functions that
1350+# are extensions of the cmath library, and correspond
1351+# either to functions that are in cmath, but inconvenient
1352+# to access from there (e.g. z.conjugate()),
1353+# or functions that are simply not defined.
1354+#
1355+#
1356+
1357+__date__ = "22 July 2010"
1358+__author__ = "claude.duhr@durham.ac.uk"
1359+
1360+import cmath
1361+from object_library import all_functions, Function
1362+
1363+#
1364+# shortcuts for functions from cmath
1365+#
1366+
1367+complexconjugate = Function(name = 'complexconjugate',
1368+ arguments = ('z',),
1369+ expression = 'z.conjugate()')
1370+
1371+
1372+re = Function(name = 're',
1373+ arguments = ('z',),
1374+ expression = 'z.real')
1375+
1376+im = Function(name = 'im',
1377+ arguments = ('z',),
1378+ expression = 'z.imag')
1379+
1380+# New functions (trigonometric)
1381+
1382+sec = Function(name = 'sec',
1383+ arguments = ('z',),
1384+ expression = '1./cmath.cos(z)')
1385+
1386+asec = Function(name = 'asec',
1387+ arguments = ('z',),
1388+ expression = 'cmath.acos(1./z)')
1389+
1390+csc = Function(name = 'csc',
1391+ arguments = ('z',),
1392+ expression = '1./cmath.sin(z)')
1393+
1394+acsc = Function(name = 'acsc',
1395+ arguments = ('z',),
1396+ expression = 'cmath.asin(1./z)')
1397+
1398+
1399+
1400+
1401
1402=== added file 'models/sextet_diquarks/lorentz.py'
1403--- models/sextet_diquarks/lorentz.py 1970-01-01 00:00:00 +0000
1404+++ models/sextet_diquarks/lorentz.py 2010-12-15 07:31:31 +0000
1405@@ -0,0 +1,79 @@
1406+# This file was automatically created by FeynRules $Revision: 347 $
1407+# Mathematica version: 7.0 for Mac OS X x86 (64-bit) (November 11, 2008)
1408+# Date: Wed 20 Oct 2010 11:37:56
1409+
1410+
1411+from object_library import all_lorentz, Lorentz
1412+
1413+from function_library import complexconjugate, re, im, csc, sec, acsc, asec
1414+
1415+
1416+
1417+SSS1 = Lorentz(name = 'SSS1',
1418+ spins = [ 1, 1, 1 ],
1419+ structure = '1')
1420+
1421+FFS1 = Lorentz(name = 'FFS1',
1422+ spins = [ 2, 2, 1 ],
1423+ structure = 'Identity(1,2)')
1424+
1425+FFV1 = Lorentz(name = 'FFV1',
1426+ spins = [ 2, 2, 3 ],
1427+ structure = 'Gamma(3,2,1)')
1428+
1429+FFV2 = Lorentz(name = 'FFV2',
1430+ spins = [ 2, 2, 3 ],
1431+ structure = 'Gamma(3,2,-1)*ProjM(-1,1)')
1432+
1433+FFV3 = Lorentz(name = 'FFV3',
1434+ spins = [ 2, 2, 3 ],
1435+ structure = 'Gamma(3,2,-1)*ProjM(-1,1) - 2*Gamma(3,2,-1)*ProjP(-1,1)')
1436+
1437+FFV4 = Lorentz(name = 'FFV4',
1438+ spins = [ 2, 2, 3 ],
1439+ structure = 'Gamma(3,2,-1)*ProjM(-1,1) + 2*Gamma(3,2,-1)*ProjP(-1,1)')
1440+
1441+FFV5 = Lorentz(name = 'FFV5',
1442+ spins = [ 2, 2, 3 ],
1443+ structure = 'Gamma(3,2,-1)*ProjM(-1,1) + 4*Gamma(3,2,-1)*ProjP(-1,1)')
1444+
1445+VSS1 = Lorentz(name = 'VSS1',
1446+ spins = [ 3, 1, 1 ],
1447+ structure = 'P(1,2) - P(1,3)')
1448+
1449+VVS1 = Lorentz(name = 'VVS1',
1450+ spins = [ 3, 3, 1 ],
1451+ structure = 'Metric(1,2)')
1452+
1453+VVV1 = Lorentz(name = 'VVV1',
1454+ spins = [ 3, 3, 3 ],
1455+ structure = 'P(3,1)*Metric(1,2) - P(3,2)*Metric(1,2) - P(2,1)*Metric(1,3) + P(2,3)*Metric(1,3) + P(1,2)*Metric(2,3) - P(1,3)*Metric(2,3)')
1456+
1457+SSSS1 = Lorentz(name = 'SSSS1',
1458+ spins = [ 1, 1, 1, 1 ],
1459+ structure = '1')
1460+
1461+VVSS1 = Lorentz(name = 'VVSS1',
1462+ spins = [ 3, 3, 1, 1 ],
1463+ structure = 'Metric(1,2)')
1464+
1465+VVVV1 = Lorentz(name = 'VVVV1',
1466+ spins = [ 3, 3, 3, 3 ],
1467+ structure = 'Metric(1,4)*Metric(2,3) - Metric(1,3)*Metric(2,4)')
1468+
1469+VVVV2 = Lorentz(name = 'VVVV2',
1470+ spins = [ 3, 3, 3, 3 ],
1471+ structure = 'Metric(1,4)*Metric(2,3) + Metric(1,3)*Metric(2,4) - 2*Metric(1,2)*Metric(3,4)')
1472+
1473+VVVV3 = Lorentz(name = 'VVVV3',
1474+ spins = [ 3, 3, 3, 3 ],
1475+ structure = 'Metric(1,4)*Metric(2,3) - Metric(1,2)*Metric(3,4)')
1476+
1477+VVVV4 = Lorentz(name = 'VVVV4',
1478+ spins = [ 3, 3, 3, 3 ],
1479+ structure = 'Metric(1,3)*Metric(2,4) - Metric(1,2)*Metric(3,4)')
1480+
1481+VVVV5 = Lorentz(name = 'VVVV5',
1482+ spins = [ 3, 3, 3, 3 ],
1483+ structure = 'Metric(1,4)*Metric(2,3) - (Metric(1,3)*Metric(2,4))/2. - (Metric(1,2)*Metric(3,4))/2.')
1484+
1485
1486=== added file 'models/sextet_diquarks/object_library.py'
1487--- models/sextet_diquarks/object_library.py 1970-01-01 00:00:00 +0000
1488+++ models/sextet_diquarks/object_library.py 2010-12-15 07:31:31 +0000
1489@@ -0,0 +1,194 @@
1490+##
1491+##
1492+## Feynrules Header
1493+##
1494+##
1495+##
1496+##
1497+##
1498+
1499+import cmath
1500+
1501+
1502+class FRBaseClass(object):
1503+ """The class from which all FeynRules classes are derived."""
1504+
1505+ require_args = []
1506+
1507+ def __init__(self, *args, **options):
1508+ assert(len(self.require_args) == len (args))
1509+
1510+ for i, name in enumerate(self.require_args):
1511+ setattr(self, name, args[i])
1512+
1513+ for (option, value) in options.items():
1514+ setattr(self, option, value)
1515+
1516+ def get(self, name):
1517+ return getattr(self, name)
1518+
1519+ def set(self, name, value):
1520+ setattr(self, name, value)
1521+
1522+ def get_all(self):
1523+ """Return a dictionary containing all the information of the object"""
1524+ return self.__dict__
1525+
1526+ def __str__(self):
1527+ return self.name
1528+
1529+ def nice_string(self):
1530+ """ return string with the full information """
1531+ return '\n'.join(['%s \t: %s' %(name, value) for name, value in self.__dict__.items()])
1532+
1533+ def __repr__(self):
1534+ replacements = [
1535+ ('+','__plus__'),
1536+ ('-','__minus__'),
1537+ ('@','__at__'),
1538+ ('!','__exclam__'),
1539+ ('?','__quest__'),
1540+ ('*','__star__'),
1541+ ('~','__tilde__')
1542+ ]
1543+ text = self.name
1544+ for orig,sub in replacements:
1545+ text = text.replace(orig,sub)
1546+ return text
1547+
1548+
1549+
1550+all_particles = []
1551+
1552+
1553+
1554+class Particle(FRBaseClass):
1555+ """A standard Particle"""
1556+
1557+ require_args=['pdg_code', 'name', 'antiname', 'spin', 'color', 'mass', 'width', 'texname', 'antitexname', 'line', 'charge']
1558+
1559+ require_args_all = ['pdg_code', 'name', 'antiname', 'spin', 'color', 'mass', 'width', 'texname', 'antitexname', 'line', 'charge', 'propagating', 'goldstoneboson']
1560+
1561+ def __init__(self, pdg_code, name, antiname, spin, color, mass, width, texname,
1562+ antitexname, line, charge , propagating=True, goldstoneboson=False, **options):
1563+
1564+ args= (pdg_code, name, antiname, spin, color, mass, width, texname,
1565+ antitexname, line, float(charge))
1566+
1567+ FRBaseClass.__init__(self, *args, **options)
1568+
1569+ global all_particles
1570+ all_particles.append(self)
1571+
1572+ self.propagating = propagating
1573+ self.goldstoneboson= goldstoneboson
1574+
1575+ self.selfconjugate = (name == antiname)
1576+
1577+ def anti(self):
1578+ if self.selfconjugate:
1579+ raise Exception('%s has no anti particle.' % self.name)
1580+ outdic = {}
1581+ for k,v in self.__dict__.iteritems():
1582+ if k not in self.require_args_all:
1583+ outdic[k] = -v
1584+ if self.color in [1,8]:
1585+ newcolor = self.color
1586+ else:
1587+ newcolor = -self.color
1588+
1589+ return Particle(-self.pdg_code, self.antiname, self.name, self.spin, newcolor, self.mass, self.width,
1590+ self.antitexname, self.texname, self.line, -self.charge, self.propagating, self.goldstoneboson, **outdic)
1591+
1592+
1593+
1594+all_parameters = []
1595+
1596+class Parameter(FRBaseClass):
1597+
1598+ require_args=['name', 'nature', 'type', 'value', 'texname']
1599+
1600+ def __init__(self, name, nature, type, value, texname, lhablock=None, lhacode=None):
1601+
1602+ args = (name,nature,type,value,texname)
1603+
1604+ FRBaseClass.__init__(self, *args)
1605+
1606+ args=(name,nature,type,value,texname)
1607+
1608+ global all_parameters
1609+ all_parameters.append(self)
1610+
1611+ if (lhablock is None or lhacode is None) and nature == 'external':
1612+ raise Exception('Need LHA information for external parameter "%s".' % name)
1613+ self.lhablock = lhablock
1614+ self.lhacode = lhacode
1615+
1616+all_vertices = []
1617+
1618+class Vertex(FRBaseClass):
1619+
1620+ require_args=['name', 'particles', 'color', 'lorentz', 'couplings']
1621+
1622+ def __init__(self, name, particles, color, lorentz, couplings, **opt):
1623+
1624+ args = (name, particles, color, lorentz, couplings)
1625+
1626+ FRBaseClass.__init__(self, *args, **opt)
1627+
1628+ args=(particles,color,lorentz,couplings)
1629+
1630+ global all_vertices
1631+ all_vertices.append(self)
1632+
1633+all_couplings = []
1634+
1635+class Coupling(FRBaseClass):
1636+
1637+ require_args=['name', 'value', 'order']
1638+
1639+ def __init__(self, name, value, order, **opt):
1640+
1641+ args =(name, value, order)
1642+ FRBaseClass.__init__(self, *args, **opt)
1643+ global all_couplings
1644+ all_couplings.append(self)
1645+
1646+
1647+
1648+all_lorentz = []
1649+
1650+class Lorentz(FRBaseClass):
1651+
1652+ require_args=['name','spins','structure']
1653+
1654+ def __init__(self, name, spins, structure='external', **opt):
1655+ args = (name, spins, structure)
1656+ FRBaseClass.__init__(self, *args, **opt)
1657+
1658+ global all_lorentz
1659+ all_lorentz.append(self)
1660+
1661+
1662+all_functions = []
1663+
1664+class Function(object):
1665+
1666+ def __init__(self, name, arguments, expression):
1667+
1668+ global all_functions
1669+ all_functions.append(self)
1670+
1671+ self.name = name
1672+ self.arguments = arguments
1673+ self.expr = expression
1674+
1675+ def __call__(self, *opt):
1676+
1677+ for i, arg in enumerate(self.arguments):
1678+ exec('%s = %s' % (arg, opt[i] ))
1679+
1680+ return eval(self.expr)
1681+
1682+
1683+
1684
1685=== added file 'models/sextet_diquarks/parameters.py'
1686--- models/sextet_diquarks/parameters.py 1970-01-01 00:00:00 +0000
1687+++ models/sextet_diquarks/parameters.py 2010-12-15 07:31:31 +0000
1688@@ -0,0 +1,253 @@
1689+# This file was automatically created by FeynRules $Revision: 347 $
1690+# Mathematica version: 7.0 for Mac OS X x86 (64-bit) (November 11, 2008)
1691+# Date: Wed 20 Oct 2010 11:37:56
1692+
1693+
1694+
1695+from object_library import all_parameters, Parameter
1696+
1697+
1698+from function_library import complexconjugate, re, im, csc, sec, acsc, asec
1699+
1700+aEWM1 = Parameter(name = 'aEWM1',
1701+ nature = 'external',
1702+ type = 'real',
1703+ value = 132.50698,
1704+ texname = '\\text{aEWM1}',
1705+ lhablock = 'SMINPUTS',
1706+ lhacode = [ 1 ])
1707+
1708+Gf = Parameter(name = 'Gf',
1709+ nature = 'external',
1710+ type = 'real',
1711+ value = 0.0000116639,
1712+ texname = 'G_f',
1713+ lhablock = 'SMINPUTS',
1714+ lhacode = [ 2 ])
1715+
1716+aS = Parameter(name = 'aS',
1717+ nature = 'external',
1718+ type = 'real',
1719+ value = 0.118,
1720+ texname = '\\text{aS}',
1721+ lhablock = 'SMINPUTS',
1722+ lhacode = [ 3 ])
1723+
1724+ymb = Parameter(name = 'ymb',
1725+ nature = 'external',
1726+ type = 'real',
1727+ value = 4.2,
1728+ texname = '\\text{ymb}',
1729+ lhablock = 'YUKAWA',
1730+ lhacode = [ 5 ])
1731+
1732+ymt = Parameter(name = 'ymt',
1733+ nature = 'external',
1734+ type = 'real',
1735+ value = 164.5,
1736+ texname = '\\text{ymt}',
1737+ lhablock = 'YUKAWA',
1738+ lhacode = [ 6 ])
1739+
1740+ymtau = Parameter(name = 'ymtau',
1741+ nature = 'external',
1742+ type = 'real',
1743+ value = 1.777,
1744+ texname = '\\text{ymtau}',
1745+ lhablock = 'YUKAWA',
1746+ lhacode = [ 15 ])
1747+
1748+uusix = Parameter(name = 'uusix',
1749+ nature = 'external',
1750+ type = 'real',
1751+ value = 0.1,
1752+ texname = '\\text{uusix}',
1753+ lhablock = 'FRBlock',
1754+ lhacode = [ 1 ])
1755+
1756+ttsix = Parameter(name = 'ttsix',
1757+ nature = 'external',
1758+ type = 'real',
1759+ value = 1,
1760+ texname = '\\text{ttsix}',
1761+ lhablock = 'FRBlock',
1762+ lhacode = [ 2 ])
1763+
1764+MTA = Parameter(name = 'MTA',
1765+ nature = 'external',
1766+ type = 'real',
1767+ value = 1.777,
1768+ texname = '\\text{MTA}',
1769+ lhablock = 'MASS',
1770+ lhacode = [ 15 ])
1771+
1772+MT = Parameter(name = 'MT',
1773+ nature = 'external',
1774+ type = 'real',
1775+ value = 174.3,
1776+ texname = '\\text{MT}',
1777+ lhablock = 'MASS',
1778+ lhacode = [ 6 ])
1779+
1780+MB = Parameter(name = 'MB',
1781+ nature = 'external',
1782+ type = 'real',
1783+ value = 4.7,
1784+ texname = '\\text{MB}',
1785+ lhablock = 'MASS',
1786+ lhacode = [ 5 ])
1787+
1788+MZ = Parameter(name = 'MZ',
1789+ nature = 'external',
1790+ type = 'real',
1791+ value = 91.188,
1792+ texname = '\\text{MZ}',
1793+ lhablock = 'MASS',
1794+ lhacode = [ 23 ])
1795+
1796+MH = Parameter(name = 'MH',
1797+ nature = 'external',
1798+ type = 'real',
1799+ value = 120.,
1800+ texname = '\\text{MH}',
1801+ lhablock = 'MASS',
1802+ lhacode = [ 25 ])
1803+
1804+MSIX = Parameter(name = 'MSIX',
1805+ nature = 'external',
1806+ type = 'real',
1807+ value = 500,
1808+ texname = '\\text{MSIX}',
1809+ lhablock = 'MASS',
1810+ lhacode = [ 9000006 ])
1811+
1812+WT = Parameter(name = 'WT',
1813+ nature = 'external',
1814+ type = 'real',
1815+ value = 1.50833649,
1816+ texname = '\\text{WT}',
1817+ lhablock = 'DECAY',
1818+ lhacode = [ 6 ])
1819+
1820+WZ = Parameter(name = 'WZ',
1821+ nature = 'external',
1822+ type = 'real',
1823+ value = 2.44140351,
1824+ texname = '\\text{WZ}',
1825+ lhablock = 'DECAY',
1826+ lhacode = [ 23 ])
1827+
1828+WW = Parameter(name = 'WW',
1829+ nature = 'external',
1830+ type = 'real',
1831+ value = 2.04759951,
1832+ texname = '\\text{WW}',
1833+ lhablock = 'DECAY',
1834+ lhacode = [ 24 ])
1835+
1836+WH = Parameter(name = 'WH',
1837+ nature = 'external',
1838+ type = 'real',
1839+ value = 0.00575308848,
1840+ texname = '\\text{WH}',
1841+ lhablock = 'DECAY',
1842+ lhacode = [ 25 ])
1843+
1844+WSIX = Parameter(name = 'WSIX',
1845+ nature = 'external',
1846+ type = 'real',
1847+ value = 3,
1848+ texname = '\\text{WSIX}',
1849+ lhablock = 'DECAY',
1850+ lhacode = [ 9000006 ])
1851+
1852+aEW = Parameter(name = 'aEW',
1853+ nature = 'internal',
1854+ type = 'real',
1855+ value = '1/aEWM1',
1856+ texname = '\\text{aEW}')
1857+
1858+G = Parameter(name = 'G',
1859+ nature = 'internal',
1860+ type = 'real',
1861+ value = '2*cmath.sqrt(aS)*cmath.sqrt(cmath.pi)',
1862+ texname = 'G')
1863+
1864+MW = Parameter(name = 'MW',
1865+ nature = 'internal',
1866+ type = 'real',
1867+ value = 'cmath.sqrt(MZ**2/2. + cmath.sqrt(MZ**4/4. - (aEW*cmath.pi*MZ**2)/(Gf*cmath.sqrt(2))))',
1868+ texname = 'M_W')
1869+
1870+ee = Parameter(name = 'ee',
1871+ nature = 'internal',
1872+ type = 'real',
1873+ value = '2*cmath.sqrt(aEW)*cmath.sqrt(cmath.pi)',
1874+ texname = 'e')
1875+
1876+sw2 = Parameter(name = 'sw2',
1877+ nature = 'internal',
1878+ type = 'real',
1879+ value = '1 - MW**2/MZ**2',
1880+ texname = '\\text{sw2}')
1881+
1882+cw = Parameter(name = 'cw',
1883+ nature = 'internal',
1884+ type = 'real',
1885+ value = 'cmath.sqrt(1 - sw2)',
1886+ texname = 'c_w')
1887+
1888+sw = Parameter(name = 'sw',
1889+ nature = 'internal',
1890+ type = 'real',
1891+ value = 'cmath.sqrt(sw2)',
1892+ texname = 's_w')
1893+
1894+g1 = Parameter(name = 'g1',
1895+ nature = 'internal',
1896+ type = 'real',
1897+ value = 'ee/cw',
1898+ texname = 'g_1')
1899+
1900+gw = Parameter(name = 'gw',
1901+ nature = 'internal',
1902+ type = 'real',
1903+ value = 'ee/sw',
1904+ texname = 'g_w')
1905+
1906+v = Parameter(name = 'v',
1907+ nature = 'internal',
1908+ type = 'real',
1909+ value = '(2*MW*sw)/ee',
1910+ texname = 'v')
1911+
1912+lam = Parameter(name = 'lam',
1913+ nature = 'internal',
1914+ type = 'real',
1915+ value = 'MH**2/(2.*v**2)',
1916+ texname = '\\text{lam}')
1917+
1918+yb = Parameter(name = 'yb',
1919+ nature = 'internal',
1920+ type = 'real',
1921+ value = '(ymb*cmath.sqrt(2))/v',
1922+ texname = '\\text{yb}')
1923+
1924+yt = Parameter(name = 'yt',
1925+ nature = 'internal',
1926+ type = 'real',
1927+ value = '(ymt*cmath.sqrt(2))/v',
1928+ texname = '\\text{yt}')
1929+
1930+ytau = Parameter(name = 'ytau',
1931+ nature = 'internal',
1932+ type = 'real',
1933+ value = '(ymtau*cmath.sqrt(2))/v',
1934+ texname = '\\text{ytau}')
1935+
1936+muH = Parameter(name = 'muH',
1937+ nature = 'internal',
1938+ type = 'real',
1939+ value = 'cmath.sqrt(lam*v**2)',
1940+ texname = '\\mu ')
1941+
1942
1943=== added file 'models/sextet_diquarks/particles.py'
1944--- models/sextet_diquarks/particles.py 1970-01-01 00:00:00 +0000
1945+++ models/sextet_diquarks/particles.py 2010-12-15 07:31:31 +0000
1946@@ -0,0 +1,400 @@
1947+# This file was automatically created by FeynRules $Revision: 347 $
1948+# Mathematica version: 7.0 for Mac OS X x86 (64-bit) (November 11, 2008)
1949+# Date: Wed 20 Oct 2010 11:37:56
1950+
1951+
1952+from __future__ import division
1953+from object_library import all_particles, Particle
1954+
1955+ve = Particle(pdg_code = 12,
1956+ name = 've',
1957+ antiname = 've~',
1958+ spin = 2,
1959+ color = 1,
1960+ mass = 'ZERO',
1961+ width = 'ZERO',
1962+ texname = 've',
1963+ antitexname = 've',
1964+ line = 'straight',
1965+ charge = 0,
1966+ LeptonNumber = 1,
1967+ GhostNumber = 0)
1968+
1969+ve__tilde__ = ve.anti()
1970+
1971+vm = Particle(pdg_code = 14,
1972+ name = 'vm',
1973+ antiname = 'vm~',
1974+ spin = 2,
1975+ color = 1,
1976+ mass = 'ZERO',
1977+ width = 'ZERO',
1978+ texname = 'vm',
1979+ antitexname = 'vm',
1980+ line = 'straight',
1981+ charge = 0,
1982+ LeptonNumber = 1,
1983+ GhostNumber = 0)
1984+
1985+vm__tilde__ = vm.anti()
1986+
1987+vt = Particle(pdg_code = 16,
1988+ name = 'vt',
1989+ antiname = 'vt~',
1990+ spin = 2,
1991+ color = 1,
1992+ mass = 'ZERO',
1993+ width = 'ZERO',
1994+ texname = 'vt',
1995+ antitexname = 'vt',
1996+ line = 'straight',
1997+ charge = 0,
1998+ LeptonNumber = 1,
1999+ GhostNumber = 0)
2000+
2001+vt__tilde__ = vt.anti()
2002+
2003+e__minus__ = Particle(pdg_code = 11,
2004+ name = 'e-',
2005+ antiname = 'e+',
2006+ spin = 2,
2007+ color = 1,
2008+ mass = 'ZERO',
2009+ width = 'ZERO',
2010+ texname = 'e-',
2011+ antitexname = 'e-',
2012+ line = 'straight',
2013+ charge = -1,
2014+ LeptonNumber = 1,
2015+ GhostNumber = 0)
2016+
2017+e__plus__ = e__minus__.anti()
2018+
2019+m__minus__ = Particle(pdg_code = 13,
2020+ name = 'm-',
2021+ antiname = 'm+',
2022+ spin = 2,
2023+ color = 1,
2024+ mass = 'ZERO',
2025+ width = 'ZERO',
2026+ texname = 'm-',
2027+ antitexname = 'm-',
2028+ line = 'straight',
2029+ charge = -1,
2030+ LeptonNumber = 1,
2031+ GhostNumber = 0)
2032+
2033+m__plus__ = m__minus__.anti()
2034+
2035+tt__minus__ = Particle(pdg_code = 15,
2036+ name = 'tt-',
2037+ antiname = 'tt+',
2038+ spin = 2,
2039+ color = 1,
2040+ mass = 'MTA',
2041+ width = 'ZERO',
2042+ texname = 'tt-',
2043+ antitexname = 'tt-',
2044+ line = 'straight',
2045+ charge = -1,
2046+ LeptonNumber = 1,
2047+ GhostNumber = 0)
2048+
2049+tt__plus__ = tt__minus__.anti()
2050+
2051+u = Particle(pdg_code = 2,
2052+ name = 'u',
2053+ antiname = 'u~',
2054+ spin = 2,
2055+ color = 3,
2056+ mass = 'ZERO',
2057+ width = 'ZERO',
2058+ texname = 'u',
2059+ antitexname = 'u',
2060+ line = 'straight',
2061+ charge = 2/3,
2062+ LeptonNumber = 0,
2063+ GhostNumber = 0)
2064+
2065+u__tilde__ = u.anti()
2066+
2067+c = Particle(pdg_code = 4,
2068+ name = 'c',
2069+ antiname = 'c~',
2070+ spin = 2,
2071+ color = 3,
2072+ mass = 'ZERO',
2073+ width = 'ZERO',
2074+ texname = 'c',
2075+ antitexname = 'c',
2076+ line = 'straight',
2077+ charge = 2/3,
2078+ LeptonNumber = 0,
2079+ GhostNumber = 0)
2080+
2081+c__tilde__ = c.anti()
2082+
2083+t = Particle(pdg_code = 6,
2084+ name = 't',
2085+ antiname = 't~',
2086+ spin = 2,
2087+ color = 3,
2088+ mass = 'MT',
2089+ width = 'WT',
2090+ texname = 't',
2091+ antitexname = 't',
2092+ line = 'straight',
2093+ charge = 2/3,
2094+ LeptonNumber = 0,
2095+ GhostNumber = 0)
2096+
2097+t__tilde__ = t.anti()
2098+
2099+d = Particle(pdg_code = 1,
2100+ name = 'd',
2101+ antiname = 'd~',
2102+ spin = 2,
2103+ color = 3,
2104+ mass = 'ZERO',
2105+ width = 'ZERO',
2106+ texname = 'd',
2107+ antitexname = 'd',
2108+ line = 'straight',
2109+ charge = -1/3,
2110+ LeptonNumber = 0,
2111+ GhostNumber = 0)
2112+
2113+d__tilde__ = d.anti()
2114+
2115+s = Particle(pdg_code = 3,
2116+ name = 's',
2117+ antiname = 's~',
2118+ spin = 2,
2119+ color = 3,
2120+ mass = 'ZERO',
2121+ width = 'ZERO',
2122+ texname = 's',
2123+ antitexname = 's',
2124+ line = 'straight',
2125+ charge = -1/3,
2126+ LeptonNumber = 0,
2127+ GhostNumber = 0)
2128+
2129+s__tilde__ = s.anti()
2130+
2131+b = Particle(pdg_code = 5,
2132+ name = 'b',
2133+ antiname = 'b~',
2134+ spin = 2,
2135+ color = 3,
2136+ mass = 'MB',
2137+ width = 'ZERO',
2138+ texname = 'b',
2139+ antitexname = 'b',
2140+ line = 'straight',
2141+ charge = -1/3,
2142+ LeptonNumber = 0,
2143+ GhostNumber = 0)
2144+
2145+b__tilde__ = b.anti()
2146+
2147+ghA = Particle(pdg_code = 9000001,
2148+ name = 'ghA',
2149+ antiname = 'ghA~',
2150+ spin = -1,
2151+ color = 1,
2152+ mass = 'ZERO',
2153+ width = 'WghA',
2154+ texname = 'ghA',
2155+ antitexname = 'ghA',
2156+ line = 'dotted',
2157+ charge = 0,
2158+ LeptonNumber = 0,
2159+ GhostNumber = 1)
2160+
2161+ghA__tilde__ = ghA.anti()
2162+
2163+ghZ = Particle(pdg_code = 9000002,
2164+ name = 'ghZ',
2165+ antiname = 'ghZ~',
2166+ spin = -1,
2167+ color = 1,
2168+ mass = 'MZ',
2169+ width = 'WghZ',
2170+ texname = 'ghZ',
2171+ antitexname = 'ghZ',
2172+ line = 'dotted',
2173+ charge = 0,
2174+ LeptonNumber = 0,
2175+ GhostNumber = 1)
2176+
2177+ghZ__tilde__ = ghZ.anti()
2178+
2179+ghWp = Particle(pdg_code = 9000003,
2180+ name = 'ghWp',
2181+ antiname = 'ghWp~',
2182+ spin = -1,
2183+ color = 1,
2184+ mass = 'MW',
2185+ width = 'WghWp',
2186+ texname = 'ghWp',
2187+ antitexname = 'ghWp',
2188+ line = 'dotted',
2189+ charge = 1,
2190+ LeptonNumber = 0,
2191+ GhostNumber = 1)
2192+
2193+ghWp__tilde__ = ghWp.anti()
2194+
2195+ghWm = Particle(pdg_code = 9000004,
2196+ name = 'ghWm',
2197+ antiname = 'ghWm~',
2198+ spin = -1,
2199+ color = 1,
2200+ mass = 'MW',
2201+ width = 'WghWm',
2202+ texname = 'ghWm',
2203+ antitexname = 'ghWm',
2204+ line = 'dotted',
2205+ charge = -1,
2206+ LeptonNumber = 0,
2207+ GhostNumber = 1)
2208+
2209+ghWm__tilde__ = ghWm.anti()
2210+
2211+ghG = Particle(pdg_code = 9000005,
2212+ name = 'ghG',
2213+ antiname = 'ghG~',
2214+ spin = -1,
2215+ color = 8,
2216+ mass = 'ZERO',
2217+ width = 'WghG',
2218+ texname = 'ghG',
2219+ antitexname = 'ghG',
2220+ line = 'dotted',
2221+ charge = 0,
2222+ LeptonNumber = 0,
2223+ GhostNumber = 1)
2224+
2225+ghG__tilde__ = ghG.anti()
2226+
2227+A = Particle(pdg_code = 22,
2228+ name = 'A',
2229+ antiname = 'A',
2230+ spin = 3,
2231+ color = 1,
2232+ mass = 'ZERO',
2233+ width = 'ZERO',
2234+ texname = 'A',
2235+ antitexname = 'A',
2236+ line = 'wavy',
2237+ charge = 0,
2238+ LeptonNumber = 0,
2239+ GhostNumber = 0)
2240+
2241+Z = Particle(pdg_code = 23,
2242+ name = 'Z',
2243+ antiname = 'Z',
2244+ spin = 3,
2245+ color = 1,
2246+ mass = 'MZ',
2247+ width = 'WZ',
2248+ texname = 'Z',
2249+ antitexname = 'Z',
2250+ line = 'wavy',
2251+ charge = 0,
2252+ LeptonNumber = 0,
2253+ GhostNumber = 0)
2254+
2255+W__plus__ = Particle(pdg_code = 24,
2256+ name = 'W+',
2257+ antiname = 'W-',
2258+ spin = 3,
2259+ color = 1,
2260+ mass = 'MW',
2261+ width = 'WW',
2262+ texname = 'W+',
2263+ antitexname = 'W+',
2264+ line = 'wavy',
2265+ charge = 1,
2266+ LeptonNumber = 0,
2267+ GhostNumber = 0)
2268+
2269+W__minus__ = W__plus__.anti()
2270+
2271+G = Particle(pdg_code = 21,
2272+ name = 'G',
2273+ antiname = 'G',
2274+ spin = 3,
2275+ color = 8,
2276+ mass = 'ZERO',
2277+ width = 'ZERO',
2278+ texname = 'G',
2279+ antitexname = 'G',
2280+ line = 'curly',
2281+ charge = 0,
2282+ LeptonNumber = 0,
2283+ GhostNumber = 0)
2284+
2285+H = Particle(pdg_code = 25,
2286+ name = 'H',
2287+ antiname = 'H',
2288+ spin = 1,
2289+ color = 1,
2290+ mass = 'MH',
2291+ width = 'WH',
2292+ texname = '\\phi',
2293+ antitexname = '\\phi',
2294+ line = 'dashed',
2295+ charge = 0,
2296+ LeptonNumber = 0,
2297+ GhostNumber = 0)
2298+
2299+phi0 = Particle(pdg_code = 250,
2300+ name = 'phi0',
2301+ antiname = 'phi0',
2302+ spin = 1,
2303+ color = 1,
2304+ mass = 'MZ',
2305+ width = 'Wphi',
2306+ texname = 'phi0',
2307+ antitexname = 'phi0',
2308+ line = 'dashed',
2309+ GoldstoneBoson = True,
2310+ charge = 0,
2311+ LeptonNumber = 0,
2312+ GhostNumber = 0)
2313+
2314+phi__plus__ = Particle(pdg_code = 251,
2315+ name = 'phi+',
2316+ antiname = 'phi-',
2317+ spin = 1,
2318+ color = 1,
2319+ mass = 'MW',
2320+ width = 'Wphi2',
2321+ texname = '\\phi^+',
2322+ antitexname = '\\phi^+',
2323+ line = 'dashed',
2324+ GoldstoneBoson = True,
2325+ charge = 1,
2326+ LeptonNumber = 0,
2327+ GhostNumber = 0)
2328+
2329+phi__minus__ = phi__plus__.anti()
2330+
2331+six = Particle(pdg_code = 9000006,
2332+ name = 'six',
2333+ antiname = 'six~',
2334+ spin = 1,
2335+ color = 6,
2336+ mass = 'MSIX',
2337+ width = 'WSIX',
2338+ texname = 'six',
2339+ antitexname = 'six',
2340+ line = 'dashed',
2341+ charge = 4/3,
2342+ LeptonNumber = 0,
2343+ GhostNumber = 0)
2344+
2345+six__tilde__ = six.anti()
2346+
2347
2348=== added file 'models/sextet_diquarks/vertices.py'
2349--- models/sextet_diquarks/vertices.py 1970-01-01 00:00:00 +0000
2350+++ models/sextet_diquarks/vertices.py 2010-12-15 07:31:31 +0000
2351@@ -0,0 +1,383 @@
2352+# This file was automatically created by FeynRules $Revision: 347 $
2353+# Mathematica version: 7.0 for Mac OS X x86 (64-bit) (November 11, 2008)
2354+# Date: Wed 20 Oct 2010 11:37:56
2355+
2356+
2357+from object_library import all_vertices, Vertex
2358+import particles as P
2359+import couplings as C
2360+import lorentz as L
2361+
2362+
2363+V_1 = Vertex(name = 'V_1',
2364+ particles = [ P.H, P.H, P.H, P.H ],
2365+ color = [ '1' ],
2366+ lorentz = [ L.SSSS1 ],
2367+ couplings = {(0,0):C.GC_11})
2368+
2369+V_2 = Vertex(name = 'V_2',
2370+ particles = [ P.H, P.H, P.H ],
2371+ color = [ '1' ],
2372+ lorentz = [ L.SSS1 ],
2373+ couplings = {(0,0):C.GC_25})
2374+
2375+V_3 = Vertex(name = 'V_3',
2376+ particles = [ P.G, P.G, P.G ],
2377+ color = [ 'f(1,2,3)' ],
2378+ lorentz = [ L.VVV1 ],
2379+ couplings = {(0,0):C.GC_4})
2380+
2381+V_4 = Vertex(name = 'V_4',
2382+ particles = [ P.G, P.G, P.G, P.G ],
2383+ color = [ 'f(-1,1,2)*f(3,4,-1)', 'f(-1,1,3)*f(2,4,-1)', 'f(-1,1,4)*f(2,3,-1)' ],
2384+ lorentz = [ L.VVVV1, L.VVVV3, L.VVVV4 ],
2385+ couplings = {(1,1):C.GC_7,(0,0):C.GC_7,(2,2):C.GC_7})
2386+
2387+V_5 = Vertex(name = 'V_5',
2388+ particles = [ P.t, P.t, P.six__tilde__ ],
2389+ color = [ 'K6Bar(3,1,2)' ],
2390+ lorentz = [ L.FFS1 ],
2391+ couplings = {(0,0):C.GC_23})
2392+
2393+V_6 = Vertex(name = 'V_6',
2394+ particles = [ P.u, P.u, P.six__tilde__ ],
2395+ color = [ 'K6Bar(3,1,2)' ],
2396+ lorentz = [ L.FFS1 ],
2397+ couplings = {(0,0):C.GC_24})
2398+
2399+V_7 = Vertex(name = 'V_7',
2400+ particles = [ P.t__tilde__, P.t__tilde__, P.six ],
2401+ color = [ 'K6(3,1,2)' ],
2402+ lorentz = [ L.FFS1 ],
2403+ couplings = {(0,0):C.GC_23})
2404+
2405+V_8 = Vertex(name = 'V_8',
2406+ particles = [ P.u__tilde__, P.u__tilde__, P.six ],
2407+ color = [ 'K6(3,1,2)' ],
2408+ lorentz = [ L.FFS1 ],
2409+ couplings = {(0,0):C.GC_24})
2410+
2411+V_9 = Vertex(name = 'V_9',
2412+ particles = [ P.G, P.six__tilde__, P.six ],
2413+ color = [ 'T6(1,3,2)' ],
2414+ lorentz = [ L.VSS1 ],
2415+ couplings = {(0,0):C.GC_5})
2416+
2417+V_10 = Vertex(name = 'V_10',
2418+ particles = [ P.G, P.G, P.six__tilde__, P.six ],
2419+ color = [ 'T6(1,-1,3)*T6(2,4,-1)', 'T6(1,4,-1)*T6(2,-1,3)' ],
2420+ lorentz = [ L.VVSS1 ],
2421+ couplings = {(0,0):C.GC_7,(1,0):C.GC_7})
2422+
2423+V_11 = Vertex(name = 'V_11',
2424+ particles = [ P.A, P.W__minus__, P.W__plus__ ],
2425+ color = [ '1' ],
2426+ lorentz = [ L.VVV1 ],
2427+ couplings = {(0,0):C.GC_18})
2428+
2429+V_12 = Vertex(name = 'V_12',
2430+ particles = [ P.W__minus__, P.W__plus__, P.H, P.H ],
2431+ color = [ '1' ],
2432+ lorentz = [ L.VVSS1 ],
2433+ couplings = {(0,0):C.GC_12})
2434+
2435+V_13 = Vertex(name = 'V_13',
2436+ particles = [ P.W__minus__, P.W__plus__, P.H ],
2437+ color = [ '1' ],
2438+ lorentz = [ L.VVS1 ],
2439+ couplings = {(0,0):C.GC_26})
2440+
2441+V_14 = Vertex(name = 'V_14',
2442+ particles = [ P.A, P.A, P.W__minus__, P.W__plus__ ],
2443+ color = [ '1' ],
2444+ lorentz = [ L.VVVV2 ],
2445+ couplings = {(0,0):C.GC_20})
2446+
2447+V_15 = Vertex(name = 'V_15',
2448+ particles = [ P.W__minus__, P.W__plus__, P.Z ],
2449+ color = [ '1' ],
2450+ lorentz = [ L.VVV1 ],
2451+ couplings = {(0,0):C.GC_8})
2452+
2453+V_16 = Vertex(name = 'V_16',
2454+ particles = [ P.W__minus__, P.W__minus__, P.W__plus__, P.W__plus__ ],
2455+ color = [ '1' ],
2456+ lorentz = [ L.VVVV2 ],
2457+ couplings = {(0,0):C.GC_9})
2458+
2459+V_17 = Vertex(name = 'V_17',
2460+ particles = [ P.A, P.W__minus__, P.W__plus__, P.Z ],
2461+ color = [ '1' ],
2462+ lorentz = [ L.VVVV5 ],
2463+ couplings = {(0,0):C.GC_19})
2464+
2465+V_18 = Vertex(name = 'V_18',
2466+ particles = [ P.Z, P.Z, P.H, P.H ],
2467+ color = [ '1' ],
2468+ lorentz = [ L.VVSS1 ],
2469+ couplings = {(0,0):C.GC_22})
2470+
2471+V_19 = Vertex(name = 'V_19',
2472+ particles = [ P.Z, P.Z, P.H ],
2473+ color = [ '1' ],
2474+ lorentz = [ L.VVS1 ],
2475+ couplings = {(0,0):C.GC_27})
2476+
2477+V_20 = Vertex(name = 'V_20',
2478+ particles = [ P.W__minus__, P.W__plus__, P.Z, P.Z ],
2479+ color = [ '1' ],
2480+ lorentz = [ L.VVVV2 ],
2481+ couplings = {(0,0):C.GC_10})
2482+
2483+V_21 = Vertex(name = 'V_21',
2484+ particles = [ P.d__tilde__, P.d, P.A ],
2485+ color = [ 'Identity(1,2)' ],
2486+ lorentz = [ L.FFV1 ],
2487+ couplings = {(0,0):C.GC_1})
2488+
2489+V_22 = Vertex(name = 'V_22',
2490+ particles = [ P.s__tilde__, P.s, P.A ],
2491+ color = [ 'Identity(1,2)' ],
2492+ lorentz = [ L.FFV1 ],
2493+ couplings = {(0,0):C.GC_1})
2494+
2495+V_23 = Vertex(name = 'V_23',
2496+ particles = [ P.b__tilde__, P.b, P.A ],
2497+ color = [ 'Identity(1,2)' ],
2498+ lorentz = [ L.FFV1 ],
2499+ couplings = {(0,0):C.GC_1})
2500+
2501+V_24 = Vertex(name = 'V_24',
2502+ particles = [ P.e__plus__, P.e__minus__, P.A ],
2503+ color = [ '1' ],
2504+ lorentz = [ L.FFV1 ],
2505+ couplings = {(0,0):C.GC_3})
2506+
2507+V_25 = Vertex(name = 'V_25',
2508+ particles = [ P.m__plus__, P.m__minus__, P.A ],
2509+ color = [ '1' ],
2510+ lorentz = [ L.FFV1 ],
2511+ couplings = {(0,0):C.GC_3})
2512+
2513+V_26 = Vertex(name = 'V_26',
2514+ particles = [ P.tt__plus__, P.tt__minus__, P.A ],
2515+ color = [ '1' ],
2516+ lorentz = [ L.FFV1 ],
2517+ couplings = {(0,0):C.GC_3})
2518+
2519+V_27 = Vertex(name = 'V_27',
2520+ particles = [ P.u__tilde__, P.u, P.A ],
2521+ color = [ 'Identity(1,2)' ],
2522+ lorentz = [ L.FFV1 ],
2523+ couplings = {(0,0):C.GC_2})
2524+
2525+V_28 = Vertex(name = 'V_28',
2526+ particles = [ P.c__tilde__, P.c, P.A ],
2527+ color = [ 'Identity(1,2)' ],
2528+ lorentz = [ L.FFV1 ],
2529+ couplings = {(0,0):C.GC_2})
2530+
2531+V_29 = Vertex(name = 'V_29',
2532+ particles = [ P.t__tilde__, P.t, P.A ],
2533+ color = [ 'Identity(1,2)' ],
2534+ lorentz = [ L.FFV1 ],
2535+ couplings = {(0,0):C.GC_2})
2536+
2537+V_30 = Vertex(name = 'V_30',
2538+ particles = [ P.d__tilde__, P.d, P.G ],
2539+ color = [ 'T(3,2,1)' ],
2540+ lorentz = [ L.FFV1 ],
2541+ couplings = {(0,0):C.GC_6})
2542+
2543+V_31 = Vertex(name = 'V_31',
2544+ particles = [ P.s__tilde__, P.s, P.G ],
2545+ color = [ 'T(3,2,1)' ],
2546+ lorentz = [ L.FFV1 ],
2547+ couplings = {(0,0):C.GC_6})
2548+
2549+V_32 = Vertex(name = 'V_32',
2550+ particles = [ P.b__tilde__, P.b, P.G ],
2551+ color = [ 'T(3,2,1)' ],
2552+ lorentz = [ L.FFV1 ],
2553+ couplings = {(0,0):C.GC_6})
2554+
2555+V_33 = Vertex(name = 'V_33',
2556+ particles = [ P.b__tilde__, P.b, P.H ],
2557+ color = [ 'Identity(1,2)' ],
2558+ lorentz = [ L.FFS1 ],
2559+ couplings = {(0,0):C.GC_28})
2560+
2561+V_34 = Vertex(name = 'V_34',
2562+ particles = [ P.d__tilde__, P.d, P.Z ],
2563+ color = [ 'Identity(1,2)' ],
2564+ lorentz = [ L.FFV2, L.FFV3 ],
2565+ couplings = {(0,0):C.GC_14,(0,1):C.GC_16})
2566+
2567+V_35 = Vertex(name = 'V_35',
2568+ particles = [ P.s__tilde__, P.s, P.Z ],
2569+ color = [ 'Identity(1,2)' ],
2570+ lorentz = [ L.FFV2, L.FFV3 ],
2571+ couplings = {(0,0):C.GC_14,(0,1):C.GC_16})
2572+
2573+V_36 = Vertex(name = 'V_36',
2574+ particles = [ P.b__tilde__, P.b, P.Z ],
2575+ color = [ 'Identity(1,2)' ],
2576+ lorentz = [ L.FFV2, L.FFV3 ],
2577+ couplings = {(0,0):C.GC_14,(0,1):C.GC_16})
2578+
2579+V_37 = Vertex(name = 'V_37',
2580+ particles = [ P.d__tilde__, P.u, P.W__minus__ ],
2581+ color = [ 'Identity(1,2)' ],
2582+ lorentz = [ L.FFV2 ],
2583+ couplings = {(0,0):C.GC_13})
2584+
2585+V_38 = Vertex(name = 'V_38',
2586+ particles = [ P.s__tilde__, P.c, P.W__minus__ ],
2587+ color = [ 'Identity(1,2)' ],
2588+ lorentz = [ L.FFV2 ],
2589+ couplings = {(0,0):C.GC_13})
2590+
2591+V_39 = Vertex(name = 'V_39',
2592+ particles = [ P.b__tilde__, P.t, P.W__minus__ ],
2593+ color = [ 'Identity(1,2)' ],
2594+ lorentz = [ L.FFV2 ],
2595+ couplings = {(0,0):C.GC_13})
2596+
2597+V_40 = Vertex(name = 'V_40',
2598+ particles = [ P.u__tilde__, P.d, P.W__plus__ ],
2599+ color = [ 'Identity(1,2)' ],
2600+ lorentz = [ L.FFV2 ],
2601+ couplings = {(0,0):C.GC_13})
2602+
2603+V_41 = Vertex(name = 'V_41',
2604+ particles = [ P.c__tilde__, P.s, P.W__plus__ ],
2605+ color = [ 'Identity(1,2)' ],
2606+ lorentz = [ L.FFV2 ],
2607+ couplings = {(0,0):C.GC_13})
2608+
2609+V_42 = Vertex(name = 'V_42',
2610+ particles = [ P.t__tilde__, P.b, P.W__plus__ ],
2611+ color = [ 'Identity(1,2)' ],
2612+ lorentz = [ L.FFV2 ],
2613+ couplings = {(0,0):C.GC_13})
2614+
2615+V_43 = Vertex(name = 'V_43',
2616+ particles = [ P.u__tilde__, P.u, P.G ],
2617+ color = [ 'T(3,2,1)' ],
2618+ lorentz = [ L.FFV1 ],
2619+ couplings = {(0,0):C.GC_6})
2620+
2621+V_44 = Vertex(name = 'V_44',
2622+ particles = [ P.c__tilde__, P.c, P.G ],
2623+ color = [ 'T(3,2,1)' ],
2624+ lorentz = [ L.FFV1 ],
2625+ couplings = {(0,0):C.GC_6})
2626+
2627+V_45 = Vertex(name = 'V_45',
2628+ particles = [ P.t__tilde__, P.t, P.G ],
2629+ color = [ 'T(3,2,1)' ],
2630+ lorentz = [ L.FFV1 ],
2631+ couplings = {(0,0):C.GC_6})
2632+
2633+V_46 = Vertex(name = 'V_46',
2634+ particles = [ P.tt__plus__, P.tt__minus__, P.H ],
2635+ color = [ '1' ],
2636+ lorentz = [ L.FFS1 ],
2637+ couplings = {(0,0):C.GC_30})
2638+
2639+V_47 = Vertex(name = 'V_47',
2640+ particles = [ P.t__tilde__, P.t, P.H ],
2641+ color = [ 'Identity(1,2)' ],
2642+ lorentz = [ L.FFS1 ],
2643+ couplings = {(0,0):C.GC_29})
2644+
2645+V_48 = Vertex(name = 'V_48',
2646+ particles = [ P.e__plus__, P.e__minus__, P.Z ],
2647+ color = [ '1' ],
2648+ lorentz = [ L.FFV2, L.FFV4 ],
2649+ couplings = {(0,0):C.GC_14,(0,1):C.GC_17})
2650+
2651+V_49 = Vertex(name = 'V_49',
2652+ particles = [ P.m__plus__, P.m__minus__, P.Z ],
2653+ color = [ '1' ],
2654+ lorentz = [ L.FFV2, L.FFV4 ],
2655+ couplings = {(0,0):C.GC_14,(0,1):C.GC_17})
2656+
2657+V_50 = Vertex(name = 'V_50',
2658+ particles = [ P.tt__plus__, P.tt__minus__, P.Z ],
2659+ color = [ '1' ],
2660+ lorentz = [ L.FFV2, L.FFV4 ],
2661+ couplings = {(0,0):C.GC_14,(0,1):C.GC_17})
2662+
2663+V_51 = Vertex(name = 'V_51',
2664+ particles = [ P.e__plus__, P.ve, P.W__minus__ ],
2665+ color = [ '1' ],
2666+ lorentz = [ L.FFV2 ],
2667+ couplings = {(0,0):C.GC_13})
2668+
2669+V_52 = Vertex(name = 'V_52',
2670+ particles = [ P.m__plus__, P.vm, P.W__minus__ ],
2671+ color = [ '1' ],
2672+ lorentz = [ L.FFV2 ],
2673+ couplings = {(0,0):C.GC_13})
2674+
2675+V_53 = Vertex(name = 'V_53',
2676+ particles = [ P.tt__plus__, P.vt, P.W__minus__ ],
2677+ color = [ '1' ],
2678+ lorentz = [ L.FFV2 ],
2679+ couplings = {(0,0):C.GC_13})
2680+
2681+V_54 = Vertex(name = 'V_54',
2682+ particles = [ P.ve__tilde__, P.e__minus__, P.W__plus__ ],
2683+ color = [ '1' ],
2684+ lorentz = [ L.FFV2 ],
2685+ couplings = {(0,0):C.GC_13})
2686+
2687+V_55 = Vertex(name = 'V_55',
2688+ particles = [ P.vm__tilde__, P.m__minus__, P.W__plus__ ],
2689+ color = [ '1' ],
2690+ lorentz = [ L.FFV2 ],
2691+ couplings = {(0,0):C.GC_13})
2692+
2693+V_56 = Vertex(name = 'V_56',
2694+ particles = [ P.vt__tilde__, P.tt__minus__, P.W__plus__ ],
2695+ color = [ '1' ],
2696+ lorentz = [ L.FFV2 ],
2697+ couplings = {(0,0):C.GC_13})
2698+
2699+V_57 = Vertex(name = 'V_57',
2700+ particles = [ P.u__tilde__, P.u, P.Z ],
2701+ color = [ 'Identity(1,2)' ],
2702+ lorentz = [ L.FFV2, L.FFV5 ],
2703+ couplings = {(0,0):C.GC_15,(0,1):C.GC_16})
2704+
2705+V_58 = Vertex(name = 'V_58',
2706+ particles = [ P.c__tilde__, P.c, P.Z ],
2707+ color = [ 'Identity(1,2)' ],
2708+ lorentz = [ L.FFV2, L.FFV5 ],
2709+ couplings = {(0,0):C.GC_15,(0,1):C.GC_16})
2710+
2711+V_59 = Vertex(name = 'V_59',
2712+ particles = [ P.t__tilde__, P.t, P.Z ],
2713+ color = [ 'Identity(1,2)' ],
2714+ lorentz = [ L.FFV2, L.FFV5 ],
2715+ couplings = {(0,0):C.GC_15,(0,1):C.GC_16})
2716+
2717+V_60 = Vertex(name = 'V_60',
2718+ particles = [ P.ve__tilde__, P.ve, P.Z ],
2719+ color = [ '1' ],
2720+ lorentz = [ L.FFV2 ],
2721+ couplings = {(0,0):C.GC_21})
2722+
2723+V_61 = Vertex(name = 'V_61',
2724+ particles = [ P.vm__tilde__, P.vm, P.Z ],
2725+ color = [ '1' ],
2726+ lorentz = [ L.FFV2 ],
2727+ couplings = {(0,0):C.GC_21})
2728+
2729+V_62 = Vertex(name = 'V_62',
2730+ particles = [ P.vt__tilde__, P.vt, P.Z ],
2731+ color = [ '1' ],
2732+ lorentz = [ L.FFV2 ],
2733+ couplings = {(0,0):C.GC_21})
2734+
2735
2736=== added file 'models/sextet_diquarks/write_param_card.py'
2737--- models/sextet_diquarks/write_param_card.py 1970-01-01 00:00:00 +0000
2738+++ models/sextet_diquarks/write_param_card.py 2010-12-15 07:31:31 +0000
2739@@ -0,0 +1,65 @@
2740+
2741+__date__ = "3 june 2010"
2742+__author__ = 'olivier.mattelaer@uclouvain.be'
2743+
2744+class ParamCardWriter(object):
2745+
2746+ header = \
2747+ """######################################################################\n""" + \
2748+ """## PARAM_CARD AUTOMATICALY GENERATED BY THE UFO #####################\n""" + \
2749+ """######################################################################\n"""
2750+
2751+ def __init__(self, filename, list_of_parameters=None):
2752+ """write a valid param_card.dat"""
2753+
2754+ if not list_of_parameters:
2755+ from parameters import all_parameters
2756+ list_of_parameters = [param for param in all_parameters if \
2757+ param.nature=='external']
2758+
2759+ self.fsock = open(filename, 'w')
2760+ self.fsock.write(self.header)
2761+
2762+ self.write_card(list_of_parameters)
2763+
2764+
2765+ def write_card(self, all_ext_param):
2766+ """ """
2767+
2768+
2769+
2770+ # list all lhablock
2771+ all_lhablock = set([param.lhablock for param in all_ext_param])
2772+
2773+ # ordonate lhablock alphabeticaly
2774+ list(all_lhablock).sort()
2775+
2776+ for lhablock in all_lhablock:
2777+ self.write_block(lhablock)
2778+ [self.write_param(param, lhablock) for param in all_ext_param if \
2779+ param.lhablock == lhablock]
2780+ def write_block(self, name):
2781+ """ write a comment for a block"""
2782+
2783+ self.fsock.writelines(
2784+ """\n###################################""" + \
2785+ """\n## INFORMATION FOR %s""" % name.upper() +\
2786+ """\n###################################\n"""
2787+ )
2788+ if name!='DECAY':
2789+ self.fsock.write("""Block %s \n""" % name)
2790+
2791+ def write_param(self, param, lhablock):
2792+
2793+ lhacode=' '.join(['%3s' % key for key in param.lhacode])
2794+ if lhablock != 'DECAY':
2795+ text = """ %s %e # %s \n""" % (lhacode, param.value, param.name )
2796+ else:
2797+ text = '''DECAY %s %e \n''' % (lhacode, param.value)
2798+ self.fsock.write(text)
2799+
2800+
2801+if '__main__' == __name__:
2802+ ParamCardWriter('./param_card.dat')
2803+ print 'done'
2804+
2805
2806=== added directory 'models/triplet_diquarks'
2807=== added file 'models/triplet_diquarks/Epsijk_SM_UFO.log'
2808--- models/triplet_diquarks/Epsijk_SM_UFO.log 1970-01-01 00:00:00 +0000
2809+++ models/triplet_diquarks/Epsijk_SM_UFO.log 2010-12-15 07:31:31 +0000
2810@@ -0,0 +1,65 @@
2811+# This file was automatically created by FeynRules $Revision: 347 $
2812+# Mathematica version: 7.0 for Mac OS X x86 (64-bit) (November 11, 2008)
2813+# Date: Wed 20 Oct 2010 11:36:28
2814+
2815+
2816+#
2817+# This is the logfile for the model Epsijk_SM
2818+
2819+# Authors: N. Christensen, C. Duhr
2820+# Model version: 1.1
2821+# Checking the Lagrangians
2822+ * All Lagrangians are ok.
2823+#
2824+# Particle definitions
2825+#
2826+
2827+ * No particles removed. All particles correspond to GenInt setup.
2828+
2829+# Automatically assigned PDG numbers
2830+ * Assigned PDG number 9000001 to particle ghA
2831+ * Assigned PDG number 9000002 to particle ghZ
2832+ * Assigned PDG number 9000003 to particle ghWp
2833+ * Assigned PDG number 9000004 to particle ghWm
2834+ * Assigned PDG number 9000005 to particle ghG
2835+ * Assigned PDG number 9000006 to particle trip
2836+
2837+
2838+# Compulsory PDG codes:
2839+ * Class SM leptons complete.
2840+ * Class SM neutrinos complete.
2841+ * Class SM quarks complete.
2842+ * Class SM gauge bosons complete.
2843+#
2844+# Parameter definitions
2845+#
2846+
2847+ * All parameters are ok.
2848+
2849+
2850+# Vertices
2851+ * Calling FeynmanRules for 1 Lagrangians.
2852+ * Number of classes vertices: 34
2853+ * Number of flavored vertices: 60
2854+ * Saved vertices in InterfaceRun[ 1 ].
2855+ * Checked QNumber conservation.
2856+ * particles.py written.
2857+ * parameters.py written.
2858+#
2859+# Vertex definitions
2860+#
2861+
2862+ * 60 vertices written.
2863+ * vertices.py written.
2864+#
2865+# Lorentz structure definitions
2866+#
2867+
2868+ * 17 lorentz structures written.
2869+ * lorentz.py written.
2870+#
2871+# Coupling definitions
2872+#
2873+
2874+ * 29 couplings written.
2875+ * couplings.py written.
2876
2877=== added file 'models/triplet_diquarks/__init__.py'
2878--- models/triplet_diquarks/__init__.py 1970-01-01 00:00:00 +0000
2879+++ models/triplet_diquarks/__init__.py 2010-12-15 07:31:31 +0000
2880@@ -0,0 +1,15 @@
2881+
2882+import particles
2883+import couplings
2884+import lorentz
2885+import parameters
2886+import vertices
2887+import write_param_card
2888+
2889+
2890+all_particles = particles.all_particles
2891+all_vertices = vertices.all_vertices
2892+all_couplings = couplings.all_couplings
2893+all_lorentz = lorentz.all_lorentz
2894+all_parameters = parameters.all_parameters
2895+all_functions = function_library.all_functions
2896
2897=== added file 'models/triplet_diquarks/couplings.py'
2898--- models/triplet_diquarks/couplings.py 1970-01-01 00:00:00 +0000
2899+++ models/triplet_diquarks/couplings.py 2010-12-15 07:31:31 +0000
2900@@ -0,0 +1,127 @@
2901+# This file was automatically created by FeynRules $Revision: 347 $
2902+# Mathematica version: 7.0 for Mac OS X x86 (64-bit) (November 11, 2008)
2903+# Date: Wed 20 Oct 2010 11:36:34
2904+
2905+
2906+from object_library import all_couplings, Coupling
2907+
2908+from function_library import complexconjugate, re, im, csc, sec, acsc, asec
2909+
2910+
2911+
2912+GC_1 = Coupling(name = 'GC_1',
2913+ value = '-(ee*complex(0,1))/3.',
2914+ order = {'QED':1})
2915+
2916+GC_2 = Coupling(name = 'GC_2',
2917+ value = '(2*ee*complex(0,1))/3.',
2918+ order = {'QED':1})
2919+
2920+GC_3 = Coupling(name = 'GC_3',
2921+ value = '-(ee*complex(0,1))',
2922+ order = {'QED':1})
2923+
2924+GC_4 = Coupling(name = 'GC_4',
2925+ value = '-G',
2926+ order = {'QCD':1})
2927+
2928+GC_5 = Coupling(name = 'GC_5',
2929+ value = '-(complex(0,1)*G)',
2930+ order = {'QCD':1})
2931+
2932+GC_6 = Coupling(name = 'GC_6',
2933+ value = 'complex(0,1)*G',
2934+ order = {'QCD':1})
2935+
2936+GC_7 = Coupling(name = 'GC_7',
2937+ value = 'complex(0,1)*G**2',
2938+ order = {'QCD':2})
2939+
2940+GC_8 = Coupling(name = 'GC_8',
2941+ value = 'cw*complex(0,1)*gw',
2942+ order = {'QED':1})
2943+
2944+GC_9 = Coupling(name = 'GC_9',
2945+ value = '-(complex(0,1)*gw**2)',
2946+ order = {'QED':2})
2947+
2948+GC_10 = Coupling(name = 'GC_10',
2949+ value = 'cw**2*complex(0,1)*gw**2',
2950+ order = {'QED':2})
2951+
2952+GC_11 = Coupling(name = 'GC_11',
2953+ value = '-6*complex(0,1)*lam',
2954+ order = {'QED':2})
2955+
2956+GC_12 = Coupling(name = 'GC_12',
2957+ value = 'complex(0,1)*1/cmath.sqrt(2)*qqtrip',
2958+ order = {'QED':1})
2959+
2960+GC_13 = Coupling(name = 'GC_13',
2961+ value = '(ee**2*complex(0,1))/(2.*sw**2)',
2962+ order = {'QED':2})
2963+
2964+GC_14 = Coupling(name = 'GC_14',
2965+ value = '(ee*complex(0,1))/(sw*cmath.sqrt(2))',
2966+ order = {'QED':1})
2967+
2968+GC_15 = Coupling(name = 'GC_15',
2969+ value = '-(cw*ee*complex(0,1))/(2.*sw)',
2970+ order = {'QED':1})
2971+
2972+GC_16 = Coupling(name = 'GC_16',
2973+ value = '(cw*ee*complex(0,1))/(2.*sw)',
2974+ order = {'QED':1})
2975+
2976+GC_17 = Coupling(name = 'GC_17',
2977+ value = '-(ee*complex(0,1)*sw)/(6.*cw)',
2978+ order = {'QED':1})
2979+
2980+GC_18 = Coupling(name = 'GC_18',
2981+ value = '(ee*complex(0,1)*sw)/(2.*cw)',
2982+ order = {'QED':1})
2983+
2984+GC_19 = Coupling(name = 'GC_19',
2985+ value = 'complex(0,1)*gw*sw',
2986+ order = {'QED':1})
2987+
2988+GC_20 = Coupling(name = 'GC_20',
2989+ value = '-2*cw*complex(0,1)*gw**2*sw',
2990+ order = {'QED':2})
2991+
2992+GC_21 = Coupling(name = 'GC_21',
2993+ value = 'complex(0,1)*gw**2*sw**2',
2994+ order = {'QED':2})
2995+
2996+GC_22 = Coupling(name = 'GC_22',
2997+ value = '(cw*ee*complex(0,1))/(2.*sw) + (ee*complex(0,1)*sw)/(2.*cw)',
2998+ order = {'QED':1})
2999+
3000+GC_23 = Coupling(name = 'GC_23',
3001+ value = 'ee**2*complex(0,1) + (cw**2*ee**2*complex(0,1))/(2.*sw**2) + (ee**2*complex(0,1)*sw**2)/(2.*cw**2)',
3002+ order = {'QED':2})
3003+
3004+GC_24 = Coupling(name = 'GC_24',
3005+ value = '-6*complex(0,1)*lam*v',
3006+ order = {'QED':1})
3007+
3008+GC_25 = Coupling(name = 'GC_25',
3009+ value = '(ee**2*complex(0,1)*v)/(2.*sw**2)',
3010+ order = {'QED':1})
3011+
3012+GC_26 = Coupling(name = 'GC_26',
3013+ value = 'ee**2*complex(0,1)*v + (cw**2*ee**2*complex(0,1)*v)/(2.*sw**2) + (ee**2*complex(0,1)*sw**2*v)/(2.*cw**2)',
3014+ order = {'QED':1})
3015+
3016+GC_27 = Coupling(name = 'GC_27',
3017+ value = '-((complex(0,1)*yb)/cmath.sqrt(2))',
3018+ order = {'QED':1})
3019+
3020+GC_28 = Coupling(name = 'GC_28',
3021+ value = '-((complex(0,1)*yt)/cmath.sqrt(2))',
3022+ order = {'QED':1})
3023+
3024+GC_29 = Coupling(name = 'GC_29',
3025+ value = '-((complex(0,1)*ytau)/cmath.sqrt(2))',
3026+ order = {'QED':1})
3027+
3028
3029=== added file 'models/triplet_diquarks/function_library.py'
3030--- models/triplet_diquarks/function_library.py 1970-01-01 00:00:00 +0000
3031+++ models/triplet_diquarks/function_library.py 2010-12-15 07:31:31 +0000
3032@@ -0,0 +1,54 @@
3033+# This file is part of the UFO.
3034+#
3035+# This file contains definitions for functions that
3036+# are extensions of the cmath library, and correspond
3037+# either to functions that are in cmath, but inconvenient
3038+# to access from there (e.g. z.conjugate()),
3039+# or functions that are simply not defined.
3040+#
3041+#
3042+
3043+__date__ = "22 July 2010"
3044+__author__ = "claude.duhr@durham.ac.uk"
3045+
3046+import cmath
3047+from object_library import all_functions, Function
3048+
3049+#
3050+# shortcuts for functions from cmath
3051+#
3052+
3053+complexconjugate = Function(name = 'complexconjugate',
3054+ arguments = ('z',),
3055+ expression = 'z.conjugate()')
3056+
3057+
3058+re = Function(name = 're',
3059+ arguments = ('z',),
3060+ expression = 'z.real')
3061+
3062+im = Function(name = 'im',
3063+ arguments = ('z',),
3064+ expression = 'z.imag')
3065+
3066+# New functions (trigonometric)
3067+
3068+sec = Function(name = 'sec',
3069+ arguments = ('z',),
3070+ expression = '1./cmath.cos(z)')
3071+
3072+asec = Function(name = 'asec',
3073+ arguments = ('z',),
3074+ expression = 'cmath.acos(1./z)')
3075+
3076+csc = Function(name = 'csc',
3077+ arguments = ('z',),
3078+ expression = '1./cmath.sin(z)')
3079+
3080+acsc = Function(name = 'acsc',
3081+ arguments = ('z',),
3082+ expression = 'cmath.asin(1./z)')
3083+
3084+
3085+
3086+
3087
3088=== added file 'models/triplet_diquarks/lorentz.py'
3089--- models/triplet_diquarks/lorentz.py 1970-01-01 00:00:00 +0000
3090+++ models/triplet_diquarks/lorentz.py 2010-12-15 07:31:31 +0000
3091@@ -0,0 +1,79 @@
3092+# This file was automatically created by FeynRules $Revision: 347 $
3093+# Mathematica version: 7.0 for Mac OS X x86 (64-bit) (November 11, 2008)
3094+# Date: Wed 20 Oct 2010 11:36:34
3095+
3096+
3097+from object_library import all_lorentz, Lorentz
3098+
3099+from function_library import complexconjugate, re, im, csc, sec, acsc, asec
3100+
3101+
3102+
3103+SSS1 = Lorentz(name = 'SSS1',
3104+ spins = [ 1, 1, 1 ],
3105+ structure = '1')
3106+
3107+FFS1 = Lorentz(name = 'FFS1',
3108+ spins = [ 2, 2, 1 ],
3109+ structure = 'Identity(1,2)')
3110+
3111+FFV1 = Lorentz(name = 'FFV1',
3112+ spins = [ 2, 2, 3 ],
3113+ structure = 'Gamma(3,2,1)')
3114+
3115+FFV2 = Lorentz(name = 'FFV2',
3116+ spins = [ 2, 2, 3 ],
3117+ structure = 'Gamma(3,2,-1)*ProjM(-1,1)')
3118+
3119+FFV3 = Lorentz(name = 'FFV3',
3120+ spins = [ 2, 2, 3 ],
3121+ structure = 'Gamma(3,2,-1)*ProjM(-1,1) - 2*Gamma(3,2,-1)*ProjP(-1,1)')
3122+
3123+FFV4 = Lorentz(name = 'FFV4',
3124+ spins = [ 2, 2, 3 ],
3125+ structure = 'Gamma(3,2,-1)*ProjM(-1,1) + 2*Gamma(3,2,-1)*ProjP(-1,1)')
3126+
3127+FFV5 = Lorentz(name = 'FFV5',
3128+ spins = [ 2, 2, 3 ],
3129+ structure = 'Gamma(3,2,-1)*ProjM(-1,1) + 4*Gamma(3,2,-1)*ProjP(-1,1)')
3130+
3131+VSS1 = Lorentz(name = 'VSS1',
3132+ spins = [ 3, 1, 1 ],
3133+ structure = 'P(1,2) - P(1,3)')
3134+
3135+VVS1 = Lorentz(name = 'VVS1',
3136+ spins = [ 3, 3, 1 ],
3137+ structure = 'Metric(1,2)')
3138+
3139+VVV1 = Lorentz(name = 'VVV1',
3140+ spins = [ 3, 3, 3 ],
3141+ structure = 'P(3,1)*Metric(1,2) - P(3,2)*Metric(1,2) - P(2,1)*Metric(1,3) + P(2,3)*Metric(1,3) + P(1,2)*Metric(2,3) - P(1,3)*Metric(2,3)')
3142+
3143+SSSS1 = Lorentz(name = 'SSSS1',
3144+ spins = [ 1, 1, 1, 1 ],
3145+ structure = '1')
3146+
3147+VVSS1 = Lorentz(name = 'VVSS1',
3148+ spins = [ 3, 3, 1, 1 ],
3149+ structure = 'Metric(1,2)')
3150+
3151+VVVV1 = Lorentz(name = 'VVVV1',
3152+ spins = [ 3, 3, 3, 3 ],
3153+ structure = 'Metric(1,4)*Metric(2,3) - Metric(1,3)*Metric(2,4)')
3154+
3155+VVVV2 = Lorentz(name = 'VVVV2',
3156+ spins = [ 3, 3, 3, 3 ],
3157+ structure = 'Metric(1,4)*Metric(2,3) + Metric(1,3)*Metric(2,4) - 2*Metric(1,2)*Metric(3,4)')
3158+
3159+VVVV3 = Lorentz(name = 'VVVV3',
3160+ spins = [ 3, 3, 3, 3 ],
3161+ structure = 'Metric(1,4)*Metric(2,3) - Metric(1,2)*Metric(3,4)')
3162+
3163+VVVV4 = Lorentz(name = 'VVVV4',
3164+ spins = [ 3, 3, 3, 3 ],
3165+ structure = 'Metric(1,3)*Metric(2,4) - Metric(1,2)*Metric(3,4)')
3166+
3167+VVVV5 = Lorentz(name = 'VVVV5',
3168+ spins = [ 3, 3, 3, 3 ],
3169+ structure = 'Metric(1,4)*Metric(2,3) - (Metric(1,3)*Metric(2,4))/2. - (Metric(1,2)*Metric(3,4))/2.')
3170+
3171
3172=== added file 'models/triplet_diquarks/object_library.py'
3173--- models/triplet_diquarks/object_library.py 1970-01-01 00:00:00 +0000
3174+++ models/triplet_diquarks/object_library.py 2010-12-15 07:31:31 +0000
3175@@ -0,0 +1,194 @@
3176+##
3177+##
3178+## Feynrules Header
3179+##
3180+##
3181+##
3182+##
3183+##
3184+
3185+import cmath
3186+
3187+
3188+class FRBaseClass(object):
3189+ """The class from which all FeynRules classes are derived."""
3190+
3191+ require_args = []
3192+
3193+ def __init__(self, *args, **options):
3194+ assert(len(self.require_args) == len (args))
3195+
3196+ for i, name in enumerate(self.require_args):
3197+ setattr(self, name, args[i])
3198+
3199+ for (option, value) in options.items():
3200+ setattr(self, option, value)
3201+
3202+ def get(self, name):
3203+ return getattr(self, name)
3204+
3205+ def set(self, name, value):
3206+ setattr(self, name, value)
3207+
3208+ def get_all(self):
3209+ """Return a dictionary containing all the information of the object"""
3210+ return self.__dict__
3211+
3212+ def __str__(self):
3213+ return self.name
3214+
3215+ def nice_string(self):
3216+ """ return string with the full information """
3217+ return '\n'.join(['%s \t: %s' %(name, value) for name, value in self.__dict__.items()])
3218+
3219+ def __repr__(self):
3220+ replacements = [
3221+ ('+','__plus__'),
3222+ ('-','__minus__'),
3223+ ('@','__at__'),
3224+ ('!','__exclam__'),
3225+ ('?','__quest__'),
3226+ ('*','__star__'),
3227+ ('~','__tilde__')
3228+ ]
3229+ text = self.name
3230+ for orig,sub in replacements:
3231+ text = text.replace(orig,sub)
3232+ return text
3233+
3234+
3235+
3236+all_particles = []
3237+
3238+
3239+
3240+class Particle(FRBaseClass):
3241+ """A standard Particle"""
3242+
3243+ require_args=['pdg_code', 'name', 'antiname', 'spin', 'color', 'mass', 'width', 'texname', 'antitexname', 'line', 'charge']
3244+
3245+ require_args_all = ['pdg_code', 'name', 'antiname', 'spin', 'color', 'mass', 'width', 'texname', 'antitexname', 'line', 'charge', 'propagating', 'goldstoneboson']
3246+
3247+ def __init__(self, pdg_code, name, antiname, spin, color, mass, width, texname,
3248+ antitexname, line, charge , propagating=True, goldstoneboson=False, **options):
3249+
3250+ args= (pdg_code, name, antiname, spin, color, mass, width, texname,
3251+ antitexname, line, float(charge))
3252+
3253+ FRBaseClass.__init__(self, *args, **options)
3254+
3255+ global all_particles
3256+ all_particles.append(self)
3257+
3258+ self.propagating = propagating
3259+ self.goldstoneboson= goldstoneboson
3260+
3261+ self.selfconjugate = (name == antiname)
3262+
3263+ def anti(self):
3264+ if self.selfconjugate:
3265+ raise Exception('%s has no anti particle.' % self.name)
3266+ outdic = {}
3267+ for k,v in self.__dict__.iteritems():
3268+ if k not in self.require_args_all:
3269+ outdic[k] = -v
3270+ if self.color in [1,8]:
3271+ newcolor = self.color
3272+ else:
3273+ newcolor = -self.color
3274+
3275+ return Particle(-self.pdg_code, self.antiname, self.name, self.spin, newcolor, self.mass, self.width,
3276+ self.antitexname, self.texname, self.line, -self.charge, self.propagating, self.goldstoneboson, **outdic)
3277+
3278+
3279+
3280+all_parameters = []
3281+
3282+class Parameter(FRBaseClass):
3283+
3284+ require_args=['name', 'nature', 'type', 'value', 'texname']
3285+
3286+ def __init__(self, name, nature, type, value, texname, lhablock=None, lhacode=None):
3287+
3288+ args = (name,nature,type,value,texname)
3289+
3290+ FRBaseClass.__init__(self, *args)
3291+
3292+ args=(name,nature,type,value,texname)
3293+
3294+ global all_parameters
3295+ all_parameters.append(self)
3296+
3297+ if (lhablock is None or lhacode is None) and nature == 'external':
3298+ raise Exception('Need LHA information for external parameter "%s".' % name)
3299+ self.lhablock = lhablock
3300+ self.lhacode = lhacode
3301+
3302+all_vertices = []
3303+
3304+class Vertex(FRBaseClass):
3305+
3306+ require_args=['name', 'particles', 'color', 'lorentz', 'couplings']
3307+
3308+ def __init__(self, name, particles, color, lorentz, couplings, **opt):
3309+
3310+ args = (name, particles, color, lorentz, couplings)
3311+
3312+ FRBaseClass.__init__(self, *args, **opt)
3313+
3314+ args=(particles,color,lorentz,couplings)
3315+
3316+ global all_vertices
3317+ all_vertices.append(self)
3318+
3319+all_couplings = []
3320+
3321+class Coupling(FRBaseClass):
3322+
3323+ require_args=['name', 'value', 'order']
3324+
3325+ def __init__(self, name, value, order, **opt):
3326+
3327+ args =(name, value, order)
3328+ FRBaseClass.__init__(self, *args, **opt)
3329+ global all_couplings
3330+ all_couplings.append(self)
3331+
3332+
3333+
3334+all_lorentz = []
3335+
3336+class Lorentz(FRBaseClass):
3337+
3338+ require_args=['name','spins','structure']
3339+
3340+ def __init__(self, name, spins, structure='external', **opt):
3341+ args = (name, spins, structure)
3342+ FRBaseClass.__init__(self, *args, **opt)
3343+
3344+ global all_lorentz
3345+ all_lorentz.append(self)
3346+
3347+
3348+all_functions = []
3349+
3350+class Function(object):
3351+
3352+ def __init__(self, name, arguments, expression):
3353+
3354+ global all_functions
3355+ all_functions.append(self)
3356+
3357+ self.name = name
3358+ self.arguments = arguments
3359+ self.expr = expression
3360+
3361+ def __call__(self, *opt):
3362+
3363+ for i, arg in enumerate(self.arguments):
3364+ exec('%s = %s' % (arg, opt[i] ))
3365+
3366+ return eval(self.expr)
3367+
3368+
3369+
3370
3371=== added file 'models/triplet_diquarks/parameters.py'
3372--- models/triplet_diquarks/parameters.py 1970-01-01 00:00:00 +0000
3373+++ models/triplet_diquarks/parameters.py 2010-12-15 07:31:31 +0000
3374@@ -0,0 +1,245 @@
3375+# This file was automatically created by FeynRules $Revision: 347 $
3376+# Mathematica version: 7.0 for Mac OS X x86 (64-bit) (November 11, 2008)
3377+# Date: Wed 20 Oct 2010 11:36:34
3378+
3379+
3380+
3381+from object_library import all_parameters, Parameter
3382+
3383+
3384+from function_library import complexconjugate, re, im, csc, sec, acsc, asec
3385+
3386+aEWM1 = Parameter(name = 'aEWM1',
3387+ nature = 'external',
3388+ type = 'real',
3389+ value = 132.50698,
3390+ texname = '\\text{aEWM1}',
3391+ lhablock = 'SMINPUTS',
3392+ lhacode = [ 1 ])
3393+
3394+Gf = Parameter(name = 'Gf',
3395+ nature = 'external',
3396+ type = 'real',
3397+ value = 0.0000116639,
3398+ texname = 'G_f',
3399+ lhablock = 'SMINPUTS',
3400+ lhacode = [ 2 ])
3401+
3402+aS = Parameter(name = 'aS',
3403+ nature = 'external',
3404+ type = 'real',
3405+ value = 0.118,
3406+ texname = '\\text{aS}',
3407+ lhablock = 'SMINPUTS',
3408+ lhacode = [ 3 ])
3409+
3410+ymb = Parameter(name = 'ymb',
3411+ nature = 'external',
3412+ type = 'real',
3413+ value = 4.2,
3414+ texname = '\\text{ymb}',
3415+ lhablock = 'YUKAWA',
3416+ lhacode = [ 5 ])
3417+
3418+ymt = Parameter(name = 'ymt',
3419+ nature = 'external',
3420+ type = 'real',
3421+ value = 164.5,
3422+ texname = '\\text{ymt}',
3423+ lhablock = 'YUKAWA',
3424+ lhacode = [ 6 ])
3425+
3426+ymtau = Parameter(name = 'ymtau',
3427+ nature = 'external',
3428+ type = 'real',
3429+ value = 1.777,
3430+ texname = '\\text{ymtau}',
3431+ lhablock = 'YUKAWA',
3432+ lhacode = [ 15 ])
3433+
3434+qqtrip = Parameter(name = 'qqtrip',
3435+ nature = 'external',
3436+ type = 'real',
3437+ value = 0.1,
3438+ texname = '\\text{qqtrip}',
3439+ lhablock = 'FRBlock',
3440+ lhacode = [ 1 ])
3441+
3442+MTA = Parameter(name = 'MTA',
3443+ nature = 'external',
3444+ type = 'real',
3445+ value = 1.777,
3446+ texname = '\\text{MTA}',
3447+ lhablock = 'MASS',
3448+ lhacode = [ 15 ])
3449+
3450+MT = Parameter(name = 'MT',
3451+ nature = 'external',
3452+ type = 'real',
3453+ value = 174.3,
3454+ texname = '\\text{MT}',
3455+ lhablock = 'MASS',
3456+ lhacode = [ 6 ])
3457+
3458+MB = Parameter(name = 'MB',
3459+ nature = 'external',
3460+ type = 'real',
3461+ value = 4.7,
3462+ texname = '\\text{MB}',
3463+ lhablock = 'MASS',
3464+ lhacode = [ 5 ])
3465+
3466+MZ = Parameter(name = 'MZ',
3467+ nature = 'external',
3468+ type = 'real',
3469+ value = 91.188,
3470+ texname = '\\text{MZ}',
3471+ lhablock = 'MASS',
3472+ lhacode = [ 23 ])
3473+
3474+MH = Parameter(name = 'MH',
3475+ nature = 'external',
3476+ type = 'real',
3477+ value = 120.,
3478+ texname = '\\text{MH}',
3479+ lhablock = 'MASS',
3480+ lhacode = [ 25 ])
3481+
3482+MSIX = Parameter(name = 'MSIX',
3483+ nature = 'external',
3484+ type = 'real',
3485+ value = 500,
3486+ texname = '\\text{MSIX}',
3487+ lhablock = 'MASS',
3488+ lhacode = [ 9000006 ])
3489+
3490+WT = Parameter(name = 'WT',
3491+ nature = 'external',
3492+ type = 'real',
3493+ value = 1.50833649,
3494+ texname = '\\text{WT}',
3495+ lhablock = 'DECAY',
3496+ lhacode = [ 6 ])
3497+
3498+WZ = Parameter(name = 'WZ',
3499+ nature = 'external',
3500+ type = 'real',
3501+ value = 2.44140351,
3502+ texname = '\\text{WZ}',
3503+ lhablock = 'DECAY',
3504+ lhacode = [ 23 ])
3505+
3506+WW = Parameter(name = 'WW',
3507+ nature = 'external',
3508+ type = 'real',
3509+ value = 2.04759951,
3510+ texname = '\\text{WW}',
3511+ lhablock = 'DECAY',
3512+ lhacode = [ 24 ])
3513+
3514+WH = Parameter(name = 'WH',
3515+ nature = 'external',
3516+ type = 'real',
3517+ value = 0.00575308848,
3518+ texname = '\\text{WH}',
3519+ lhablock = 'DECAY',
3520+ lhacode = [ 25 ])
3521+
3522+WSIX = Parameter(name = 'WSIX',
3523+ nature = 'external',
3524+ type = 'real',
3525+ value = 3,
3526+ texname = '\\text{WSIX}',
3527+ lhablock = 'DECAY',
3528+ lhacode = [ 9000006 ])
3529+
3530+aEW = Parameter(name = 'aEW',
3531+ nature = 'internal',
3532+ type = 'real',
3533+ value = '1/aEWM1',
3534+ texname = '\\text{aEW}')
3535+
3536+G = Parameter(name = 'G',
3537+ nature = 'internal',
3538+ type = 'real',
3539+ value = '2*cmath.sqrt(aS)*cmath.sqrt(cmath.pi)',
3540+ texname = 'G')
3541+
3542+MW = Parameter(name = 'MW',
3543+ nature = 'internal',
3544+ type = 'real',
3545+ value = 'cmath.sqrt(MZ**2/2. + cmath.sqrt(MZ**4/4. - (aEW*cmath.pi*MZ**2)/(Gf*cmath.sqrt(2))))',
3546+ texname = 'M_W')
3547+
3548+ee = Parameter(name = 'ee',
3549+ nature = 'internal',
3550+ type = 'real',
3551+ value = '2*cmath.sqrt(aEW)*cmath.sqrt(cmath.pi)',
3552+ texname = 'e')
3553+
3554+sw2 = Parameter(name = 'sw2',
3555+ nature = 'internal',
3556+ type = 'real',
3557+ value = '1 - MW**2/MZ**2',
3558+ texname = '\\text{sw2}')
3559+
3560+cw = Parameter(name = 'cw',
3561+ nature = 'internal',
3562+ type = 'real',
3563+ value = 'cmath.sqrt(1 - sw2)',
3564+ texname = 'c_w')
3565+
3566+sw = Parameter(name = 'sw',
3567+ nature = 'internal',
3568+ type = 'real',
3569+ value = 'cmath.sqrt(sw2)',
3570+ texname = 's_w')
3571+
3572+g1 = Parameter(name = 'g1',
3573+ nature = 'internal',
3574+ type = 'real',
3575+ value = 'ee/cw',
3576+ texname = 'g_1')
3577+
3578+gw = Parameter(name = 'gw',
3579+ nature = 'internal',
3580+ type = 'real',
3581+ value = 'ee/sw',
3582+ texname = 'g_w')
3583+
3584+v = Parameter(name = 'v',
3585+ nature = 'internal',
3586+ type = 'real',
3587+ value = '(2*MW*sw)/ee',
3588+ texname = 'v')
3589+
3590+lam = Parameter(name = 'lam',
3591+ nature = 'internal',
3592+ type = 'real',
3593+ value = 'MH**2/(2.*v**2)',
3594+ texname = '\\text{lam}')
3595+
3596+yb = Parameter(name = 'yb',
3597+ nature = 'internal',
3598+ type = 'real',
3599+ value = '(ymb*cmath.sqrt(2))/v',
3600+ texname = '\\text{yb}')
3601+
3602+yt = Parameter(name = 'yt',
3603+ nature = 'internal',
3604+ type = 'real',
3605+ value = '(ymt*cmath.sqrt(2))/v',
3606+ texname = '\\text{yt}')
3607+
3608+ytau = Parameter(name = 'ytau',
3609+ nature = 'internal',
3610+ type = 'real',
3611+ value = '(ymtau*cmath.sqrt(2))/v',
3612+ texname = '\\text{ytau}')
3613+
3614+muH = Parameter(name = 'muH',
3615+ nature = 'internal',
3616+ type = 'real',
3617+ value = 'cmath.sqrt(lam*v**2)',
3618+ texname = '\\mu ')
3619+
3620
3621=== added file 'models/triplet_diquarks/particles.py'
3622--- models/triplet_diquarks/particles.py 1970-01-01 00:00:00 +0000
3623+++ models/triplet_diquarks/particles.py 2010-12-15 07:31:31 +0000
3624@@ -0,0 +1,400 @@
3625+# This file was automatically created by FeynRules $Revision: 347 $
3626+# Mathematica version: 7.0 for Mac OS X x86 (64-bit) (November 11, 2008)
3627+# Date: Wed 20 Oct 2010 11:36:34
3628+
3629+
3630+from __future__ import division
3631+from object_library import all_particles, Particle
3632+
3633+ve = Particle(pdg_code = 12,
3634+ name = 've',
3635+ antiname = 've~',
3636+ spin = 2,
3637+ color = 1,
3638+ mass = 'ZERO',
3639+ width = 'ZERO',
3640+ texname = 've',
3641+ antitexname = 've',
3642+ line = 'straight',
3643+ charge = 0,
3644+ LeptonNumber = 1,
3645+ GhostNumber = 0)
3646+
3647+ve__tilde__ = ve.anti()
3648+
3649+vm = Particle(pdg_code = 14,
3650+ name = 'vm',
3651+ antiname = 'vm~',
3652+ spin = 2,
3653+ color = 1,
3654+ mass = 'ZERO',
3655+ width = 'ZERO',
3656+ texname = 'vm',
3657+ antitexname = 'vm',
3658+ line = 'straight',
3659+ charge = 0,
3660+ LeptonNumber = 1,
3661+ GhostNumber = 0)
3662+
3663+vm__tilde__ = vm.anti()
3664+
3665+vt = Particle(pdg_code = 16,
3666+ name = 'vt',
3667+ antiname = 'vt~',
3668+ spin = 2,
3669+ color = 1,
3670+ mass = 'ZERO',
3671+ width = 'ZERO',
3672+ texname = 'vt',
3673+ antitexname = 'vt',
3674+ line = 'straight',
3675+ charge = 0,
3676+ LeptonNumber = 1,
3677+ GhostNumber = 0)
3678+
3679+vt__tilde__ = vt.anti()
3680+
3681+e__minus__ = Particle(pdg_code = 11,
3682+ name = 'e-',
3683+ antiname = 'e+',
3684+ spin = 2,
3685+ color = 1,
3686+ mass = 'ZERO',
3687+ width = 'ZERO',
3688+ texname = 'e-',
3689+ antitexname = 'e-',
3690+ line = 'straight',
3691+ charge = -1,
3692+ LeptonNumber = 1,
3693+ GhostNumber = 0)
3694+
3695+e__plus__ = e__minus__.anti()
3696+
3697+m__minus__ = Particle(pdg_code = 13,
3698+ name = 'm-',
3699+ antiname = 'm+',
3700+ spin = 2,
3701+ color = 1,
3702+ mass = 'ZERO',
3703+ width = 'ZERO',
3704+ texname = 'm-',
3705+ antitexname = 'm-',
3706+ line = 'straight',
3707+ charge = -1,
3708+ LeptonNumber = 1,
3709+ GhostNumber = 0)
3710+
3711+m__plus__ = m__minus__.anti()
3712+
3713+tt__minus__ = Particle(pdg_code = 15,
3714+ name = 'tt-',
3715+ antiname = 'tt+',
3716+ spin = 2,
3717+ color = 1,
3718+ mass = 'MTA',
3719+ width = 'ZERO',
3720+ texname = 'tt-',
3721+ antitexname = 'tt-',
3722+ line = 'straight',
3723+ charge = -1,
3724+ LeptonNumber = 1,
3725+ GhostNumber = 0)
3726+
3727+tt__plus__ = tt__minus__.anti()
3728+
3729+u = Particle(pdg_code = 2,
3730+ name = 'u',
3731+ antiname = 'u~',
3732+ spin = 2,
3733+ color = 3,
3734+ mass = 'ZERO',
3735+ width = 'ZERO',
3736+ texname = 'u',
3737+ antitexname = 'u',
3738+ line = 'straight',
3739+ charge = 2/3,
3740+ LeptonNumber = 0,
3741+ GhostNumber = 0)
3742+
3743+u__tilde__ = u.anti()
3744+
3745+c = Particle(pdg_code = 4,
3746+ name = 'c',
3747+ antiname = 'c~',
3748+ spin = 2,
3749+ color = 3,
3750+ mass = 'ZERO',
3751+ width = 'ZERO',
3752+ texname = 'c',
3753+ antitexname = 'c',
3754+ line = 'straight',
3755+ charge = 2/3,
3756+ LeptonNumber = 0,
3757+ GhostNumber = 0)
3758+
3759+c__tilde__ = c.anti()
3760+
3761+t = Particle(pdg_code = 6,
3762+ name = 't',
3763+ antiname = 't~',
3764+ spin = 2,
3765+ color = 3,
3766+ mass = 'MT',
3767+ width = 'WT',
3768+ texname = 't',
3769+ antitexname = 't',
3770+ line = 'straight',
3771+ charge = 2/3,
3772+ LeptonNumber = 0,
3773+ GhostNumber = 0)
3774+
3775+t__tilde__ = t.anti()
3776+
3777+d = Particle(pdg_code = 1,
3778+ name = 'd',
3779+ antiname = 'd~',
3780+ spin = 2,
3781+ color = 3,
3782+ mass = 'ZERO',
3783+ width = 'ZERO',
3784+ texname = 'd',
3785+ antitexname = 'd',
3786+ line = 'straight',
3787+ charge = -1/3,
3788+ LeptonNumber = 0,
3789+ GhostNumber = 0)
3790+
3791+d__tilde__ = d.anti()
3792+
3793+s = Particle(pdg_code = 3,
3794+ name = 's',
3795+ antiname = 's~',
3796+ spin = 2,
3797+ color = 3,
3798+ mass = 'ZERO',
3799+ width = 'ZERO',
3800+ texname = 's',
3801+ antitexname = 's',
3802+ line = 'straight',
3803+ charge = -1/3,
3804+ LeptonNumber = 0,
3805+ GhostNumber = 0)
3806+
3807+s__tilde__ = s.anti()
3808+
3809+b = Particle(pdg_code = 5,
3810+ name = 'b',
3811+ antiname = 'b~',
3812+ spin = 2,
3813+ color = 3,
3814+ mass = 'MB',
3815+ width = 'ZERO',
3816+ texname = 'b',
3817+ antitexname = 'b',
3818+ line = 'straight',
3819+ charge = -1/3,
3820+ LeptonNumber = 0,
3821+ GhostNumber = 0)
3822+
3823+b__tilde__ = b.anti()
3824+
3825+ghA = Particle(pdg_code = 9000001,
3826+ name = 'ghA',
3827+ antiname = 'ghA~',
3828+ spin = -1,
3829+ color = 1,
3830+ mass = 'ZERO',
3831+ width = 'WghA',
3832+ texname = 'ghA',
3833+ antitexname = 'ghA',
3834+ line = 'dotted',
3835+ charge = 0,
3836+ LeptonNumber = 0,
3837+ GhostNumber = 1)
3838+
3839+ghA__tilde__ = ghA.anti()
3840+
3841+ghZ = Particle(pdg_code = 9000002,
3842+ name = 'ghZ',
3843+ antiname = 'ghZ~',
3844+ spin = -1,
3845+ color = 1,
3846+ mass = 'MZ',
3847+ width = 'WghZ',
3848+ texname = 'ghZ',
3849+ antitexname = 'ghZ',
3850+ line = 'dotted',
3851+ charge = 0,
3852+ LeptonNumber = 0,
3853+ GhostNumber = 1)
3854+
3855+ghZ__tilde__ = ghZ.anti()
3856+
3857+ghWp = Particle(pdg_code = 9000003,
3858+ name = 'ghWp',
3859+ antiname = 'ghWp~',
3860+ spin = -1,
3861+ color = 1,
3862+ mass = 'MW',
3863+ width = 'WghWp',
3864+ texname = 'ghWp',
3865+ antitexname = 'ghWp',
3866+ line = 'dotted',
3867+ charge = 1,
3868+ LeptonNumber = 0,
3869+ GhostNumber = 1)
3870+
3871+ghWp__tilde__ = ghWp.anti()
3872+
3873+ghWm = Particle(pdg_code = 9000004,
3874+ name = 'ghWm',
3875+ antiname = 'ghWm~',
3876+ spin = -1,
3877+ color = 1,
3878+ mass = 'MW',
3879+ width = 'WghWm',
3880+ texname = 'ghWm',
3881+ antitexname = 'ghWm',
3882+ line = 'dotted',
3883+ charge = -1,
3884+ LeptonNumber = 0,
3885+ GhostNumber = 1)
3886+
3887+ghWm__tilde__ = ghWm.anti()
3888+
3889+ghG = Particle(pdg_code = 9000005,
3890+ name = 'ghG',
3891+ antiname = 'ghG~',
3892+ spin = -1,
3893+ color = 8,
3894+ mass = 'ZERO',
3895+ width = 'WghG',
3896+ texname = 'ghG',
3897+ antitexname = 'ghG',
3898+ line = 'dotted',
3899+ charge = 0,
3900+ LeptonNumber = 0,
3901+ GhostNumber = 1)
3902+
3903+ghG__tilde__ = ghG.anti()
3904+
3905+A = Particle(pdg_code = 22,
3906+ name = 'A',
3907+ antiname = 'A',
3908+ spin = 3,
3909+ color = 1,
3910+ mass = 'ZERO',
3911+ width = 'ZERO',
3912+ texname = 'A',
3913+ antitexname = 'A',
3914+ line = 'wavy',
3915+ charge = 0,
3916+ LeptonNumber = 0,
3917+ GhostNumber = 0)
3918+
3919+Z = Particle(pdg_code = 23,
3920+ name = 'Z',
3921+ antiname = 'Z',
3922+ spin = 3,
3923+ color = 1,
3924+ mass = 'MZ',
3925+ width = 'WZ',
3926+ texname = 'Z',
3927+ antitexname = 'Z',
3928+ line = 'wavy',
3929+ charge = 0,
3930+ LeptonNumber = 0,
3931+ GhostNumber = 0)
3932+
3933+W__plus__ = Particle(pdg_code = 24,
3934+ name = 'W+',
3935+ antiname = 'W-',
3936+ spin = 3,
3937+ color = 1,
3938+ mass = 'MW',
3939+ width = 'WW',
3940+ texname = 'W+',
3941+ antitexname = 'W+',
3942+ line = 'wavy',
3943+ charge = 1,
3944+ LeptonNumber = 0,
3945+ GhostNumber = 0)
3946+
3947+W__minus__ = W__plus__.anti()
3948+
3949+G = Particle(pdg_code = 21,
3950+ name = 'G',
3951+ antiname = 'G',
3952+ spin = 3,
3953+ color = 8,
3954+ mass = 'ZERO',
3955+ width = 'ZERO',
3956+ texname = 'G',
3957+ antitexname = 'G',
3958+ line = 'curly',
3959+ charge = 0,
3960+ LeptonNumber = 0,
3961+ GhostNumber = 0)
3962+
3963+H = Particle(pdg_code = 25,
3964+ name = 'H',
3965+ antiname = 'H',
3966+ spin = 1,
3967+ color = 1,
3968+ mass = 'MH',
3969+ width = 'WH',
3970+ texname = '\\phi',
3971+ antitexname = '\\phi',
3972+ line = 'dashed',
3973+ charge = 0,
3974+ LeptonNumber = 0,
3975+ GhostNumber = 0)
3976+
3977+phi0 = Particle(pdg_code = 250,
3978+ name = 'phi0',
3979+ antiname = 'phi0',
3980+ spin = 1,
3981+ color = 1,
3982+ mass = 'MZ',
3983+ width = 'Wphi',
3984+ texname = 'phi0',
3985+ antitexname = 'phi0',
3986+ line = 'dashed',
3987+ GoldstoneBoson = True,
3988+ charge = 0,
3989+ LeptonNumber = 0,
3990+ GhostNumber = 0)
3991+
3992+phi__plus__ = Particle(pdg_code = 251,
3993+ name = 'phi+',
3994+ antiname = 'phi-',
3995+ spin = 1,
3996+ color = 1,
3997+ mass = 'MW',
3998+ width = 'Wphi2',
3999+ texname = '\\phi^+',
4000+ antitexname = '\\phi^+',
4001+ line = 'dashed',
4002+ GoldstoneBoson = True,
4003+ charge = 1,
4004+ LeptonNumber = 0,
4005+ GhostNumber = 0)
4006+
4007+phi__minus__ = phi__plus__.anti()
4008+
4009+trip = Particle(pdg_code = 9000006,
4010+ name = 'trip',
4011+ antiname = 'trip~',
4012+ spin = 1,
4013+ color = 3,
4014+ mass = 'MSIX',
4015+ width = 'WSIX',
4016+ texname = 'trip',
4017+ antitexname = 'trip',
4018+ line = 'dashed',
4019+ charge = -4/3,
4020+ LeptonNumber = 0,
4021+ GhostNumber = 0)
4022+
4023+trip__tilde__ = trip.anti()
4024+
4025
4026=== added file 'models/triplet_diquarks/vertices.py'
4027--- models/triplet_diquarks/vertices.py 1970-01-01 00:00:00 +0000
4028+++ models/triplet_diquarks/vertices.py 2010-12-15 07:31:31 +0000
4029@@ -0,0 +1,371 @@
4030+# This file was automatically created by FeynRules $Revision: 347 $
4031+# Mathematica version: 7.0 for Mac OS X x86 (64-bit) (November 11, 2008)
4032+# Date: Wed 20 Oct 2010 11:36:34
4033+
4034+
4035+from object_library import all_vertices, Vertex
4036+import particles as P
4037+import couplings as C
4038+import lorentz as L
4039+
4040+
4041+V_1 = Vertex(name = 'V_1',
4042+ particles = [ P.H, P.H, P.H, P.H ],
4043+ color = [ '1' ],
4044+ lorentz = [ L.SSSS1 ],
4045+ couplings = {(0,0):C.GC_11})
4046+
4047+V_2 = Vertex(name = 'V_2',
4048+ particles = [ P.H, P.H, P.H ],
4049+ color = [ '1' ],
4050+ lorentz = [ L.SSS1 ],
4051+ couplings = {(0,0):C.GC_24})
4052+
4053+V_3 = Vertex(name = 'V_3',
4054+ particles = [ P.G, P.G, P.G ],
4055+ color = [ 'f(1,2,3)' ],
4056+ lorentz = [ L.VVV1 ],
4057+ couplings = {(0,0):C.GC_4})
4058+
4059+V_4 = Vertex(name = 'V_4',
4060+ particles = [ P.G, P.G, P.G, P.G ],
4061+ color = [ 'f(-1,1,2)*f(3,4,-1)', 'f(-1,1,3)*f(2,4,-1)', 'f(-1,1,4)*f(2,3,-1)' ],
4062+ lorentz = [ L.VVVV1, L.VVVV3, L.VVVV4 ],
4063+ couplings = {(1,1):C.GC_7,(0,0):C.GC_7,(2,2):C.GC_7})
4064+
4065+V_5 = Vertex(name = 'V_5',
4066+ particles = [ P.G, P.trip__tilde__, P.trip ],
4067+ color = [ 'T(1,3,2)' ],
4068+ lorentz = [ L.VSS1 ],
4069+ couplings = {(0,0):C.GC_5})
4070+
4071+V_6 = Vertex(name = 'V_6',
4072+ particles = [ P.u__tilde__, P.t__tilde__, P.trip__tilde__ ],
4073+ color = [ 'EpsilonBar(1,2,3)' ],
4074+ lorentz = [ L.FFS1 ],
4075+ couplings = {(0,0):C.GC_12})
4076+
4077+V_7 = Vertex(name = 'V_7',
4078+ particles = [ P.G, P.G, P.trip__tilde__, P.trip ],
4079+ color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ],
4080+ lorentz = [ L.VVSS1 ],
4081+ couplings = {(0,0):C.GC_7,(1,0):C.GC_7})
4082+
4083+V_8 = Vertex(name = 'V_8',
4084+ particles = [ P.u, P.t, P.trip ],
4085+ color = [ 'Epsilon(1,2,3)' ],
4086+ lorentz = [ L.FFS1 ],
4087+ couplings = {(0,0):C.GC_12})
4088+
4089+V_9 = Vertex(name = 'V_9',
4090+ particles = [ P.A, P.W__minus__, P.W__plus__ ],
4091+ color = [ '1' ],
4092+ lorentz = [ L.VVV1 ],
4093+ couplings = {(0,0):C.GC_19})
4094+
4095+V_10 = Vertex(name = 'V_10',
4096+ particles = [ P.W__minus__, P.W__plus__, P.H, P.H ],
4097+ color = [ '1' ],
4098+ lorentz = [ L.VVSS1 ],
4099+ couplings = {(0,0):C.GC_13})
4100+
4101+V_11 = Vertex(name = 'V_11',
4102+ particles = [ P.W__minus__, P.W__plus__, P.H ],
4103+ color = [ '1' ],
4104+ lorentz = [ L.VVS1 ],
4105+ couplings = {(0,0):C.GC_25})
4106+
4107+V_12 = Vertex(name = 'V_12',
4108+ particles = [ P.A, P.A, P.W__minus__, P.W__plus__ ],
4109+ color = [ '1' ],
4110+ lorentz = [ L.VVVV2 ],
4111+ couplings = {(0,0):C.GC_21})
4112+
4113+V_13 = Vertex(name = 'V_13',
4114+ particles = [ P.W__minus__, P.W__plus__, P.Z ],
4115+ color = [ '1' ],
4116+ lorentz = [ L.VVV1 ],
4117+ couplings = {(0,0):C.GC_8})
4118+
4119+V_14 = Vertex(name = 'V_14',
4120+ particles = [ P.W__minus__, P.W__minus__, P.W__plus__, P.W__plus__ ],
4121+ color = [ '1' ],
4122+ lorentz = [ L.VVVV2 ],
4123+ couplings = {(0,0):C.GC_9})
4124+
4125+V_15 = Vertex(name = 'V_15',
4126+ particles = [ P.A, P.W__minus__, P.W__plus__, P.Z ],
4127+ color = [ '1' ],
4128+ lorentz = [ L.VVVV5 ],
4129+ couplings = {(0,0):C.GC_20})
4130+
4131+V_16 = Vertex(name = 'V_16',
4132+ particles = [ P.Z, P.Z, P.H, P.H ],
4133+ color = [ '1' ],
4134+ lorentz = [ L.VVSS1 ],
4135+ couplings = {(0,0):C.GC_23})
4136+
4137+V_17 = Vertex(name = 'V_17',
4138+ particles = [ P.Z, P.Z, P.H ],
4139+ color = [ '1' ],
4140+ lorentz = [ L.VVS1 ],
4141+ couplings = {(0,0):C.GC_26})
4142+
4143+V_18 = Vertex(name = 'V_18',
4144+ particles = [ P.W__minus__, P.W__plus__, P.Z, P.Z ],
4145+ color = [ '1' ],
4146+ lorentz = [ L.VVVV2 ],
4147+ couplings = {(0,0):C.GC_10})
4148+
4149+V_19 = Vertex(name = 'V_19',
4150+ particles = [ P.d__tilde__, P.d, P.A ],
4151+ color = [ 'Identity(1,2)' ],
4152+ lorentz = [ L.FFV1 ],
4153+ couplings = {(0,0):C.GC_1})
4154+
4155+V_20 = Vertex(name = 'V_20',
4156+ particles = [ P.s__tilde__, P.s, P.A ],
4157+ color = [ 'Identity(1,2)' ],
4158+ lorentz = [ L.FFV1 ],
4159+ couplings = {(0,0):C.GC_1})
4160+
4161+V_21 = Vertex(name = 'V_21',
4162+ particles = [ P.b__tilde__, P.b, P.A ],
4163+ color = [ 'Identity(1,2)' ],
4164+ lorentz = [ L.FFV1 ],
4165+ couplings = {(0,0):C.GC_1})
4166+
4167+V_22 = Vertex(name = 'V_22',
4168+ particles = [ P.e__plus__, P.e__minus__, P.A ],
4169+ color = [ '1' ],
4170+ lorentz = [ L.FFV1 ],
4171+ couplings = {(0,0):C.GC_3})
4172+
4173+V_23 = Vertex(name = 'V_23',
4174+ particles = [ P.m__plus__, P.m__minus__, P.A ],
4175+ color = [ '1' ],
4176+ lorentz = [ L.FFV1 ],
4177+ couplings = {(0,0):C.GC_3})
4178+
4179+V_24 = Vertex(name = 'V_24',
4180+ particles = [ P.tt__plus__, P.tt__minus__, P.A ],
4181+ color = [ '1' ],
4182+ lorentz = [ L.FFV1 ],
4183+ couplings = {(0,0):C.GC_3})
4184+
4185+V_25 = Vertex(name = 'V_25',
4186+ particles = [ P.u__tilde__, P.u, P.A ],
4187+ color = [ 'Identity(1,2)' ],
4188+ lorentz = [ L.FFV1 ],
4189+ couplings = {(0,0):C.GC_2})
4190+
4191+V_26 = Vertex(name = 'V_26',
4192+ particles = [ P.c__tilde__, P.c, P.A ],
4193+ color = [ 'Identity(1,2)' ],
4194+ lorentz = [ L.FFV1 ],
4195+ couplings = {(0,0):C.GC_2})
4196+
4197+V_27 = Vertex(name = 'V_27',
4198+ particles = [ P.t__tilde__, P.t, P.A ],
4199+ color = [ 'Identity(1,2)' ],
4200+ lorentz = [ L.FFV1 ],
4201+ couplings = {(0,0):C.GC_2})
4202+
4203+V_28 = Vertex(name = 'V_28',
4204+ particles = [ P.d__tilde__, P.d, P.G ],
4205+ color = [ 'T(3,2,1)' ],
4206+ lorentz = [ L.FFV1 ],
4207+ couplings = {(0,0):C.GC_6})
4208+
4209+V_29 = Vertex(name = 'V_29',
4210+ particles = [ P.s__tilde__, P.s, P.G ],
4211+ color = [ 'T(3,2,1)' ],
4212+ lorentz = [ L.FFV1 ],
4213+ couplings = {(0,0):C.GC_6})
4214+
4215+V_30 = Vertex(name = 'V_30',
4216+ particles = [ P.b__tilde__, P.b, P.G ],
4217+ color = [ 'T(3,2,1)' ],
4218+ lorentz = [ L.FFV1 ],
4219+ couplings = {(0,0):C.GC_6})
4220+
4221+V_31 = Vertex(name = 'V_31',
4222+ particles = [ P.b__tilde__, P.b, P.H ],
4223+ color = [ 'Identity(1,2)' ],
4224+ lorentz = [ L.FFS1 ],
4225+ couplings = {(0,0):C.GC_27})
4226+
4227+V_32 = Vertex(name = 'V_32',
4228+ particles = [ P.d__tilde__, P.d, P.Z ],
4229+ color = [ 'Identity(1,2)' ],
4230+ lorentz = [ L.FFV2, L.FFV3 ],
4231+ couplings = {(0,0):C.GC_15,(0,1):C.GC_17})
4232+
4233+V_33 = Vertex(name = 'V_33',
4234+ particles = [ P.s__tilde__, P.s, P.Z ],
4235+ color = [ 'Identity(1,2)' ],
4236+ lorentz = [ L.FFV2, L.FFV3 ],
4237+ couplings = {(0,0):C.GC_15,(0,1):C.GC_17})
4238+
4239+V_34 = Vertex(name = 'V_34',
4240+ particles = [ P.b__tilde__, P.b, P.Z ],
4241+ color = [ 'Identity(1,2)' ],
4242+ lorentz = [ L.FFV2, L.FFV3 ],
4243+ couplings = {(0,0):C.GC_15,(0,1):C.GC_17})
4244+
4245+V_35 = Vertex(name = 'V_35',
4246+ particles = [ P.d__tilde__, P.u, P.W__minus__ ],
4247+ color = [ 'Identity(1,2)' ],
4248+ lorentz = [ L.FFV2 ],
4249+ couplings = {(0,0):C.GC_14})
4250+
4251+V_36 = Vertex(name = 'V_36',
4252+ particles = [ P.s__tilde__, P.c, P.W__minus__ ],
4253+ color = [ 'Identity(1,2)' ],
4254+ lorentz = [ L.FFV2 ],
4255+ couplings = {(0,0):C.GC_14})
4256+
4257+V_37 = Vertex(name = 'V_37',
4258+ particles = [ P.b__tilde__, P.t, P.W__minus__ ],
4259+ color = [ 'Identity(1,2)' ],
4260+ lorentz = [ L.FFV2 ],
4261+ couplings = {(0,0):C.GC_14})
4262+
4263+V_38 = Vertex(name = 'V_38',
4264+ particles = [ P.u__tilde__, P.d, P.W__plus__ ],
4265+ color = [ 'Identity(1,2)' ],
4266+ lorentz = [ L.FFV2 ],
4267+ couplings = {(0,0):C.GC_14})
4268+
4269+V_39 = Vertex(name = 'V_39',
4270+ particles = [ P.c__tilde__, P.s, P.W__plus__ ],
4271+ color = [ 'Identity(1,2)' ],
4272+ lorentz = [ L.FFV2 ],
4273+ couplings = {(0,0):C.GC_14})
4274+
4275+V_40 = Vertex(name = 'V_40',
4276+ particles = [ P.t__tilde__, P.b, P.W__plus__ ],
4277+ color = [ 'Identity(1,2)' ],
4278+ lorentz = [ L.FFV2 ],
4279+ couplings = {(0,0):C.GC_14})
4280+
4281+V_41 = Vertex(name = 'V_41',
4282+ particles = [ P.u__tilde__, P.u, P.G ],
4283+ color = [ 'T(3,2,1)' ],
4284+ lorentz = [ L.FFV1 ],
4285+ couplings = {(0,0):C.GC_6})
4286+
4287+V_42 = Vertex(name = 'V_42',
4288+ particles = [ P.c__tilde__, P.c, P.G ],
4289+ color = [ 'T(3,2,1)' ],
4290+ lorentz = [ L.FFV1 ],
4291+ couplings = {(0,0):C.GC_6})
4292+
4293+V_43 = Vertex(name = 'V_43',
4294+ particles = [ P.t__tilde__, P.t, P.G ],
4295+ color = [ 'T(3,2,1)' ],
4296+ lorentz = [ L.FFV1 ],
4297+ couplings = {(0,0):C.GC_6})
4298+
4299+V_44 = Vertex(name = 'V_44',
4300+ particles = [ P.tt__plus__, P.tt__minus__, P.H ],
4301+ color = [ '1' ],
4302+ lorentz = [ L.FFS1 ],
4303+ couplings = {(0,0):C.GC_29})
4304+
4305+V_45 = Vertex(name = 'V_45',
4306+ particles = [ P.t__tilde__, P.t, P.H ],
4307+ color = [ 'Identity(1,2)' ],
4308+ lorentz = [ L.FFS1 ],
4309+ couplings = {(0,0):C.GC_28})
4310+
4311+V_46 = Vertex(name = 'V_46',
4312+ particles = [ P.e__plus__, P.e__minus__, P.Z ],
4313+ color = [ '1' ],
4314+ lorentz = [ L.FFV2, L.FFV4 ],
4315+ couplings = {(0,0):C.GC_15,(0,1):C.GC_18})
4316+
4317+V_47 = Vertex(name = 'V_47',
4318+ particles = [ P.m__plus__, P.m__minus__, P.Z ],
4319+ color = [ '1' ],
4320+ lorentz = [ L.FFV2, L.FFV4 ],
4321+ couplings = {(0,0):C.GC_15,(0,1):C.GC_18})
4322+
4323+V_48 = Vertex(name = 'V_48',
4324+ particles = [ P.tt__plus__, P.tt__minus__, P.Z ],
4325+ color = [ '1' ],
4326+ lorentz = [ L.FFV2, L.FFV4 ],
4327+ couplings = {(0,0):C.GC_15,(0,1):C.GC_18})
4328+
4329+V_49 = Vertex(name = 'V_49',
4330+ particles = [ P.e__plus__, P.ve, P.W__minus__ ],
4331+ color = [ '1' ],
4332+ lorentz = [ L.FFV2 ],
4333+ couplings = {(0,0):C.GC_14})
4334+
4335+V_50 = Vertex(name = 'V_50',
4336+ particles = [ P.m__plus__, P.vm, P.W__minus__ ],
4337+ color = [ '1' ],
4338+ lorentz = [ L.FFV2 ],
4339+ couplings = {(0,0):C.GC_14})
4340+
4341+V_51 = Vertex(name = 'V_51',
4342+ particles = [ P.tt__plus__, P.vt, P.W__minus__ ],
4343+ color = [ '1' ],
4344+ lorentz = [ L.FFV2 ],
4345+ couplings = {(0,0):C.GC_14})
4346+
4347+V_52 = Vertex(name = 'V_52',
4348+ particles = [ P.ve__tilde__, P.e__minus__, P.W__plus__ ],
4349+ color = [ '1' ],
4350+ lorentz = [ L.FFV2 ],
4351+ couplings = {(0,0):C.GC_14})
4352+
4353+V_53 = Vertex(name = 'V_53',
4354+ particles = [ P.vm__tilde__, P.m__minus__, P.W__plus__ ],
4355+ color = [ '1' ],
4356+ lorentz = [ L.FFV2 ],
4357+ couplings = {(0,0):C.GC_14})
4358+
4359+V_54 = Vertex(name = 'V_54',
4360+ particles = [ P.vt__tilde__, P.tt__minus__, P.W__plus__ ],
4361+ color = [ '1' ],
4362+ lorentz = [ L.FFV2 ],
4363+ couplings = {(0,0):C.GC_14})
4364+
4365+V_55 = Vertex(name = 'V_55',
4366+ particles = [ P.u__tilde__, P.u, P.Z ],
4367+ color = [ 'Identity(1,2)' ],
4368+ lorentz = [ L.FFV2, L.FFV5 ],
4369+ couplings = {(0,0):C.GC_16,(0,1):C.GC_17})
4370+
4371+V_56 = Vertex(name = 'V_56',
4372+ particles = [ P.c__tilde__, P.c, P.Z ],
4373+ color = [ 'Identity(1,2)' ],
4374+ lorentz = [ L.FFV2, L.FFV5 ],
4375+ couplings = {(0,0):C.GC_16,(0,1):C.GC_17})
4376+
4377+V_57 = Vertex(name = 'V_57',
4378+ particles = [ P.t__tilde__, P.t, P.Z ],
4379+ color = [ 'Identity(1,2)' ],
4380+ lorentz = [ L.FFV2, L.FFV5 ],
4381+ couplings = {(0,0):C.GC_16,(0,1):C.GC_17})
4382+
4383+V_58 = Vertex(name = 'V_58',
4384+ particles = [ P.ve__tilde__, P.ve, P.Z ],
4385+ color = [ '1' ],
4386+ lorentz = [ L.FFV2 ],
4387+ couplings = {(0,0):C.GC_22})
4388+
4389+V_59 = Vertex(name = 'V_59',
4390+ particles = [ P.vm__tilde__, P.vm, P.Z ],
4391+ color = [ '1' ],
4392+ lorentz = [ L.FFV2 ],
4393+ couplings = {(0,0):C.GC_22})
4394+
4395+V_60 = Vertex(name = 'V_60',
4396+ particles = [ P.vt__tilde__, P.vt, P.Z ],
4397+ color = [ '1' ],
4398+ lorentz = [ L.FFV2 ],
4399+ couplings = {(0,0):C.GC_22})
4400+
4401
4402=== added file 'models/triplet_diquarks/write_param_card.py'
4403--- models/triplet_diquarks/write_param_card.py 1970-01-01 00:00:00 +0000
4404+++ models/triplet_diquarks/write_param_card.py 2010-12-15 07:31:31 +0000
4405@@ -0,0 +1,65 @@
4406+
4407+__date__ = "3 june 2010"
4408+__author__ = 'olivier.mattelaer@uclouvain.be'
4409+
4410+class ParamCardWriter(object):
4411+
4412+ header = \
4413+ """######################################################################\n""" + \
4414+ """## PARAM_CARD AUTOMATICALY GENERATED BY THE UFO #####################\n""" + \
4415+ """######################################################################\n"""
4416+
4417+ def __init__(self, filename, list_of_parameters=None):
4418+ """write a valid param_card.dat"""
4419+
4420+ if not list_of_parameters:
4421+ from parameters import all_parameters
4422+ list_of_parameters = [param for param in all_parameters if \
4423+ param.nature=='external']
4424+
4425+ self.fsock = open(filename, 'w')
4426+ self.fsock.write(self.header)
4427+
4428+ self.write_card(list_of_parameters)
4429+
4430+
4431+ def write_card(self, all_ext_param):
4432+ """ """
4433+
4434+
4435+
4436+ # list all lhablock
4437+ all_lhablock = set([param.lhablock for param in all_ext_param])
4438+
4439+ # ordonate lhablock alphabeticaly
4440+ list(all_lhablock).sort()
4441+
4442+ for lhablock in all_lhablock:
4443+ self.write_block(lhablock)
4444+ [self.write_param(param, lhablock) for param in all_ext_param if \
4445+ param.lhablock == lhablock]
4446+ def write_block(self, name):
4447+ """ write a comment for a block"""
4448+
4449+ self.fsock.writelines(
4450+ """\n###################################""" + \
4451+ """\n## INFORMATION FOR %s""" % name.upper() +\
4452+ """\n###################################\n"""
4453+ )
4454+ if name!='DECAY':
4455+ self.fsock.write("""Block %s \n""" % name)
4456+
4457+ def write_param(self, param, lhablock):
4458+
4459+ lhacode=' '.join(['%3s' % key for key in param.lhacode])
4460+ if lhablock != 'DECAY':
4461+ text = """ %s %e # %s \n""" % (lhacode, param.value, param.name )
4462+ else:
4463+ text = '''DECAY %s %e \n''' % (lhacode, param.value)
4464+ self.fsock.write(text)
4465+
4466+
4467+if '__main__' == __name__:
4468+ ParamCardWriter('./param_card.dat')
4469+ print 'done'
4470+
4471
4472=== modified file 'tests/acceptance_tests/test_cmd.py'
4473--- tests/acceptance_tests/test_cmd.py 2010-12-07 22:44:51 +0000
4474+++ tests/acceptance_tests/test_cmd.py 2010-12-15 07:31:31 +0000
4475@@ -446,6 +446,61 @@
4476 'P0_epem_epem',
4477 'madevent')))
4478
4479+ def test_madevent_triplet_diquarks(self):
4480+ """Test MadEvent output of triplet diquarks"""
4481+
4482+ if os.path.isdir(self.out_dir):
4483+ shutil.rmdir(self.out_dir)
4484+
4485+ self.do('import model triplet_diquarks')
4486+ self.do('generate u t > trip~ > u t g')
4487+ self.do('output %s ' % self.out_dir)
4488+
4489+ devnull = open(os.devnull,'w')
4490+ # Check that the Source directory compiles
4491+ status = subprocess.call(['make'],
4492+ stdout=devnull, stderr=devnull,
4493+ cwd=os.path.join(self.out_dir, 'Source'))
4494+ self.assertEqual(status, 0)
4495+ self.assertTrue(os.path.exists(os.path.join(self.out_dir,
4496+ 'lib', 'libdhelas3.a')))
4497+ self.assertTrue(os.path.exists(os.path.join(self.out_dir,
4498+ 'lib', 'libmodel.a')))
4499+ self.assertTrue(os.path.exists(os.path.join(self.out_dir,
4500+ 'lib', 'libgeneric.a')))
4501+ self.assertTrue(os.path.exists(os.path.join(self.out_dir,
4502+ 'lib', 'libcernlib.a')))
4503+ self.assertTrue(os.path.exists(os.path.join(self.out_dir,
4504+ 'lib', 'libdsample.a')))
4505+ self.assertTrue(os.path.exists(os.path.join(self.out_dir,
4506+ 'lib', 'libpdf.a')))
4507+ # Check that gensym compiles
4508+ status = subprocess.call(['make', 'gensym'],
4509+ stdout=devnull, stderr=devnull,
4510+ cwd=os.path.join(self.out_dir, 'SubProcesses',
4511+ 'P0_ut_tripx_utg'))
4512+ self.assertEqual(status, 0)
4513+ self.assertTrue(os.path.exists(os.path.join(self.out_dir,
4514+ 'SubProcesses',
4515+ 'P0_ut_tripx_utg',
4516+ 'gensym')))
4517+ # Check that gensym runs
4518+ status = subprocess.call('./gensym',
4519+ stdout=devnull, stderr=devnull,
4520+ cwd=os.path.join(self.out_dir, 'SubProcesses',
4521+ 'P0_ut_tripx_utg'), shell=True)
4522+ self.assertEqual(status, 0)
4523+ # Check that madevent compiles
4524+ status = subprocess.call(['make', 'madevent'],
4525+ stdout=devnull, stderr=devnull,
4526+ cwd=os.path.join(self.out_dir, 'SubProcesses',
4527+ 'P0_ut_tripx_utg'))
4528+ self.assertEqual(status, 0)
4529+ self.assertTrue(os.path.exists(os.path.join(self.out_dir,
4530+ 'SubProcesses',
4531+ 'P0_ut_tripx_utg',
4532+ 'madevent')))
4533+
4534 def test_ufo_standard_sm(self):
4535 """ check that we can use standard MG4 name """
4536 self.do('import model sm')
4537
4538=== modified file 'tests/parallel_tests/me_comparator.py'
4539--- tests/parallel_tests/me_comparator.py 2010-10-28 00:17:50 +0000
4540+++ tests/parallel_tests/me_comparator.py 2010-12-15 07:31:31 +0000
4541@@ -41,6 +41,8 @@
4542
4543 import madgraph.interface.cmd_interface as cmd_interface
4544
4545+from madgraph import MadGraph5Error
4546+
4547 class MERunner(object):
4548 """Base class to containing default function to setup, run and access results
4549 produced with a specific ME generator.
4550@@ -107,11 +109,17 @@
4551
4552 self.setup_flag = False
4553
4554+ self.check_path(mg4_path)
4555+
4556 # Create a copy of Template
4557+<<<<<<< TREE
4558 if not os.path.isdir(os.path.join(mg4_path, "Template")) or \
4559 not os.path.isdir(os.path.join(mg4_path, "HELAS")):
4560 raise IOError, "Path %s is not a valid MG4 path" % str(mg4_path)
4561
4562+=======
4563+
4564+>>>>>>> MERGE-SOURCE
4565 self.mg4_path = os.path.abspath(mg4_path)
4566
4567 if not temp_dir:
4568@@ -142,6 +150,13 @@
4569 logging.info("Temporary standalone directory %s successfully created" % \
4570 temp_dir)
4571
4572+ def check_path(self, mg4_path):
4573+ """Check the path for necessary directories"""
4574+
4575+ if not os.path.isdir(os.path.join(mg4_path, "Template")) or \
4576+ not os.path.isdir(os.path.join(mg4_path, "HELAS")):
4577+ raise IOError, "Path %s is not a valid MG4 path" % str(mg4_path)
4578+
4579 def cleanup(self):
4580 """Clean up temporary directories"""
4581
4582@@ -319,6 +334,13 @@
4583
4584 self.mg5_path = os.path.abspath(mg5_path)
4585
4586+ def check_path(self, mg4_path):
4587+ """Check the path for necessary directories"""
4588+
4589+ if not os.path.isdir(os.path.join(mg4_path, "Template")) or \
4590+ not os.path.isdir(os.path.join(mg4_path, "HELAS")):
4591+ raise IOError, "Path %s is not a valid MG4 path" % str(mg4_path)
4592+
4593 def run(self, proc_list, model, orders={}, energy=1000):
4594 """Execute MG5 on the list of processes mentioned in proc_list, using
4595 the specified model, the specified maximal coupling orders and a certain
4596@@ -350,7 +372,7 @@
4597 try:
4598 cmd.run_cmd(line)
4599 except MadGraph5Error:
4600- pass
4601+ raise Exception
4602 # Get the ME value
4603 for i, proc in enumerate(proc_list):
4604 self.res_list.append(self.get_me_value(proc, i))
4605@@ -377,6 +399,12 @@
4606 name = 'UFO-ALOHA-MG5'
4607 type = 'ufo'
4608
4609+ def check_path(self, mg4_path):
4610+ """Check the path for necessary directories"""
4611+
4612+ if not os.path.isdir(os.path.join(mg4_path, "Template")):
4613+ raise IOError, "Path %s is not a valid MG4 path" % str(mg4_path)
4614+
4615 def format_mg5_proc_card(self, proc_list, model, orders):
4616 """Create a proc_card.dat string following v5 conventions."""
4617
4618
4619=== modified file 'tests/parallel_tests/sample_script.py'
4620--- tests/parallel_tests/sample_script.py 2010-12-07 22:44:51 +0000
4621+++ tests/parallel_tests/sample_script.py 2010-12-15 07:31:31 +0000
4622@@ -46,6 +46,7 @@
4623 logging.getLogger('tutorial').setLevel(logging.ERROR)
4624
4625 logging.basicConfig(level=logging.INFO)
4626+<<<<<<< TREE
4627 # my_proc_list = me_comparator.create_proc_list_enhanced(
4628 ## ['w+', 'w-', 'z'],
4629 ## initial=2, final_1=2)
4630@@ -57,6 +58,18 @@
4631 # final=2)
4632 #my_proc_list = me_comparator.create_proc_list(['g', 'h', 'h3'], initial=2,
4633 # final=4)
4634+=======
4635+ #my_proc_list = me_comparator.create_proc_list(['u', 'u~'], initial=2,
4636+ # final=2)
4637+ #my_proc_list = me_comparator.create_proc_list_enhanced(
4638+ # ['u', 'u~', 'd', 'd~', 'g'],['six', 'six~'],['g'],
4639+ # initial=2, final_1=1, final_2 = 1)
4640+
4641+ my_proc_list = ['u u > ul ul', 'u u~ > go go', 'g g > go go',
4642+ 'g g > go go g']
4643+
4644+ my_proc_list = ['g g > g g g']
4645+>>>>>>> MERGE-SOURCE
4646
4647 my_proc_list = ['h > g g g g']
4648 # Create a MERunner object for MG4
4649@@ -81,20 +94,37 @@
4650
4651 # Create and setup a comparator
4652 my_comp = me_comparator.MEComparator()
4653+<<<<<<< TREE
4654 my_comp.set_me_runners(my_mg5, my_mg5_ufo, my_mg4, my_mg4_2)
4655+=======
4656+ my_comp.set_me_runners(my_mg4, my_mg5, my_mg5_ufo)
4657+>>>>>>> MERGE-SOURCE
4658
4659 # Run the actual comparison
4660 my_comp.run_comparison(my_proc_list,
4661+<<<<<<< TREE
4662 model=['heft_fix', 'heft', 'heft', 'heft_fix'], orders={'QED':0, 'QCD':3, 'HIG':1, 'HIW':1}, energy=2000)
4663+=======
4664+ model='sm',
4665+ orders={'QED':4, 'QCD':4}, energy=2000)
4666+>>>>>>> MERGE-SOURCE
4667
4668 # Do some cleanup
4669 #my_comp.cleanup()
4670+ filename='sm_results.log'
4671
4672 filename = "heft_results.log"
4673
4674 # Print the output
4675- my_comp.output_result(filename=filename)
4676- pydoc.pager(file(filename,'r').read())
4677+<<<<<<< TREE
4678+ my_comp.output_result(filename=filename)
4679+ pydoc.pager(file(filename,'r').read())
4680+=======
4681+ my_comp.output_result(filename=filename)
4682+
4683+
4684+ pydoc.pager(file(filename,'r').read())
4685+>>>>>>> MERGE-SOURCE
4686
4687 # Print a list of non zero processes
4688 #print my_comp.get_non_zero_processes()
4689
4690=== modified file 'tests/unit_tests/core/test_color_algebra.py'
4691--- tests/unit_tests/core/test_color_algebra.py 2010-07-18 08:25:21 +0000
4692+++ tests/unit_tests/core/test_color_algebra.py 2010-12-15 07:31:31 +0000
4693@@ -180,7 +180,112 @@
4694 self.assertEqual(my_d.simplify(),
4695 color.ColorFactor([col_str1, col_str2]))
4696
4697-
4698+ def test_epsilon_object(self):
4699+ """Test the epsilon object"""
4700+
4701+ # Espilon should have exactly 3 indices!
4702+ self.assertRaises(AssertionError,
4703+ color.Epsilon,
4704+ 1, 2)
4705+
4706+ my_epsilon1 = color.Epsilon(2, 3, 1)
4707+ my_epsilon2 = color.Epsilon(5, 1, 4)
4708+ my_epsilon2 = my_epsilon2.complex_conjugate()
4709+
4710+ my_goal_str1 = color.ColorString([color.T(2, 4), color.T(3, 5)])
4711+ my_goal_str2 = color.ColorString([color.T(2, 5), color.T(3, 4)])
4712+ my_goal_str2.coeff = fractions.Fraction(-1
4713+ )
4714+ self.assertEqual(my_epsilon1.pair_simplify(my_epsilon2),
4715+ color.ColorFactor([my_goal_str1, my_goal_str2]))
4716+
4717+ def test_delta3_pair_simplify(self):
4718+ """Test delta3 simplify"""
4719+
4720+ self.assertEqual(color.K6(1,101,103).pair_simplify(color.T(101,102)),
4721+ color.ColorFactor([color.ColorString([color.K6(1,103,102)])]))
4722+ self.assertEqual(color.K6(1,103,102).pair_simplify(color.T(102,101)),
4723+ color.ColorFactor([color.ColorString([color.K6(1,103,101)])]))
4724+ self.assertEqual(color.K6Bar(1,101,103).pair_simplify(color.T(102,101)),
4725+ color.ColorFactor([color.ColorString([color.K6Bar(1,103,102)])]))
4726+ self.assertEqual(color.K6Bar(1,103,101).pair_simplify(color.T(102,101)),
4727+ color.ColorFactor([color.ColorString([color.K6Bar(1,103,102)])]))
4728+
4729+ def test_delta6_simplify(self):
4730+ """Test delta6 simplify"""
4731+
4732+ # delta6(i,i) = 1
4733+ col_str1 = color.ColorString()
4734+ col_str1.Nc_power = 2
4735+ col_str1.coeff = fractions.Fraction(1, 2)
4736+ col_str2 = color.ColorString()
4737+ col_str2.Nc_power = 1
4738+ col_str2.coeff = fractions.Fraction(1, 2)
4739+ self.assertEqual(color.T6(1, 1).simplify(),
4740+ color.ColorFactor([col_str1, col_str2]))
4741+
4742+ def test_K6_objects(self):
4743+ """Test K6 product simplifications"""
4744+
4745+ #K6(m,i,j)K6Bar(m,k,l) = 1/2(T(l,i)T(k,j)
4746+ # + T(k,i)T(l,j)
4747+
4748+ my_K6 = color.K6(1,101,102)
4749+ my_K6Bar = color.K6Bar(1,103,104)
4750+
4751+ col_str1 = color.ColorString([color.T(104,101),
4752+ color.T(103,102)])
4753+ col_str2 = color.ColorString([color.T(103,101),
4754+ color.T(104,102)])
4755+ col_str1.coeff = fractions.Fraction(1, 2)
4756+ col_str2.coeff = fractions.Fraction(1, 2)
4757+
4758+ self.assertEqual(my_K6.pair_simplify(my_K6Bar),
4759+ color.ColorFactor([col_str1, col_str2]))
4760+
4761+ #K6(m,i,j)K6Bar(n,j,i) = delta6(m,n)
4762+
4763+ my_K6 = color.K6(1,101,102)
4764+ my_K6Bar = color.K6Bar(2,102,101)
4765+
4766+ self.assertEqual(my_K6.pair_simplify(my_K6Bar),
4767+ color.ColorFactor([\
4768+ color.ColorString([color.T6(1,2)])]))
4769+
4770+ #K6(m,i,j)K6Bar(n,i,j) = delta6(m,n).
4771+ my_K6 = color.K6(1,101,102)
4772+ my_K6Bar = color.K6Bar(2,101,102)
4773+
4774+ self.assertEqual(my_K6.pair_simplify(my_K6Bar),
4775+ color.ColorFactor([\
4776+ color.ColorString([color.T6(1,2)])]))
4777+
4778+
4779+ def test_T6_simplify(self):
4780+ """Test T6 simplify"""
4781+
4782+ # T6(a,i,j) = 2(K6(i,ii,jj)T(a,jj,kk)K6Bar(j,kk,ii))
4783+
4784+ my_T6 = color.T6(1,101,102)
4785+
4786+ color.T6.new_index = 10000
4787+
4788+ k6 = color.K6(101, 10000, 10001)
4789+ t = color.T(1, 10001, 10002)
4790+ k6b = color.K6Bar(102, 10002, 10000)
4791+ col_string = color.ColorString([k6, t, k6b])
4792+ col_string.coeff = fractions.Fraction(2, 1)
4793+ self.assertEqual(my_T6.simplify(), color.ColorFactor([col_string]))
4794+
4795+ my_T6 = color.T6(1,101,102)
4796+
4797+ k6 = color.K6(101, 10003, 10004)
4798+ t = color.T(1, 10004, 10005)
4799+ k6b = color.K6Bar(102, 10005, 10003)
4800+ col_string = color.ColorString([k6, t, k6b])
4801+ col_string.coeff = fractions.Fraction(2, 1)
4802+ self.assertEqual(my_T6.simplify(), color.ColorFactor([col_string]))
4803+
4804 class ColorStringTest(unittest.TestCase):
4805 """Test class for the ColorString objects"""
4806
4807@@ -369,3 +474,113 @@
4808 '(2 I Tr(1,4,3,5,2))+(-2 I Tr(1,5,4,3,2))')
4809
4810
4811+ def test_sextet_products(self):
4812+ """Test non trivial product of sextet operators"""
4813+
4814+ # T6[2, 101, 102] T6[2, 102, 103] = (-1 + Nc) (2 + Nc) delta6[101, 103])/Nc
4815+
4816+ my_color_factor = color.ColorFactor([\
4817+ color.ColorString([color.T6(2, 101, 102),
4818+ color.T6(2, 102, 103)])])
4819+
4820+ col_str1 = color.ColorString([color.T6(101,103)])
4821+ col_str1.Nc_power = 1
4822+ col_str2 = copy.copy(col_str1)
4823+ col_str2.Nc_power = 0
4824+ col_str3 = copy.copy(col_str1)
4825+ col_str3.Nc_power = -1
4826+ col_str3.coeff = fractions.Fraction(-2, 1)
4827+
4828+ self.assertEqual(my_color_factor.full_simplify(),
4829+ color.ColorFactor([col_str1, col_str2, col_str3]))
4830+
4831+ # T6[2, 101, 102] T6[3, 102, 101] = 1/2 (2 + Nc) delta8[2, 3]
4832+
4833+ my_color_factor = color.ColorFactor([\
4834+ color.ColorString([color.T6(2, 101, 102),
4835+ color.T6(3, 102, 101)])])
4836+
4837+ col_str1 = color.ColorString([color.Tr(2,3)])
4838+ col_str1.Nc_power = 1
4839+ col_str1.coeff = fractions.Fraction(1)
4840+ col_str2 = copy.copy(col_str1)
4841+ col_str2.Nc_power = 0
4842+ col_str2.coeff = fractions.Fraction(2)
4843+
4844+ self.assertEqual(my_color_factor.full_simplify(),
4845+ color.ColorFactor([col_str1, col_str2]))
4846+
4847+
4848+ # K6[1, 101, 102] T[2, 102, 103] T[2, 103, 104] K6Bar[1, 104, 101]
4849+ # = 1/4 (-1 + Nc) (1 + Nc)^2
4850+ # = 1/4 (-1 - Nc + Nc^2 + Nc^3)
4851+
4852+ my_color_factor = color.ColorFactor([\
4853+ color.ColorString([color.K6(1, 101, 102),
4854+ color.T(2, 102, 103),
4855+ color.T(2, 103, 104),
4856+ color.K6Bar(1, 104, 101)])])
4857+
4858+ col_str1 = color.ColorString()
4859+ col_str1.Nc_power = 3
4860+ col_str1.coeff = fractions.Fraction(1, 4)
4861+ col_str2 = color.ColorString()
4862+ col_str2.Nc_power = 2
4863+ col_str2.coeff = fractions.Fraction(1, 4)
4864+ col_str3 = color.ColorString()
4865+ col_str3.Nc_power = 1
4866+ col_str3.coeff = fractions.Fraction(-1, 4)
4867+ col_str4 = color.ColorString()
4868+ col_str4.Nc_power = 0
4869+ col_str4.coeff = fractions.Fraction(-1, 4)
4870+
4871+ self.assertEqual(my_color_factor.full_simplify(),
4872+ color.ColorFactor([col_str1, col_str3,
4873+ col_str2, col_str4]))
4874+
4875+ # T6[2, 101, 102] T6[2, 102, 103] K6[103, 99, 98] K6Bar[101, 98, 99]
4876+ # = 1/2 (-1 + Nc) (1 + Nc) (2 + Nc)
4877+ # = 1/2 (Nc^3 + 2 Nc^2 - Nc - 2)
4878+
4879+ my_color_factor = color.ColorFactor([\
4880+ color.ColorString([color.T6(2, 101, 102),
4881+ color.T6(2, 102, 103),
4882+ color.K6(103,99, 98),
4883+ color.K6Bar(101, 98, 99)])])
4884+
4885+ col_str1 = color.ColorString()
4886+ col_str1.Nc_power = 3
4887+ col_str1.coeff = fractions.Fraction(1, 2)
4888+ col_str2 = color.ColorString()
4889+ col_str2.Nc_power = 2
4890+ col_str2.coeff = fractions.Fraction(1, 1)
4891+ col_str3 = color.ColorString()
4892+ col_str3.Nc_power = 1
4893+ col_str3.coeff = fractions.Fraction(-1, 2)
4894+ col_str4 = color.ColorString()
4895+ col_str4.Nc_power = 0
4896+ col_str4.coeff = fractions.Fraction(-1, 1)
4897+
4898+ self.assertEqual(my_color_factor.full_simplify(),
4899+ color.ColorFactor([col_str2, col_str1,
4900+ col_str3, col_str4]))
4901+
4902+ # K6[103, 99, 98] T[80, 98, 100] K6Bar[103, 100, 97] T[80, 99, 97]
4903+ # = -(1/4) + Nc^2/4
4904+
4905+ my_color_factor = color.ColorFactor([\
4906+ color.ColorString([color.K6(103, 99, 98),
4907+ color.T(80, 98, 100),
4908+ color.K6Bar(103, 100, 97),
4909+ color.T(80, 99, 97)])])
4910+
4911+ col_str1 = color.ColorString()
4912+ col_str1.Nc_power = 2
4913+ col_str1.coeff = fractions.Fraction(1, 4)
4914+ col_str2 = color.ColorString()
4915+ col_str2.Nc_power = 0
4916+ col_str2.coeff = fractions.Fraction(-1, 4)
4917+
4918+ self.assertEqual(my_color_factor.full_simplify(),
4919+ color.ColorFactor([col_str1, col_str2]))
4920+
4921
4922=== modified file 'tests/unit_tests/core/test_color_amp.py'
4923--- tests/unit_tests/core/test_color_amp.py 2010-07-17 23:55:50 +0000
4924+++ tests/unit_tests/core/test_color_amp.py 2010-12-15 07:31:31 +0000
4925@@ -212,8 +212,8 @@
4926 col_dict = my_col_basis.colorize(myamplitude['diagrams'][0],
4927 self.mymodel)
4928
4929- goal_dict = {(0, 0):color.ColorString([color.T(-1000, 2, 1),
4930- color.f(3, 4, -1000)])}
4931+ goal_dict = {(0, 0):color.ColorString([color.T(-1000, 1, 2),
4932+ color.f(-1000, 3, 4)])}
4933
4934 self.assertEqual(col_dict, goal_dict)
4935
4936@@ -221,8 +221,8 @@
4937 col_dict = my_col_basis.colorize(myamplitude['diagrams'][1],
4938 self.mymodel)
4939
4940- goal_dict = {(0, 0):color.ColorString([color.T(3, -1000, 1),
4941- color.T(4, 2, -1000)])}
4942+ goal_dict = {(0, 0):color.ColorString([color.T(3, 1, -1000),
4943+ color.T(4, -1000, 2)])}
4944
4945 self.assertEqual(col_dict, goal_dict)
4946
4947@@ -230,8 +230,8 @@
4948 col_dict = my_col_basis.colorize(myamplitude['diagrams'][2],
4949 self.mymodel)
4950
4951- goal_dict = {(0, 0):color.ColorString([color.T(4, -1000, 1),
4952- color.T(3, 2, -1000)])}
4953+ goal_dict = {(0, 0):color.ColorString([color.T(4, 1, -1000),
4954+ color.T(3,-1000, 2)])}
4955
4956 self.assertEqual(col_dict, goal_dict)
4957
4958@@ -262,9 +262,8 @@
4959 # First diagram with two 3-gluon vertices
4960 col_dict = my_col_basis.colorize(myamplitude['diagrams'][0],
4961 self.mymodel)
4962-
4963- goal_dict = {(0, 0, 0):color.ColorString([color.T(-1000, 1, 2),
4964- color.f(3, 4, -1001),
4965+ goal_dict = {(0, 0, 0):color.ColorString([color.T(-1000, 2, 1),
4966+ color.f(-1001, 3, 4),
4967 color.f(-1000, -1001, 5)])}
4968
4969 self.assertEqual(col_dict, goal_dict)
4970@@ -273,15 +272,15 @@
4971 col_dict = my_col_basis.colorize(myamplitude['diagrams'][3],
4972 self.mymodel)
4973
4974- goal_dict = {(0, 0):color.ColorString([color.T(-1000, 1, 2),
4975- color.f(-1001, 3, 5),
4976- color.f(-1001, 4, -1000)]),
4977- (0, 1):color.ColorString([color.T(-1000, 1, 2),
4978- color.f(-1002, 3, -1000),
4979- color.f(-1002, 4, 5)]),
4980- (0, 2):color.ColorString([color.T(-1000, 1, 2),
4981- color.f(-1003, 3, 4),
4982- color.f(-1003, 5, -1000)])}
4983+ goal_dict = {(0, 0):color.ColorString([color.T(-1000, 2, 1),
4984+ color.f(-1001, -1000, 4),
4985+ color.f(-1001, 3, 5)]),
4986+ (0, 1):color.ColorString([color.T(-1000, 2, 1),
4987+ color.f(-1002, -1000, 5),
4988+ color.f(-1002, 3, 4)]),
4989+ (0, 2):color.ColorString([color.T(-1000, 2, 1),
4990+ color.f(-1003, -1000, 3),
4991+ color.f(-1003, 4, 5)])}
4992
4993 self.assertEqual(col_dict, goal_dict)
4994
4995@@ -316,12 +315,12 @@
4996 # Test the color flow decomposition
4997 self.assertEqual(new_col_basis.color_flow_decomposition(
4998 {1:3, 2:-3, 3:1, 4:8, 5:8, 6:8}, 2),
4999- [{1: [504, 0], 2: [0, 501], 3: [0, 0], 4: [502, 501], 5: [503, 502], 6: [504, 503]},
5000- {1: [503, 0], 2: [0, 501], 3: [0, 0], 4: [502, 501], 5: [503, 504], 6: [504, 502]},
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches