1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 """Classes, methods and functions required to write QCD color information
17 for a loop diagram and build a color basis, and to square a QCD color string for
18 squared diagrams and interference terms."""
19
20 from __future__ import absolute_import
21 import copy
22 import fractions
23 import operator
24 import re
25 import madgraph.various.misc as misc
26
27 import madgraph.core.color_amp as color_amp
28 import madgraph.core.color_algebra as color_algebra
29 import madgraph.core.diagram_generation as diagram_generation
30 import madgraph.loop.loop_diagram_generation as loop_diagram_generation
31 import madgraph.core.base_objects as base_objects
32
33
34
35
36
38 """ Same class as its mother ColorBasis except that it can also handle
39 LoopAmplitudes."""
40
41 - def __init__(self, compute_loop_nc = False):
42 """ Defines the instance attribute compute_loop_nc.
43 The compute_loop_nc sets wheter independent tracking of Nc power coming
44 from the color loop trace is necessary or not (it is time consuming)."""
45
46 self.compute_loop_nc = compute_loop_nc
47
49 """ Add a color delta in the right representation (depending on the
50 color charge carried by the L-cut particle whose number are given in
51 the loop_numbers argument) to close the loop color trace."""
52
53
54
55 if lcut_charge<0:
56 lcut_numbers.reverse()
57 if abs(lcut_charge)==1:
58
59 return
60 elif abs(lcut_charge)==3:
61 closingCS=color_algebra.ColorString(\
62 [color_algebra.T(lcut_numbers[1],lcut_numbers[0])])
63 elif abs(lcut_charge)==6:
64 closingCS=color_algebra.ColorString(\
65 [color_algebra.T6(lcut_numbers[1],lcut_numbers[0])])
66 elif abs(lcut_charge)==8:
67 closingCS=color_algebra.ColorString(\
68 [color_algebra.Tr(lcut_numbers[1],lcut_numbers[0])],
69 fractions.Fraction(2, 1))
70 else:
71 raise color_amp.ColorBasis.ColorBasisError("L-cut particle has an unsupported color representation %s" % lcut_charge)
72
73
74 for CS in colorize_dict.values():
75
76
77 if self.compute_loop_nc:
78
79
80 max_CS_lcut_diag_Nc_power = max(cs.Nc_power \
81 for cs in color_algebra.ColorFactor([CS]).full_simplify())
82
83 CS.product(closingCS)
84 if self.compute_loop_nc:
85
86
87
88 simplified_cs = color_algebra.ColorFactor([CS]).full_simplify()
89 if not simplified_cs:
90
91 CS.loop_Nc_power = 0
92 continue
93
94 max_CS_loop_diag_Nc_power = max(cs.Nc_power \
95 for cs in simplified_cs)
96
97
98 CS.loop_Nc_power = max_CS_loop_diag_Nc_power - \
99 max_CS_lcut_diag_Nc_power
100 else:
101
102
103
104 CS.loop_Nc_power = None
105
141
143 """Returns a list of colorize dict for all born diagrams in amplitude.
144 Also update the _list_color_dict object accordingly """
145
146 list_color_dict = []
147
148 if not isinstance(amplitude,loop_diagram_generation.LoopAmplitude):
149 raise color_amp.ColorBasis.ColorBasisError('LoopColorBasis is used with an amplitude which is not a LoopAmplitude')
150
151 for diagram in amplitude.get('born_diagrams'):
152 colorize_dict = self.colorize(diagram,
153 amplitude.get('process').get('model'))
154 list_color_dict.append(colorize_dict)
155
156 self._list_color_dict = list_color_dict
157
158 return list_color_dict
159
161 """Build the a color basis object using information contained in
162 amplitude (otherwise use info from _list_color_dict).
163 Returns a list of color """
164
165 self.create_born_color_dict_list(amplitude)
166 for index, color_dict in enumerate(self._list_color_dict):
167 self.update_color_basis(color_dict, index)
168
170 """Build the loop color basis object using information contained in
171 amplitude (otherwise use info from _list_color_dict).
172 Returns a list of color."""
173
174 self.create_loop_color_dict_list(amplitude)
175 for index, color_dict in enumerate(self._list_color_dict):
176 self.update_color_basis(color_dict, index)
177