Merge lp:~maddevelopers/mg5amcnlo/1.4.6 into lp:~madteam/mg5amcnlo/trunk

Proposed by Olivier Mattelaer
Status: Merged
Merged at revision: 212
Proposed branch: lp:~maddevelopers/mg5amcnlo/1.4.6
Merge into: lp:~madteam/mg5amcnlo/trunk
Diff against target: 4882 lines (+2373/-832)
40 files modified
Template/Cards/run_card.dat (+11/-0)
Template/README (+82/-16)
Template/Source/cuts.inc (+6/-0)
Template/Source/setrun.f (+13/-0)
Template/SubProcesses/addmothers.f (+162/-100)
Template/SubProcesses/cuts.f (+65/-2)
Template/SubProcesses/myamp.f (+4/-0)
Template/SubProcesses/setcuts.f (+17/-0)
Template/bin/madevent (+46/-12)
UpdateNotes.txt (+18/-0)
aloha/aloha_writers.py (+3/-3)
aloha/create_aloha.py (+6/-2)
madgraph/VERSION (+2/-2)
madgraph/core/helas_objects.py (+3/-3)
madgraph/interface/extended_cmd.py (+2/-2)
madgraph/interface/madevent_interface.py (+42/-47)
madgraph/interface/madgraph_interface.py (+6/-3)
madgraph/iolibs/export_cpp.py (+2/-3)
madgraph/iolibs/group_subprocs.py (+16/-12)
madgraph/iolibs/helas_call_writers.py (+3/-11)
madgraph/various/banner.py (+8/-0)
madgraph/various/gen_crossxhtml.py (+8/-2)
madgraph/various/misc.py (+2/-8)
models/sm/coupling_orders.py (+5/-4)
models/sm/couplings.py (+48/-44)
models/sm/lorentz.py (+6/-2)
models/sm/parameters.py (+55/-55)
models/sm/particles.py (+72/-72)
models/sm/restrict_lepton_masses.dat (+53/-0)
models/sm/vertices.py (+218/-212)
models/sm/write_param_card.py (+2/-2)
tests/acceptance_tests/test_cmd.py (+5/-4)
tests/acceptance_tests/test_model_equivalence.py (+6/-5)
tests/parallel_tests/compare_with_old_mg5_version.py (+1/-1)
tests/unit_tests/iolibs/test_export_cpp.py (+700/-152)
tests/unit_tests/iolibs/test_export_v4.py (+254/-2)
tests/unit_tests/iolibs/test_group_subprocs.py (+368/-0)
tests/unit_tests/various/test_aloha.py (+2/-1)
tests/unit_tests/various/test_import_ufo.py (+49/-47)
tests/unit_tests/various/test_process_checks.py (+2/-1)
To merge this branch: bzr merge lp:~maddevelopers/mg5amcnlo/1.4.6
Reviewer Review Type Date Requested Status
Olivier Mattelaer Approve
Johan Alwall Pending
Review via email: mp+105385@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Olivier Mattelaer (olivier-mattelaer) wrote :

Since this affects the matching,
It would be nice to release this version as soon as possible.

Thanks,

Olivier

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

Hello Olivier,

Let's include also the fix for the C++ output problem. I will remove my modifications to myamp.f, since they don't work very well and Tim still haven't had a chance to look at it. We'll include that in the next release instead.

Cheers,
Johan

lp:~maddevelopers/mg5amcnlo/1.4.6 updated
225. By Olivier Mattelaer

fixed the problem in aloha pointed in question #196755

226. By Olivier Mattelaer

merge with Johan modifications

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

Hi Johan,

For me this is ok for the merge as soon as you have run the parralel test (at least for the mssm)
since you have change the call for the conjugate routines, it's better to cross-check that.

Cheers,

Olivier

review: Approve
lp:~maddevelopers/mg5amcnlo/1.4.6 updated
227. By Olivier Mattelaer

change the SM to include the 4h (need to update the tests)

228. By mattelaer-olivier

fix the tests linked to the change of the SM model

229. By Olivier Mattelaer

fix aloha: fix the C++ output for conjugate routine (problem with the mass)

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

Ok I've runned the parralel test, and one test fails:
AssertionError: 'Failed for processes:\nh h > h h 1.2614627423e-01 2.2114578554e-02 7.0168013823e-01 ' != 'Failed for processes:'

So this sounds expected since the SM changed in order to include the 4h interactions.

So Everything is perfect on that side.

Just for your information the way to run the parralel test are only
./tests/test_manager.py -p P
some test_short fails when runned in that way (due to modification on the disk)
so you need to rerun those one to be sure:
./tests/test_manager.py -p P test_short.*

Cheers,

Olivier

lp:~maddevelopers/mg5amcnlo/1.4.6 updated
230. By Olivier Mattelaer

add the cross-section/number of event in the banner
correct the parralel test for future used

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

Could I make the merge?

Cheers,

Olivier

lp:~maddevelopers/mg5amcnlo/1.4.6 updated
231. By Johan Alwall

Fixed some language in UpdateNotes and Template/README file

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

Hello Olivier,

A comment: The possibility to give commands as command line arguments is very close to perfect, but not quite:
bin/madevent "set automatic_html_opening False;generate_events -f"
gives:
ERROR: set automatic_html_opening False;generate_events -f not a valid command. Please retry

The same line works perfectly when I give it using echo.

Shouldn't this work? It should be easy to make it work too right?

Cheers,
Johan

lp:~maddevelopers/mg5amcnlo/1.4.6 updated
232. By Johan Alwall

Fixed spelling error in README file

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

Hi Johan,

I'm surprised about the error message, I was more expecting an error
of the type:
-bash: generate_events: command not found
since the ';' should be interpreted by bash as a end of line separator
by bash in itself.

I just test it on my computer and in fact I have the above error.

So if you want to implement test for your computer, please do it, but
very careful since this is not working
on all machine,

Cheers,

Olivier

PS: One solution (working on my computer)
  is to echap the ;

[PROC_sm_0]$ ./bin/madevent set automatic_html_opening False\;
generate_events -f
Running MG5 in debug mode
...

On 15-mai-12, at 22:58, Johan Alwall wrote:

> Hello Olivier,
>
> A comment: The possibility to give commands as command line
> arguments is very close to perfect, but not quite:
> bin/madevent "set automatic_html_opening False;generate_events -f"
> gives:
> ERROR: set automatic_html_opening False;generate_events -f not a
> valid command. Please retry
>
> The same line works perfectly when I give it using echo.
>
> Shouldn't this work? It should be easy to make it work too right?
>
> Cheers,
> Johan
> --
> https://code.launchpad.net/~maddevelopers/madgraph5/1.4.6/+merge/
> 105385
> You proposed lp:~maddevelopers/madgraph5/1.4.6 for merging.

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

Hi Johan,

I just understand why I didn't produce the same error as you.
You add " " to the command which is indeed not a valid command,
those are automatically removed by the echo (explaining why this work
with echo)
The correct solution is to echap the semi-column.

Cheers,

Olivier

On 15-mai-12, at 23:34, Olivier Mattelaer wrote:

> Hi Johan,
>
> I'm surprised about the error message, I was more expecting an error
> of the type:
> -bash: generate_events: command not found
> since the ';' should be interpreted by bash as a end of line separator
> by bash in itself.
>
> I just test it on my computer and in fact I have the above error.
>
> So if you want to implement test for your computer, please do it, but
> very careful since this is not working
> on all machine,
>
> Cheers,
>
> Olivier
>
> PS: One solution (working on my computer)
> is to echap the ;
>
> [PROC_sm_0]$ ./bin/madevent set automatic_html_opening False\;
> generate_events -f
> Running MG5 in debug mode
> ...
>
>
> On 15-mai-12, at 22:58, Johan Alwall wrote:
>
>> Hello Olivier,
>>
>> A comment: The possibility to give commands as command line
>> arguments is very close to perfect, but not quite:
>> bin/madevent "set automatic_html_opening False;generate_events -f"
>> gives:
>> ERROR: set automatic_html_opening False;generate_events -f not a
>> valid command. Please retry
>>
>> The same line works perfectly when I give it using echo.
>>
>> Shouldn't this work? It should be easy to make it work too right?
>>
>> Cheers,
>> Johan
>> --
>> https://code.launchpad.net/~maddevelopers/madgraph5/1.4.6/+merge/
>> 105385
>> You proposed lp:~maddevelopers/madgraph5/1.4.6 for merging.
>
>
> --
> https://code.launchpad.net/~maddevelopers/madgraph5/1.4.6/+merge/
> 105385
> You proposed lp:~maddevelopers/madgraph5/1.4.6 for merging.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'Template/Cards/run_card.dat'
2--- Template/Cards/run_card.dat 2012-03-20 03:12:06 +0000
3+++ Template/Cards/run_card.dat 2012-05-16 04:17:21 +0000
4@@ -195,6 +195,17 @@
5 1d5 = ptj4max ! maximum pt for the fourth jet in pt
6 0 = cutuse ! reject event if fails any (0) / all (1) jet pt cuts
7 #*********************************************************************
8+# Control the pt's of leptons sorted by pt *
9+#*********************************************************************
10+ 0 = ptl1min ! minimum pt for the leading lepton in pt
11+ 0 = ptl2min ! minimum pt for the second lepton in pt
12+ 0 = ptl3min ! minimum pt for the third lepton in pt
13+ 0 = ptl4min ! minimum pt for the fourth lepton in pt
14+ 1d5 = ptl1max ! maximum pt for the leading lepton in pt
15+ 1d5 = ptl2max ! maximum pt for the second lepton in pt
16+ 1d5 = ptl3max ! maximum pt for the third lepton in pt
17+ 1d5 = ptl4max ! maximum pt for the fourth lepton in pt
18+#*********************************************************************
19 # Control the Ht(k)=Sum of k leading jets *
20 #*********************************************************************
21 0 = htjmin ! minimum jet HT=Sum(jet pt)
22
23=== modified file 'Template/README'
24--- Template/README 2012-03-24 03:06:44 +0000
25+++ Template/README 2012-05-16 04:17:21 +0000
26@@ -1,9 +1,8 @@
27 MadGraph/MadEvent 5
28-By Fabio Maltoni, Tim Stelzer and the CP3 development team
29+By Johan Alwall, Michel Herquet, Fabio Maltoni, Olivier Mattelaer and Tim Stelzer
30
31 http://madgraph.phys.ucl.ac.be/
32 http://madgraph.hep.uiuc.edu/
33-http://madgraph.roma2.infn.it/
34
35 Information on the process to be generated is found in the file
36 index.html in this directory, which should be viewed using your web
37@@ -11,8 +10,14 @@
38 process. Please refer to the README file one directory above this
39 (MadGraph5_vx_x_x/) for instructions on how to generate a process.
40
41+This README includes information on how
42+A) generate events
43+B) how to run in cluster/multi-core mode
44+C) how to launch sequential run (called multi-run)
45+D) How to launch Pythia/PGS/Delphes
46+E) How to prevent automatic opening of html pages
47
48-To generate events:
49+A) To generate events:
50 -------------------
51
52 1) Specify the model parameters. The model parameters include masses
53@@ -32,7 +37,7 @@
54 example file.
55 **Warning!** For several reasons, avoid running more than 100,000
56 events per run. Instead perform several runs to reach the luminosity
57-you need, e.g. using the bin/multi_run script. Subsequent runs
58+you need, e.g. using the multi_run describe below. Subsequent runs
59 automatically update the random seed, so the results from different
60 runs are statistically independent.
61
62@@ -42,17 +47,27 @@
63 4) Follow the generation and look at the results in the file
64 HTML/crossx.html, using your web browser.
65
66-5) If you want to run Pythia and/or PGS/Delphes on the events,
67-download the Pythia/PGS package (and Delphes) and untar one directory
68-above this (the MadGraph5 directory) and run make. Make sure the cards
69-pythia_card.dat and pgs_card.dat are present in the Cards/ directory.
70-If this is the case, Pythia and PGS will automatically be run by
71-generate_events, or, for an existing run, use bin/run_pythia and
72-bin/run_pgs.
73-
74-
75-Running in cluster or multicore mode:
76--------------------------------------
77+5) If you want to run Pythia and/or PGS/Delphes on the events.
78+You first need to install it. For this launch MG5 ($MG5PATH/bin/mg5)
79+and type `install pythia-pgs`/ `install Delphes`.
80+If they are detected, the first question asked when launching ./bin/generate_events
81+should be something like:
82+Which programs do you want to run?
83+ 0 / auto : running existing card
84+ 1 / parton : Madevent
85+ 2 / pythia : MadEvent + Pythia.
86+ 3 / pgs : MadEvent + Pythia + PGS.
87+ [0, 1, 2, 3, auto, parton, pythia, pgs][20s to answer]
88+if this is not that means that you need to specify the path of the new program
89+in the file Cards/me5_configuration.txt . By default they are
90+installed in the MG5 directory.
91+
92+If you need to run one of those programs on some events which are already generated
93+please see instructions below.
94+
95+
96+B) Running in cluster or multicore mode:
97+----------------------------------------
98
99 In order to automatically run in cluster or multicore mode, please set
100 the flag run_mode in the Cards/me5_configuration.txt file (or in the
101@@ -65,4 +80,55 @@
102 You can also specify the cluster type (for cluster mode) or your
103 preferred number of CPUs (for multicore mode - note that by default,
104 the maximum number of cores is used) by setting cluster_type and
105-nb_core.
106\ No newline at end of file
107+nb_core.
108+
109+
110+C) Launch sequential runs for generation of large number of events:
111+-------------------------------------------------------------------
112+
113+For various reason, we recommend not to generate more than 100k events
114+per run. In order to simplify generating large numbers of events,
115+we have created a special command 'multi_run', which is equivalent to
116+running generate_events multiple times (ensuring that the random seed is
117+different for each run), and also automatically combines the resulting
118+lhe files into a single file.
119+This command can be launched via the madevent user interface
120+./bin/madevent using the following command:
121+multi_run NBRUN [RUN_NAME] [options]
122+For more information about this command (valid options), you can type
123+`help multi_run` inside the interface.
124+
125+Note that you can also launch a command whithout entering the interactive mode:
126+./bin/madevent multi_run NBRUN
127+
128+
129+D) Launching pythia/pgs/delphes on a (previously) generated sample:
130+-------------------------------------------------------------------
131+
132+In this section, I will presupose that the corresponding package is
133+already installed and configured properly. (See section how to generate
134+events if this is not the case)
135+
136+In order to launch pythia/pgs/delphes on a sample, you need first to
137+launch the interactive session of madevent `./bin/madevent`
138+and then you can enter of the following command
139+pythia RUN [--run_options]
140+pgs RUN [--run_options]
141+delphes RUN [--run_options]
142+where RUN is the run_name of the run. One of the convenient options is
143+--tag=XXXX
144+which allow to specify the tag name in case of multiple runs with
145+the same program. Note that by default, a unique run tag is generated
146+for each time you run.
147+
148+E) How to prevent automatic opening of the crossx.html page:
149+------------------------------------------------------------
150+
151+Edit the file ./Cards/me5_configuration.txt and set
152+the option automatic_html_opening to `False`.
153+You can also edit the MG5 configuration card
154+input/mg5_configuration.txt
155+in order to have this value on False by default for all subsequently
156+generated processes.
157+
158+
159
160=== modified file 'Template/Source/cuts.inc'
161--- Template/Source/cuts.inc 2011-06-02 20:40:32 +0000
162+++ Template/Source/cuts.inc 2012-05-16 04:17:21 +0000
163@@ -29,6 +29,8 @@
164 REAL*8 cutuse
165 REAL*8 ptj1min,ptj2min,ptj3min,ptj4min
166 REAL*8 ptj1max,ptj2max,ptj3max,ptj4max
167+ REAL*8 ptl1min,ptl2min,ptl3min,ptl4min
168+ REAL*8 ptl1max,ptl2max,ptl3max,ptl4max
169 REAL*8 ht2min,ht3min,ht4min
170 REAL*8 ht2max,ht3max,ht4max
171 REAL*8 htjmin,htjmax,ihtmin,ihtmax
172@@ -48,6 +50,10 @@
173 & ptj2min,ptj2max,
174 & ptj3min,ptj3max,
175 & ptj4min,ptj4max,
176+ & ptl1min,ptl1max,
177+ & ptl2min,ptl2max,
178+ & ptl3min,ptl3max,
179+ & ptl4min,ptl4max,
180 & cutuse,
181 & ht2min,ht3min,ht4min,
182 & ht2max,ht3max,ht4max,
183
184=== modified file 'Template/Source/setrun.f'
185--- Template/Source/setrun.f 2011-10-05 16:27:00 +0000
186+++ Template/Source/setrun.f 2012-05-16 04:17:21 +0000
187@@ -264,6 +264,19 @@
188 call get_real (npara,param,value,"cutuse",cutuse,0d0)
189
190 c*********************************************************************
191+c Check the pt's of leptons sorted by pt *
192+c*********************************************************************
193+
194+ call get_real (npara,param,value,"ptl1min",ptl1min,0d0)
195+ call get_real (npara,param,value,"ptl1max",ptl1max,1d5)
196+ call get_real (npara,param,value,"ptl2min",ptl2min,0d0)
197+ call get_real (npara,param,value,"ptl2max",ptl2max,1d5)
198+ call get_real (npara,param,value,"ptl3min",ptl3min,0d0)
199+ call get_real (npara,param,value,"ptl3max",ptl3max,1d5)
200+ call get_real (npara,param,value,"ptl4min",ptl4min,0d0)
201+ call get_real (npara,param,value,"ptl4max",ptl4max,1d5)
202+
203+c*********************************************************************
204 c Check Ht *
205 c*********************************************************************
206
207
208=== modified file 'Template/SubProcesses/addmothers.f'
209--- Template/SubProcesses/addmothers.f 2012-02-08 08:52:30 +0000
210+++ Template/SubProcesses/addmothers.f 2012-05-16 04:17:21 +0000
211@@ -29,7 +29,7 @@
212 c Variables for combination of color indices (including multipart. vert)
213 integer maxcolmp
214 parameter(maxcolmp=20)
215- integer ncolmp,icolmp(2,maxcolmp)
216+ integer ncolmp,icolmp(2,maxcolmp),is_colors(2,nincoming)
217
218 double precision ZERO
219 parameter (ZERO=0d0)
220@@ -145,7 +145,19 @@
221
222 c Store original maxcolor to know if we have epsilon vertices
223 maxorg=maxcolor
224-
225+c Keep track of IS colors that go through to final state
226+c (since we shouldn't replace pop-up indices with those)
227+ do i=1,nincoming
228+ do j=1,2
229+ is_colors(j,i)=0
230+ do k=3,nexternal
231+ if (iabs(icolalt(j,i)).eq.iabs(icolalt(j,k))) then
232+c This color is going through to FS
233+ is_colors(j,i)=iabs(icolalt(j,i))
234+ endif
235+ enddo
236+ enddo
237+ enddo
238 c
239 c Get mother information from chosen graph
240 c
241@@ -212,7 +224,7 @@
242 c print *,'t-channel: ',i,ida(1),ida(2),mo_color
243 c print *,'colors: ',((icolmp(j,k),j=1,2),k=1,ncolmp)
244 maxcolor=fix_tchannel_color(mo_color,maxcolor,
245- $ ncolmp,icolmp,i,icolalt)
246+ $ ncolmp,icolmp,i,icolalt,is_colors)
247 tchannel=.true.
248 cycle
249 else
250@@ -264,17 +276,23 @@
251 c print *,'s-channel: ',i,mo_color,ida(1),ida(2)
252 c print *,'colors: ',((icolmp(j,k),j=1,2),k=1,ncolmp)
253 if(mo_color.eq.1) then ! color singlet
254- maxcolor=elim_indices(0,0,ncolmp,icolmp,i,icolalt,maxcolor)
255+ maxcolor=elim_indices(0,0,ncolmp,icolmp,i,icolalt,
256+ $ is_colors,maxcolor)
257 elseif(mo_color.eq.-3) then ! color anti-triplet
258- maxcolor=elim_indices(0,1,ncolmp,icolmp,i,icolalt,maxcolor)
259+ maxcolor=elim_indices(0,1,ncolmp,icolmp,i,icolalt,
260+ $ is_colors,maxcolor)
261 elseif(mo_color.eq.3) then ! color triplet
262- maxcolor=elim_indices(1,0,ncolmp,icolmp,i,icolalt,maxcolor)
263+ maxcolor=elim_indices(1,0,ncolmp,icolmp,i,icolalt,
264+ $ is_colors,maxcolor)
265 elseif(mo_color.eq.-6) then ! color anti-sextet
266- maxcolor=elim_indices(0,2,ncolmp,icolmp,i,icolalt,maxcolor)
267+ maxcolor=elim_indices(0,2,ncolmp,icolmp,i,icolalt,
268+ $ is_colors,maxcolor)
269 elseif(mo_color.eq.6) then ! color sextet
270- maxcolor=elim_indices(2,0,ncolmp,icolmp,i,icolalt,maxcolor)
271+ maxcolor=elim_indices(2,0,ncolmp,icolmp,i,icolalt,
272+ $ is_colors,maxcolor)
273 elseif(mo_color.eq.8) then ! color octet
274- maxcolor=elim_indices(1,1,ncolmp,icolmp,i,icolalt,maxcolor)
275+ maxcolor=elim_indices(1,1,ncolmp,icolmp,i,icolalt,
276+ $ is_colors,maxcolor)
277 else ! 2 indicates multipart. vertex
278 da_color(1) = get_color(jpart(1,ida(1)))
279 da_color(2) = get_color(jpart(1,ida(2)))
280@@ -450,7 +468,7 @@
281
282 c********************************************************************
283 function fix_tchannel_color(mo_color,maxcolor,ncolmp,icolmp,ires,
284- $ icol)
285+ $ icol,is_colors)
286 c********************************************************************
287 c Successively eliminate identical pairwise color indices from the
288 c icolmp list, until only (max) one triplet and one antitriplet remains
289@@ -461,6 +479,7 @@
290 integer fix_tchannel_color
291 integer mo_color,maxcolor,ncolmp,icolmp(2,*)
292 integer ires,icol(2,-nexternal+2:2*nexternal-3)
293+ integer is_colors(2,nincoming)
294 integer i,j,i3,i3bar,max3,max3bar,min3,min3bar,maxcol,mincol
295
296 c Successively eliminate color indices in pairs until only the wanted
297@@ -478,26 +497,18 @@
298 i3bar=0
299 icol(1,ires)=0
300 icol(2,ires)=0
301- min3=1000
302- max3=0
303- min3bar=1000
304- max3bar=0
305 do i=1,ncolmp
306 if(icolmp(1,i).gt.0)then
307 i3=i3+1
308 c color for t-channels needs to be reversed
309 if(i3.eq.1) icol(2,ires)=icolmp(1,i)
310 if(i3.eq.2) icol(1,ires)=-icolmp(1,i)
311- if(icolmp(1,i).gt.max3) max3=icolmp(1,i)
312- if(icolmp(1,i).lt.min3) min3=icolmp(1,i)
313 endif
314 if(icolmp(2,i).gt.0)then
315 i3bar=i3bar+1
316 c color for t-channels needs to be reversed
317 if(i3bar.eq.1) icol(1,ires)=icolmp(2,i)
318 if(i3bar.eq.2) icol(2,ires)=-icolmp(2,i)
319- if(icolmp(2,i).gt.max3bar) max3bar=icolmp(2,i)
320- if(icolmp(2,i).lt.min3bar) min3bar=icolmp(2,i)
321 endif
322 enddo
323
324@@ -513,7 +524,10 @@
325 if(mo_color.eq.8.and.i3.eq.1.and.i3bar.eq.1) return
326
327 c Make sure that max and min don't come from the same octet
328- call clean_max_min(icolmp,ncolmp,max3,min3,max3bar,min3bar,i3,i3bar)
329+ call find_max_min(icolmp,ncolmp,max3,min3,max3bar,min3bar,
330+ $ i3,i3bar,is_colors)
331+c print *,'After finding: ',ncolmp,((icolmp(j,i),j=1,2),i=1,ncolmp)
332+c print *,'mo_color = ',mo_color
333
334 if(mo_color.le.1.and.i3-i3bar.eq.2.or.
335 $ mo_color.le.1.and.i3bar-i3.eq.2.or.
336@@ -533,6 +547,17 @@
337 enddo
338 c print *,'Replaced ',maxcol,' by ',mincol
339 elseif(mo_color.le.1.and.i3.eq.2.and.i3bar.eq.2) then
340+c Ensure that max > min
341+ if(max3bar.lt.min3)then
342+ i=min3
343+ min3=max3bar
344+ max3bar=i
345+ endif
346+ if(max3.lt.min3bar)then
347+ i=min3bar
348+ min3bar=max3
349+ max3=i
350+ endif
351 c Replace the maximum indices with the minimum ones everywhere
352 do i=ires+1,-1
353 do j=1,2
354@@ -597,7 +622,8 @@
355 end
356
357 c*******************************************************************
358- function elim_indices(n3,n3bar,ncolmp,icolmp,ires,icol,maxcolor)
359+ function elim_indices(n3,n3bar,ncolmp,icolmp,ires,icol,
360+ $ is_colors,maxcolor)
361 c*******************************************************************
362 c Successively eliminate identical pairwise color indices from the
363 c icolmp list, until only the wanted indices remain
364@@ -614,6 +640,7 @@
365 integer elim_indices
366 integer n3,n3bar,ncolmp,icolmp(2,*),maxcolor
367 integer ires,icol(2,-nexternal+2:2*nexternal-3)
368+ integer is_colors(2,nincoming)
369 integer i,j,i3,i3bar
370
371 c Successively eliminate color indices in pairs until only the wanted
372@@ -669,7 +696,8 @@
373 $ n3.eq.1.and.n3bar.eq.1.and.i3-i3bar.eq.0.or.
374 $ n3.eq.0.and.n3bar.eq.0.and.i3-i3bar.eq.0)then
375 c We have a previous epsilon which gives the wrong pop-up index
376- call fix_s_color_indices(n3,n3bar,i3,i3bar,ncolmp,icolmp,ires,icol)
377+ call fix_s_color_indices(n3,n3bar,i3,i3bar,ncolmp,icolmp,
378+ $ ires,icol,is_colors)
379 else
380 c Don't know how to deal with this
381 call write_error(1001,n3,n3bar)
382@@ -683,7 +711,7 @@
383
384 c*******************************************************************
385 subroutine fix_s_color_indices(n3,n3bar,i3,i3bar,ncolmp,icolmp,
386- $ ires,icol)
387+ $ ires,icol,is_colors)
388 c*******************************************************************
389 c
390 c Fix color flow if some particle has got the wrong pop-up color
391@@ -694,37 +722,27 @@
392 include 'nexternal.inc'
393 integer n3,n3bar,ncolmp,icolmp(2,*),maxcolor
394 integer ires,icol(2,-nexternal+2:2*nexternal-3)
395+ integer is_colors(2,nincoming)
396 integer i,j,i3,i3bar
397 integer max_n3,max_n3bar,min_n3,min_n3bar,maxcol,mincol
398
399- max_n3=0
400- max_n3bar=0
401- min_n3=1000
402- min_n3bar=1000
403- do i=1,ncolmp
404- if(icolmp(1,i).gt.max_n3)
405- $ max_n3=icolmp(1,i)
406- if(icolmp(2,i).gt.max_n3bar)
407- $ max_n3bar=icolmp(2,i)
408- if(icolmp(1,i).gt.0.and.icolmp(1,i).lt.min_n3)
409- $ min_n3=icolmp(1,i)
410- if(icolmp(2,i).gt.0.and.icolmp(2,i).lt.min_n3bar)
411- $ min_n3bar=icolmp(2,i)
412- enddo
413-
414 icol(1,ires)=0
415 icol(2,ires)=0
416
417+c print *,'Colors: ',ncolmp,((icolmp(j,i),j=1,2),i=1,ncolmp)
418+c print *,'n3,n3bar,i3,i3bar: ',n3,n3bar,i3,i3bar
419+
420 c Make sure that max and min don't come from the same octet
421- call clean_max_min(icolmp,ncolmp,max_n3,min_n3,
422- $ max_n3bar,min_n3bar,i3,i3bar)
423+ call find_max_min(icolmp,ncolmp,max_n3,min_n3,
424+ $ max_n3bar,min_n3bar,i3,i3bar,is_colors)
425+c print *,'max3,min3bar,min3,max3bar: ',max_n3,min_n3bar,min_n3,max_n3bar
426
427 if(n3.eq.1.and.n3bar.eq.0.and.i3-i3bar.eq.n3.or.
428 $ n3bar.eq.1.and.n3.eq.0.and.i3bar-i3.eq.n3bar.or.
429 $ n3bar.eq.1.and.n3.eq.1.and.i3bar-i3.eq.0.or.
430 $ n3bar.eq.0.and.n3.eq.0.and.i3bar-i3.eq.0)then
431 c Replace the highest 3bar-index with the lowest 3-index,
432-c and vice versa
433+c or vice versa
434 maxcol=max(max_n3,max_n3bar)
435 if(maxcol.eq.max_n3) then
436 mincol=min_n3bar
437@@ -754,73 +772,117 @@
438 end
439
440 c*******************************************************************************
441- subroutine clean_max_min(icolmp,ncolmp,max3,min3,max3bar,min3bar,i3,i3bar)
442+ subroutine find_max_min(icolmp,ncolmp,max3,min3,max3bar,min3bar,
443+ $ i3,i3bar,is_colors)
444 c*******************************************************************************
445 implicit none
446+ include 'nexternal.inc'
447 integer ncolmp,icolmp(2,*)
448- integer i,j,max3,max3bar,min3,min3bar,i3,i3bar
449-
450-c Make sure that max and min don't come from the same octet
451+ integer is_colors(2,nincoming)
452+ integer i,j,k,max3,max3bar,min3,min3bar,i3,i3bar,i3now,i3barnow
453+ integer allpairs(2,nexternal),npairs,maxcol,mincol
454+
455+ i3now=i3
456+ i3barnow=i3bar
457+
458+c Create all possible pairs (3,3bar) that
459+c 1. come from different octets, 2. are different,
460+c 3. don't contain any color lines passing through the event
461+ npairs = 0
462+ do 20 i=1,ncolmp
463+ if(icolmp(1,i).eq.0) goto 20
464+ do k=1,nincoming
465+ if(icolmp(1,i).eq.is_colors(1,k)) goto 20
466+ enddo
467+ do 10 j=1,ncolmp
468+ if(i.eq.j.or.icolmp(2,j).eq.0.or.
469+ $ icolmp(1,i).eq.icolmp(2,j)) goto 10
470+ do k=1,nincoming
471+ if(icolmp(2,j).eq.is_colors(2,k)) goto 10
472+ enddo
473+ npairs=npairs+1
474+ allpairs(1,npairs)=icolmp(1,i)
475+ allpairs(2,npairs)=icolmp(2,j)
476+ 10 enddo
477+ 20 enddo
478+
479+c print *,'is_colors: ',((is_colors(i,j),i=1,2),j=1,nincoming)
480+c print *,'pairs: ',((allpairs(i,j),i=1,2),j=1,npairs)
481+
482+c Find the pairs with maximum 3 and 3bar
483+ min3=1000
484+ min3bar=1000
485+ max3=0
486+ max3bar=0
487+ do i=1,npairs
488+ if(allpairs(1,i).gt.max3.and.
489+ $ (allpairs(2,i).lt.max3bar.or.
490+ $ allpairs(1,i).gt.allpairs(2,i)))then
491+ max3=allpairs(1,i)
492+ min3bar=allpairs(2,i)
493+ else if(allpairs(2,i).gt.max3bar.and.
494+ $ (allpairs(1,i).lt.max3.or.
495+ $ allpairs(2,i).gt.allpairs(1,i)))then
496+ max3bar=allpairs(2,i)
497+ min3=allpairs(1,i)
498+ endif
499+ enddo
500+
501+c Find "maximum" pairs with minimum 3 and 3bar
502+ do i=1,npairs
503+ if(allpairs(1,i).eq.max3.and.
504+ $ allpairs(2,i).lt.min3bar.and.
505+ $ allpairs(2,i).ne.max3bar)
506+ $ min3bar=allpairs(2,i)
507+ if(allpairs(2,i).eq.max3bar.and.
508+ $ allpairs(1,i).lt.min3.and.
509+ $ allpairs(1,i).ne.max3)
510+ $ min3=allpairs(1,i)
511+ enddo
512+
513+ if (max3.gt.0.and.max3bar.gt.0) then
514+c We have found our two pairs, so we're done
515+ return
516+ endif
517+
518+ if(max3.gt.0.or.max3bar.gt.0)then
519+ i3now=i3now-1
520+ i3barnow=i3barnow-1
521+ endif
522+
523+c Find pair for non-maximum (where we allow all colors)
524+ maxcol=max(max3,max3bar)
525+ if(maxcol.eq.max3) then
526+ mincol=min3bar
527+ else
528+ mincol=min3
529+ endif
530+
531+ npairs=0
532 do i=1,ncolmp
533- if(icolmp(1,i).eq.max3.and.icolmp(2,i).eq.min3bar)then
534- min3bar=1000
535- do j=1,ncolmp
536- if(j.eq.i) cycle
537- if(icolmp(2,j).lt.min3bar) min3bar=icolmp(2,j)
538- enddo
539- endif
540- if(icolmp(2,i).eq.max3bar.and.icolmp(1,i).eq.min3)then
541- min3=1000
542- do j=1,ncolmp
543- if(j.eq.i) cycle
544- if(icolmp(1,j).lt.min3) min3=icolmp(1,j)
545- enddo
546- endif
547+ if(icolmp(1,i).eq.0.and.i3now.gt.0) cycle
548+ if(icolmp(1,i).eq.maxcol.or.icolmp(1,i).eq.mincol)
549+ $ cycle
550+ do j=1,ncolmp
551+ if(icolmp(2,j).eq.0.and.i3barnow.gt.0) cycle
552+ if(i.eq.j.or.icolmp(1,i).eq.icolmp(2,j)) cycle
553+ if(icolmp(2,j).eq.maxcol.or.icolmp(2,j).eq.mincol)
554+ $ cycle
555+ npairs=npairs+1
556+ allpairs(1,npairs)=icolmp(1,i)
557+ allpairs(2,npairs)=icolmp(2,j)
558+ enddo
559 enddo
560-
561-c ...and that max and min are different
562- if(i3.gt.1.and.max3.eq.min3.or.i3bar.gt.1.and.max3bar.eq.min3bar)then
563- if(max3.gt.max3bar)then
564-c Need to change min3, while still ensuring that max3bar is ok
565- max3bar=0
566- min3=1000
567- do i=1,ncolmp
568- if(icolmp(2,i).gt.max3bar.and.icolmp(2,i).ne.min3bar)
569- $ max3bar=icolmp(2,i)
570- if(icolmp(1,i).lt.min3.and.icolmp(1,i).ne.max3)
571- $ min3=icolmp(1,i)
572- enddo
573-c Make sure that max3bar and min3 don't come from the same octet
574- do i=1,ncolmp
575- if(icolmp(2,i).eq.max3bar.and.icolmp(1,i).eq.min3)then
576- min3=1000
577- do j=1,ncolmp
578- if(j.eq.i.or.icolmp(1,j).eq.max3) cycle
579- if(icolmp(1,j).lt.min3) min3=icolmp(1,j)
580- enddo
581- endif
582- enddo
583+ if(npairs.ge.1)then
584+ if(maxcol.eq.max3)then
585+ min3=allpairs(1,1)
586+ max3bar=allpairs(2,1)
587 else
588-c Need to change min3bar, while still ensuring that max3 is ok
589- max3=0
590- min3bar=1000
591- do i=1,ncolmp
592- if(icolmp(1,i).gt.max3.and.icolmp(1,i).ne.min3)
593- $ max3=icolmp(1,i)
594- if(icolmp(2,i).lt.min3bar.and.icolmp(2,i).ne.max3bar)
595- $ min3bar=icolmp(2,i)
596- enddo
597-c Make sure that max3 and min3bar don't come from the same octet
598- do i=1,ncolmp
599- if(icolmp(1,i).eq.max3.and.icolmp(2,i).eq.min3bar)then
600- min3bar=1000
601- do j=1,ncolmp
602- if(j.eq.i.or.icolmp(2,j).eq.max3bar) cycle
603- if(icolmp(2,j).lt.min3bar) min3bar=icolmp(2,j)
604- enddo
605- endif
606- enddo
607+ max3=allpairs(1,1)
608+ min3bar=allpairs(2,1)
609 endif
610 endif
611+
612+c print *,'allpairs: ',((allpairs(i,j),i=1,2),j=1,npairs)
613
614 end
615
616=== modified file 'Template/SubProcesses/cuts.f'
617--- Template/SubProcesses/cuts.f 2011-12-13 16:49:59 +0000
618+++ Template/SubProcesses/cuts.f 2012-05-16 04:17:21 +0000
619@@ -51,7 +51,7 @@
620 C
621 LOGICAL FIRSTTIME,FIRSTTIME2,pass_bw,notgood,good,foundheavy
622 LOGICAL DEBUG
623- integer i,j,njets,nheavyjets,hardj1,hardj2
624+ integer i,j,njets,nheavyjets,nleptons,hardj1,hardj2
625 REAL*8 XVAR,ptmax1,ptmax2,htj,tmp,inclht
626 real*8 ptemp(0:3), ptemp2(0:3)
627 character*20 formstr
628@@ -74,6 +74,7 @@
629
630 double precision ptjet(nexternal)
631 double precision ptheavyjet(nexternal)
632+ double precision ptlepton(nexternal)
633 double precision temp
634
635 double precision etmin(nincoming+1:nexternal),etamax(nincoming+1:nexternal)
636@@ -93,6 +94,9 @@
637 logical jetor
638 common/to_jet_cuts/ ptjmin4,ptjmax4,htjmin4,htjmax4,jetor
639
640+ double precision ptlmin4(4),ptlmax4(4)
641+ common/to_lepton_cuts/ ptlmin4,ptlmax4
642+
643 c
644 c Special cuts
645 c
646@@ -545,7 +549,66 @@
647 passcuts=.false.
648 return
649 endif
650-
651+
652+C
653+C maximal and minimal pt of the leptons sorted by pt
654+c
655+ nleptons=0
656+
657+ if(ptl1min.gt.0.or.ptl2min.gt.0.or.ptl3min.gt.0.or.ptl4min.gt.0.or.
658+ $ ptl1max.lt.1d5.or.ptl2max.lt.1d5.or.
659+ $ ptl3max.lt.1d5.or.ptl4max.lt.1d5) then
660+
661+c - fill ptlepton with the pt's of the leptons.
662+ do i=nincoming+1,nexternal
663+ if(is_a_l(i)) then
664+ nleptons=nleptons+1
665+ ptlepton(nleptons)=pt(p(0,i))
666+ endif
667+ enddo
668+ if(debug) write (*,*) 'not yet ordered ',njets,' ',ptjet
669+
670+c - check existance of leptons if lepton cuts are on
671+ if(nleptons.lt.1.and.ptl1min.gt.0.or.
672+ $ nleptons.lt.2.and.ptl2min.gt.0.or.
673+ $ nleptons.lt.3.and.ptl3min.gt.0.or.
674+ $ nleptons.lt.4.and.ptl4min.gt.0)then
675+ if(debug) write (*,*) i, ' too few leptons -> fails'
676+ passcuts=.false.
677+ return
678+ endif
679+
680+c - sort lepton pts
681+ do i=1,nleptons-1
682+ do j=i+1,nleptons
683+ if(ptlepton(j).gt.ptlepton(i)) then
684+ temp=ptlepton(i)
685+ ptlepton(i)=ptlepton(j)
686+ ptlepton(j)=temp
687+ endif
688+ enddo
689+ enddo
690+ if(debug) write (*,*) 'ordered ',nleptons,' ',ptlepton
691+
692+ if(nleptons.gt.0) then
693+
694+ notgood = .false.
695+ do i=1,nleptons
696+ if(debug) write (*,*) i,ptlepton(i), ' ',ptlmin4(min(i,4)),':',ptlmax4(min(i,4))
697+c--- if one of the leptons does not pass, the event is rejected
698+ notgood=notgood.or.(ptlepton(i).gt.ptlmax4(min(i,4))).or.
699+ $ (ptlepton(i).lt.ptlmin4(min(i,4)))
700+ if(debug) write (*,*) i,' notgood total:', notgood
701+ enddo
702+
703+
704+ if (notgood) then
705+ if(debug) write (*,*) i, ' multiple pt -> fails'
706+ passcuts=.false.
707+ return
708+ endif
709+ endif
710+ endif
711 C>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
712 C SPECIAL CUTS
713 C<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
714
715=== modified file 'Template/SubProcesses/myamp.f'
716--- Template/SubProcesses/myamp.f 2011-10-10 07:34:37 +0000
717+++ Template/SubProcesses/myamp.f 2012-05-16 04:17:21 +0000
718@@ -566,6 +566,10 @@
719 xo = max(xo, ht4min**2/stot)
720 xo = max(xo, misset**2/stot)
721 xo = max(xo, ptllmin**2/stot)
722+ xo = max(xo, ptl1min**2/stot)
723+ xo = max(xo, ptl2min**2/stot)
724+ xo = max(xo, ptl3min**2/stot)
725+ xo = max(xo, ptl4min**2/stot)
726 if (swidth(i).eq.0.and.xo.eq.1d0/stot) then
727 write(*,*) 'Warning: No minimum found for integration'
728 write(*,*) ' Setting minimum to ',1d0/stot
729
730=== modified file 'Template/SubProcesses/setcuts.f'
731--- Template/SubProcesses/setcuts.f 2012-02-24 08:51:01 +0000
732+++ Template/SubProcesses/setcuts.f 2012-05-16 04:17:21 +0000
733@@ -59,6 +59,9 @@
734 logical jetor
735 common/to_jet_cuts/ ptjmin4,ptjmax4,htjmin4,htjmax4,jetor
736
737+ double precision ptlmin4(4),ptlmax4(4)
738+ common/to_lepton_cuts/ ptlmin4,ptlmax4
739+
740 double precision xqcutij(nexternal,nexternal),xqcuti(nexternal)
741 common/to_xqcuts/xqcutij,xqcuti
742 c
743@@ -413,6 +416,20 @@
744 inclHtmax=ihtmax
745
746 jetor = cutuse.eq.0d0
747+
748+c
749+c EXTRA LEPTON CUTS
750+c
751+ ptlmin4(1)=ptl1min
752+ ptlmin4(2)=ptl2min
753+ ptlmin4(3)=ptl3min
754+ ptlmin4(4)=ptl4min
755+
756+ ptlmax4(1)=ptl1max
757+ ptlmax4(2)=ptl2max
758+ ptlmax4(3)=ptl3max
759+ ptlmax4(4)=ptl4max
760+
761 c
762 c ERROR TRAPS
763 c
764
765=== modified file 'Template/bin/madevent'
766--- Template/bin/madevent 2012-04-19 20:28:42 +0000
767+++ Template/bin/madevent 2012-05-16 04:17:21 +0000
768@@ -33,18 +33,44 @@
769 sys.path.insert(0, root_path)
770
771
772+
773+class MyOptParser(optparse.OptionParser):
774+
775+ class InvalidOption(Exception): pass
776+
777+ def error(self, msg=''):
778+ raise MyOptParser.InvalidOption(msg)
779+
780+
781+
782+
783 # Write out nice usage message if called with -h or --help
784 usage = "usage: %prog [options] [FILE] "
785-parser = optparse.OptionParser(usage=usage)
786+parser = MyOptParser(usage=usage)
787 parser.add_option("-l", "--logging", default='INFO',
788 help="logging level (DEBUG|INFO|WARNING|ERROR|CRITICAL) [%default]")
789-parser.add_option("-f", "--file", default='',
790- help="Use script file FILE")
791 parser.add_option("","--web", action="store_true", default=False, dest='web', \
792 help='force to be in secure mode')
793 parser.add_option("","--debug", action="store_true", default=False, dest='debug', \
794 help='force to launch debug mode')
795-(options, args) = parser.parse_args()
796+parser_error = ''
797+done = False
798+for i in range(len(sys.argv)-1):
799+ try:
800+ (options, args) = parser.parse_args(sys.argv[1:len(sys.argv)-i])
801+ done = True
802+ except MyOptParser.InvalidOption, error:
803+ pass
804+ else:
805+ args += sys.argv[len(sys.argv)-i:]
806+if not done:
807+ # raise correct error:
808+ try:
809+ (options, args) = parser.parse_args()
810+ except MyOptParser.InvalidOption, error:
811+ print error
812+ sys.exit(2)
813+
814 if len(args) == 0:
815 args = ''
816
817@@ -115,25 +141,33 @@
818
819 # Call the cmd interface main loop
820 try:
821- if options.file or args:
822+ if (args and os.path.exists(args[0])):
823 # They are an input file
824- if args:
825- input_file = args[0]
826- else:
827- input_file = options.file
828+ input_file = args[0]
829 if options.web:
830 cmd_line = cmd_interface.MadEventCmd()
831 cmd_line.debug_output = os.path.join(os.path.dirname(input_file),'generation.log')
832 cmd_line.use_rawinput = False
833 cmd_line.run_cmd('import command ' + input_file)
834- cmd_line.run_cmd('quit')
835- sys.exit()
836+ cmd_line.run_cmd('quit')
837 else:
838 cmd_line = cmd_interface.MadEventCmdShell()
839 cmd_line.use_rawinput = False
840 cmd_line.run_cmd('import command ' + input_file)
841 cmd_line.run_cmd('quit')
842- sys.exit()
843+ elif args:
844+ # a single command is provided
845+ cmd_line = cmd_interface.MadEventCmd()
846+ if not hasattr(cmd_line, 'do_%s' % args[0]):
847+ if parser_error:
848+ print parser_error
849+ print 'and %s can not be interpreted as a valid command.' % args[0]
850+ else:
851+ print 'ERROR: %s not a valid command. Please retry' % args[0]
852+ else:
853+ cmd_line.use_rawinput = False
854+ cmd_line.run_cmd(' '.join(args))
855+ cmd_line.run_cmd('quit')
856 else:
857 # Interactive mode
858 if options.web:
859
860=== modified file 'UpdateNotes.txt'
861--- UpdateNotes.txt 2012-04-20 05:12:21 +0000
862+++ UpdateNotes.txt 2012-05-16 04:17:21 +0000
863@@ -1,5 +1,23 @@
864 Update notes for MadGraph 5 (in reverse time order)
865
866+1.4.6 (XX/04/12) JA: Added cuts on lepton pt for each of the 4 hardest leptons
867+ OM: allow bin/madevent script to be feeded by a single line command:
868+ example ./bin/madevent multi_run 10
869+ JA: Added new restriction card for the sm model with massive
870+ muon and electron, and non-zero tau decay width
871+ JA: Ensure assignment of colors to intermediate propagators
872+ works also in fermion flow- and color flow-violating
873+ RPV processes (thanks Brock Tweedie for finding this).
874+ JA: Fix crash for certain fermion flow violating decay chains
875+ (introduced in v. 1.3.27) (again thanks to Brock Tweedie).
876+ JA: Fix crash for decay chains with multiple decays involving
877+ the same particles (thanks Steve Blanchet for reporting)
878+ JA+OM: Fix crash for Pythia8 output with multiparticle vertices
879+ (thanks to Moritz Huck for reporting this.)
880+ OM: Fixing ALOHA output for C++/python.
881+ OM: Fix a crash occuring when trying to create an output on
882+ an existing directory (thanks Celine)
883+
884 1.4.5 (11/04/12) OM: Change the seed automatically in multi_run. (Even if the seed
885 was set to a non automatic value in the card.)
886 OM: correct a minor bug #975647 (SLAH convention problem)
887
888=== modified file 'aloha/aloha_writers.py'
889--- aloha/aloha_writers.py 2012-03-07 17:49:58 +0000
890+++ aloha/aloha_writers.py 2012-05-16 04:17:21 +0000
891@@ -1013,11 +1013,11 @@
892 else:
893 main = '%(spin)s%(id)d' % \
894 {'spin': self.particles[self.offshell -1],
895- 'id': self.offshell}
896+ 'id': self.outgoing}
897 call_arg = '%(args)s, %(COUP)s, M%(id)d, W%(id)d, %(LAST)s' % \
898 {'args': ', '.join(self.calllist['CallList']),
899 'COUP':'COUP%d',
900- 'id': self.offshell,
901+ 'id': self.outgoing,
902 'LAST': '%s'}
903
904 # make the first call
905@@ -1087,7 +1087,7 @@
906
907 def write_combined(self, lor_names, mode='self', offshell=None, **opt):
908 """Write the .h and .cc files associated to the combined file"""
909-
910+
911 # Set some usefull command
912 if offshell is None:
913 offshell = self.offshell
914
915=== modified file 'aloha/create_aloha.py'
916--- aloha/create_aloha.py 2012-03-15 15:22:31 +0000
917+++ aloha/create_aloha.py 2012-05-16 04:17:21 +0000
918@@ -499,8 +499,11 @@
919 if lorentz.name in self.multiple_lor:
920 for m in self.multiple_lor[lorentz.name]:
921 for outgoing in range(len(lorentz.spins)+1):
922- self[(conjg_builder.name, outgoing)].add_combine(m)
923-
924+ realname = conjg_builder.name + ''.join(['C%s' % pair for pair in conjg_builder.conjg])
925+ try:
926+ self[(realname, outgoing)].add_combine(m)
927+ except Exception,error:
928+ self[(realname, self.symmetries[lorentz.name][outgoing])].add_combine(m)
929
930
931 if save:
932@@ -585,6 +588,7 @@
933 #Store the information
934 realname = name + ''.join(wavefunction.tag)
935 self.set(realname, outgoing, wavefunction)
936+
937
938 def compute_aloha_without_kernel(self, builder, symmetry=None, routines=None):
939 """define all the AbstractRoutine linked to a given lorentz structure
940
941=== modified file 'madgraph/VERSION'
942--- madgraph/VERSION 2012-04-20 09:03:43 +0000
943+++ madgraph/VERSION 2012-05-16 04:17:21 +0000
944@@ -1,3 +1,3 @@
945-version = 1.4.5
946-date = 2012-04-20
947+version = 1.4.6
948+date = 2012-04-XX
949
950
951=== modified file 'madgraph/core/helas_objects.py'
952--- madgraph/core/helas_objects.py 2012-03-28 03:42:34 +0000
953+++ madgraph/core/helas_objects.py 2012-05-16 04:17:21 +0000
954@@ -2955,6 +2955,7 @@
955 for i, wf in enumerate(final_decay_wfs):
956 final_decay_wfs[i] = \
957 decay_diag_wfs[decay_diag_wfs.index(wf)]
958+
959 # Remove final wavefunctions from decay_diag_wfs,
960 # since these will be replaced separately by
961 # replace_wavefunctions
962@@ -3075,7 +3076,6 @@
963 final_decay_wfs,
964 diagrams,
965 numbers)
966-
967 # Now that we are done with this set of diagrams, we need
968 # to clean out duplicate wavefunctions (i.e., remove
969 # identical wavefunctions which are already present in
970@@ -3261,7 +3261,7 @@
971 is possible only if there is only one diagram in the decay."""
972
973 for key in old_wf.keys():
974- old_wf.set(key, new_wf.get(key))
975+ old_wf.set(key, new_wf[key])
976
977 def identical_decay_chain_factor(self, decay_chains):
978 """Calculate the denominator factor from identical decay chains"""
979@@ -3552,7 +3552,7 @@
980 """Return a list of (lorentz_name, conjugate, outgoing) with
981 all lorentz structures used by this HelasMatrixElement."""
982
983- return [(tuple(wa.get('lorentz')), tuple(wa.get_conjugate_index()),
984+ return [(tuple(wa.get('lorentz')), tuple(wa.get('conjugate_indices')),
985 wa.find_outgoing_number()) for wa in \
986 self.get_all_wavefunctions() + self.get_all_amplitudes() \
987 if wa.get('interaction_id') != 0]
988
989=== modified file 'madgraph/interface/extended_cmd.py'
990--- madgraph/interface/extended_cmd.py 2012-03-22 04:20:14 +0000
991+++ madgraph/interface/extended_cmd.py 2012-05-16 04:17:21 +0000
992@@ -39,7 +39,8 @@
993 from madgraph import MG5DIR
994 MADEVENT = False
995 except Exception, error:
996- print error
997+ if __debug__:
998+ print error
999 import internal.misc as misc
1000 MADEVENT = True
1001
1002@@ -843,7 +844,6 @@
1003 value = Cmd.timed_input(question, default, timeout=timeout,
1004 fct=f, fct_timeout=fct_timeout)
1005
1006- self.preloop()
1007 return value
1008
1009 def check_answer_in_input_file(self, options, path=False):
1010
1011=== modified file 'madgraph/interface/madevent_interface.py'
1012--- madgraph/interface/madevent_interface.py 2012-04-20 05:12:21 +0000
1013+++ madgraph/interface/madevent_interface.py 2012-05-16 04:17:21 +0000
1014@@ -24,6 +24,7 @@
1015 import optparse
1016 import os
1017 import pydoc
1018+import random
1019 import re
1020 import shutil
1021 import subprocess
1022@@ -532,7 +533,7 @@
1023 if not self.me_dir:
1024 if not os.path.isfile(args[0]):
1025 self.help_open()
1026- raise self.InvalidCmd('No MadEvent path defined. Impossible to associate this name to a file')
1027+ raise self.InvalidCmd('No MadEvent path defined. Unable to associate this name to a file')
1028 else:
1029 return True
1030
1031@@ -683,7 +684,7 @@
1032 if self.results.lastrun:
1033 self.set_run_name(self.results.lastrun)
1034 else:
1035- raise self.InvalidCmd('No run_name currently define. Impossible to run refine')
1036+ raise self.InvalidCmd('No run_name currently define. Unable to run refine')
1037
1038 if len(args) > 2:
1039 self.help_refine()
1040@@ -719,7 +720,7 @@
1041
1042 if not self.run_name:
1043 if not self.results.lastrun:
1044- raise self.InvalidCmd('No run_name currently define. Impossible to run combine')
1045+ raise self.InvalidCmd('No run_name currently define. Unable to run combine')
1046 else:
1047 self.set_run_name(self.results.lastrun)
1048
1049@@ -1324,9 +1325,9 @@
1050 # Check that the directory is not currently running
1051 if os.path.exists(pjoin(me_dir,'RunWeb')):
1052 message = '''Another instance of madevent is currently running.
1053- Please wait that all instance of madevent are closed. If this message
1054- is an error in itself, you can suppress the files:
1055- %s.''' % pjoin(me_dir,'RunWeb')
1056+ Please wait that all instance of madevent are closed. If no
1057+ instance is running, you can delete the file
1058+ %s and try again.''' % pjoin(me_dir,'RunWeb')
1059 raise MadEventAlreadyRunning, message
1060 else:
1061 os.system('touch %s' % pjoin(me_dir,'RunWeb'))
1062@@ -1357,8 +1358,7 @@
1063 # load the current status of the directory
1064 if os.path.exists(pjoin(self.me_dir,'HTML','results.pkl')):
1065 self.results = save_load_object.load_from_file(pjoin(self.me_dir,'HTML','results.pkl'))
1066- self.results.path = self.me_dir # allowed to move the directory after some launch
1067- self.results.resetall()
1068+ self.results.resetall(self.me_dir)
1069 else:
1070 model = self.find_model_name()
1071 process = self.process # define in find_model_name
1072@@ -1729,7 +1729,8 @@
1073 self.exec_cmd('pythia --no_default', postcmd=False, printcmd=False)
1074 # pythia launches pgs/delphes if needed
1075 self.store_result()
1076-
1077+
1078+
1079
1080 def print_results_in_shell(self, data):
1081 """Have a nice results prints in the shell,
1082@@ -1748,8 +1749,6 @@
1083 logger.info(" Matched Cross-section : %.4g +- %.4g pb" % (data['cross_pythia'], data['error_pythia']))
1084 logger.info(" Nb of events after Matching : %s" % data['nb_event_pythia'])
1085 logger.info(" " )
1086-
1087-
1088
1089 ############################################################################
1090 def do_calculate_decay_widths(self, line):
1091@@ -2119,6 +2118,8 @@
1092 if not self.banner:
1093 self.banner = banner_mod.recover_banner(self.results, 'parton')
1094 self.banner.load_basic(self.me_dir)
1095+ # Add cross-section/event information
1096+ self.banner.add_generation_info(self.results.current['cross'], nb_event)
1097 if not hasattr(self, 'random'): self.random = 0
1098 self.banner.change_seed(self.random)
1099 if not os.path.exists(pjoin(self.me_dir, 'Events', self.run_name)):
1100@@ -2134,11 +2135,6 @@
1101 misc.call(['%s/put_banner'% self.dirbin, 'unweighted_events.lhe'],
1102 cwd=pjoin(self.me_dir, 'Events'))
1103
1104- #if os.path.exists(pjoin(self.me_dir, 'Events', 'unweighted_events.lhe')):
1105- # misc.call(['%s/extract_banner-pl' % self.dirbin,
1106- # 'unweighted_events.lhe', 'banner.txt'],
1107- # cwd=pjoin(self.me_dir, 'Events'))
1108-
1109 eradir = self.options['exrootanalysis_path']
1110 madir = self.options['madanalysis_path']
1111 td = self.options['td_path']
1112@@ -2220,8 +2216,7 @@
1113 output = pjoin(O_path, name)
1114 files.mv(input, output)
1115 misc.call(['gzip', output], stdout=devnull, stderr=devnull,
1116- cwd=O_path)
1117-
1118+ cwd=O_path)
1119 self.update_status('End Parton', level='parton', makehtml=False)
1120
1121 ############################################################################
1122@@ -2458,14 +2453,14 @@
1123 pass # Just ensure that html never makes crash this function
1124
1125
1126- # Found the file to suppress
1127+ # Found the file to delete
1128
1129- to_suppress = glob.glob(pjoin(self.me_dir, 'Events', run, '*'))
1130- to_suppress += glob.glob(pjoin(self.me_dir, 'HTML', run, '*'))
1131+ to_delete = glob.glob(pjoin(self.me_dir, 'Events', run, '*'))
1132+ to_delete += glob.glob(pjoin(self.me_dir, 'HTML', run, '*'))
1133 # forbid the banner to be removed
1134- to_suppress = [os.path.basename(f) for f in to_suppress if 'banner' not in f]
1135+ to_delete = [os.path.basename(f) for f in to_delete if 'banner' not in f]
1136 if tag:
1137- to_suppress = [f for f in to_suppress if tag in f]
1138+ to_delete = [f for f in to_delete if tag in f]
1139 if 'parton' in mode or 'all' in mode:
1140 try:
1141 if self.results[run][0]['tag'] != tag:
1142@@ -2473,35 +2468,35 @@
1143 except:
1144 pass
1145 else:
1146- nb_rm = len(to_suppress)
1147+ nb_rm = len(to_delete)
1148 if os.path.exists(pjoin(self.me_dir, 'Events', run, 'events.lhe.gz')):
1149- to_suppress.append('events.lhe.gz')
1150+ to_delete.append('events.lhe.gz')
1151 if os.path.exists(pjoin(self.me_dir, 'Events', run, 'unweighted_events.lhe.gz')):
1152- to_suppress.append('unweighted_events.lhe.gz')
1153- if nb_rm != len(to_suppress):
1154+ to_delete.append('unweighted_events.lhe.gz')
1155+ if nb_rm != len(to_delete):
1156 logger.warning('Be carefull that partonic information are on the point to be removed.')
1157 if 'all' in mode:
1158- pass # suppress everything
1159+ pass # delete everything
1160 else:
1161 if 'pythia' not in mode:
1162- to_suppress = [f for f in to_suppress if 'pythia' not in f]
1163+ to_delete = [f for f in to_delete if 'pythia' not in f]
1164 if 'pgs' not in mode:
1165- to_suppress = [f for f in to_suppress if 'pgs' not in f]
1166+ to_delete = [f for f in to_delete if 'pgs' not in f]
1167 if 'delphes' not in mode:
1168- to_suppress = [f for f in to_suppress if 'delphes' not in f]
1169+ to_delete = [f for f in to_delete if 'delphes' not in f]
1170 if 'parton' not in mode:
1171- to_suppress = [f for f in to_suppress if 'delphes' in f
1172+ to_delete = [f for f in to_delete if 'delphes' in f
1173 or 'pgs' in f
1174 or 'pythia' in f]
1175- if not self.force and len(to_suppress):
1176- question = 'Do you want to suppress the following files?\n %s' % \
1177- '\n '.join(to_suppress)
1178+ if not self.force and len(to_delete):
1179+ question = 'Do you want to delete the following files?\n %s' % \
1180+ '\n '.join(to_delete)
1181 ans = self.ask(question, 'y', choices=['y','n'])
1182 else:
1183 ans = 'y'
1184
1185 if ans == 'y':
1186- for file2rm in to_suppress:
1187+ for file2rm in to_delete:
1188 if os.path.exists(pjoin(self.me_dir, 'Events', run, file2rm)):
1189 try:
1190 os.remove(pjoin(self.me_dir, 'Events', run, file2rm))
1191@@ -2523,23 +2518,23 @@
1192 except:
1193 pass
1194 else:
1195- to_suppress = glob.glob(pjoin(self.me_dir, 'SubProcesses', '%s*' % run))
1196- to_suppress += glob.glob(pjoin(self.me_dir, 'SubProcesses', '*','%s*' % run))
1197- to_suppress += glob.glob(pjoin(self.me_dir, 'SubProcesses', '*','*','%s*' % run))
1198+ to_delete = glob.glob(pjoin(self.me_dir, 'SubProcesses', '%s*' % run))
1199+ to_delete += glob.glob(pjoin(self.me_dir, 'SubProcesses', '*','%s*' % run))
1200+ to_delete += glob.glob(pjoin(self.me_dir, 'SubProcesses', '*','*','%s*' % run))
1201
1202- if self.force or len(to_suppress) == 0:
1203+ if self.force or len(to_delete) == 0:
1204 ans = 'y'
1205 else:
1206- question = 'Do you want to suppress the following files?\n %s' % \
1207- '\n '.join(to_suppress)
1208+ question = 'Do you want to delete the following files?\n %s' % \
1209+ '\n '.join(to_delete)
1210 ans = self.ask(question, 'y', choices=['y','n'])
1211
1212 if ans == 'y':
1213- for file2rm in to_suppress:
1214+ for file2rm in to_delete:
1215 os.remove(file2rm)
1216
1217 if 'banner' in mode:
1218- to_suppress = glob.glob(pjoin(self.me_dir, 'Events', run, '*'))
1219+ to_delete = glob.glob(pjoin(self.me_dir, 'Events', run, '*'))
1220 if tag:
1221 # remove banner
1222 try:
1223@@ -2550,8 +2545,8 @@
1224 if run in self.results:
1225 self.results.delete_run(run, tag)
1226 return
1227- elif any(['banner' not in os.path.basename(p) for p in to_suppress]):
1228- if to_suppress:
1229+ elif any(['banner' not in os.path.basename(p) for p in to_delete]):
1230+ if to_delete:
1231 raise MadGraph5Error, '''Some output still exists for this run.
1232 Please remove those output first. Do for example:
1233 remove %s all banner
1234@@ -3064,7 +3059,7 @@
1235 out = misc.call([pjoin(self.dirbin, 'compile_Source')],
1236 cwd = self.me_dir)
1237 if out:
1238- raise MadEventError, 'Impossible to compile'
1239+ raise MadEventError, 'Unable to compile'
1240
1241 # set random number
1242 if self.run_card['iseed'] != '0':
1243
1244=== modified file 'madgraph/interface/madgraph_interface.py'
1245--- madgraph/interface/madgraph_interface.py 2012-04-20 05:12:21 +0000
1246+++ madgraph/interface/madgraph_interface.py 2012-05-16 04:17:21 +0000
1247@@ -24,6 +24,7 @@
1248 import re
1249 import subprocess
1250 import sys
1251+import shutil
1252 import traceback
1253 import time
1254
1255@@ -1373,7 +1374,7 @@
1256
1257
1258 # options
1259- options = ['--format=Fortran', '--format=Python','--format=Cpp','--output=']
1260+ options = ['--format=Fortran', '--format=Python','--format=CPP','--output=']
1261 options = self.list_completion(text, options)
1262 if options:
1263 completion_categories['options'] = options
1264@@ -3209,7 +3210,7 @@
1265 ################
1266 if self._export_format == 'aloha':
1267 # catch format
1268- format = [d[11:] for d in args if d.startswith('--language=')]
1269+ format = [d[9:] for d in args if d.startswith('--format=')]
1270 if not format:
1271 format = 'Fortran'
1272 else:
1273@@ -3245,10 +3246,12 @@
1274 and self._export_format in ['madevent', 'standalone']:
1275 # Don't ask if user already specified force or noclean
1276 logger.info('INFO: directory %s already exists.' % self._export_dir)
1277- logger.info('If you continue this directory will be cleaned')
1278+ logger.info('If you continue this directory will be deleted and replaced.')
1279 answer = self.ask('Do you want to continue?', 'y', ['y','n'])
1280 if answer != 'y':
1281 raise self.InvalidCmd('Stopped by user request')
1282+ else:
1283+ shutil.rmtree(self._export_dir)
1284
1285 #check if we need to group processes
1286 group_subprocesses = False
1287
1288=== modified file 'madgraph/iolibs/export_cpp.py'
1289--- madgraph/iolibs/export_cpp.py 2012-02-17 06:01:41 +0000
1290+++ madgraph/iolibs/export_cpp.py 2012-05-16 04:17:21 +0000
1291@@ -1195,12 +1195,11 @@
1292
1293 for schannel in schannels:
1294 sid = schannel.get('legs')[-1].get('id')
1295- try:
1296+ part = self.model.get_particle(sid)
1297+ if part:
1298 width = self.model.get_particle(sid).get('width')
1299 if width.lower() != 'zero':
1300 resonances.append(sid)
1301- except KeyError:
1302- pass
1303 resonance_set = set(resonances)
1304
1305 singleres = 0
1306
1307=== modified file 'madgraph/iolibs/group_subprocs.py'
1308--- madgraph/iolibs/group_subprocs.py 2012-03-28 03:42:34 +0000
1309+++ madgraph/iolibs/group_subprocs.py 2012-05-16 04:17:21 +0000
1310@@ -520,6 +520,7 @@
1311 for me in matrix_elements:
1312 group_assignment = self.assign_group_to_decay_process(\
1313 me.get('processes')[0])
1314+ assert group_assignment
1315 try:
1316 me_assignments[group_assignment].append(me)
1317 except KeyError:
1318@@ -556,24 +557,23 @@
1319 for decay in process.get('decay_chains'):
1320 # Find decay group that has this decay in it
1321 ids = [l.get('id') for l in decay.get('legs')]
1322- decay_group = [(i, group) for (i, group) in \
1323+ decay_groups = [(i, group) for (i, group) in \
1324 enumerate(self.get('decay_groups')) \
1325 if any([ids in [[l.get('id') for l in \
1326 a.get('process').get('legs')] \
1327 for a in g.get('amplitudes')] \
1328 for g in group.get('core_groups')])]
1329
1330- assert len(decay_group) > 0
1331-
1332- for i in range(1,len(decay_group)):
1333- assert decay_group[i-1][1] == decay_group[i][1]
1334-
1335- decay_group = decay_group[0]
1336-
1337- group_assignment = \
1338- decay_group[1].assign_group_to_decay_process(decay)
1339-
1340- group_assignments.append((decay_group[0], group_assignment))
1341+ for decay_group in decay_groups:
1342+
1343+ group_assignment = \
1344+ decay_group[1].assign_group_to_decay_process(decay)
1345+
1346+ if group_assignment:
1347+ group_assignments.append((decay_group[0], group_assignment))
1348+
1349+ if process.get('decay_chains') and not group_assignments:
1350+ return None
1351
1352 # Now calculate the corresponding properties for process
1353
1354@@ -584,6 +584,10 @@
1355 if ids in [[l.get('id') for l in \
1356 a.get('process').get('legs')] \
1357 for a in group.get('amplitudes')]]
1358+
1359+ if not core_group:
1360+ return None
1361+
1362 assert len(core_group) == 1
1363
1364 core_group = core_group[0]
1365
1366=== modified file 'madgraph/iolibs/helas_call_writers.py'
1367--- madgraph/iolibs/helas_call_writers.py 2012-01-31 16:28:22 +0000
1368+++ madgraph/iolibs/helas_call_writers.py 2012-05-16 04:17:21 +0000
1369@@ -925,10 +925,7 @@
1370
1371 # Check if we need to append a charge conjugation flag
1372 l = [str(l) for l in argument.get('lorentz')]
1373- flag = []
1374- if argument.needs_hermitian_conjugate():
1375- flag = ['C%d' % i for i in \
1376- argument.get_conjugate_index()]
1377+ flag = ['C%d' % i for i in argument.get('conjugate_indices')]
1378 routine_name = aloha_writers.combine_name(
1379 '%s' % l[0], l[1:], outgoing, flag)
1380 call = 'CALL %s' % (routine_name)
1381@@ -1062,10 +1059,7 @@
1382
1383 # Check if we need to append a charge conjugation flag
1384 l = [str(l) for l in argument.get('lorentz')]
1385- flag = []
1386- if argument.needs_hermitian_conjugate():
1387- flag = ['C%d' % i for i in \
1388- argument.get_conjugate_index()]
1389+ flag = ['C%d' % i for i in argument.get('conjugate_indices')]
1390 routine_name = aloha_writers.combine_name(
1391 '%s' % l[0], l[1:], outgoing, flag)
1392 call = '%s' % (routine_name)
1393@@ -1237,9 +1231,7 @@
1394
1395 # Check if we need to append a charge conjugation flag
1396 l = [str(l) for l in argument.get('lorentz')]
1397- flag = []
1398- if argument.needs_hermitian_conjugate():
1399- flag = ['C%d' % i for i in argument.get_conjugate_index()]
1400+ flag = ['C%d' % i for i in argument.get('conjugate_indices')]
1401 routine_name = aloha_writers.combine_name(
1402 '%s' % l[0], l[1:], outgoing, flag)
1403
1404
1405=== modified file 'madgraph/various/banner.py'
1406--- madgraph/various/banner.py 2012-02-24 16:52:39 +0000
1407+++ madgraph/various/banner.py 2012-05-16 04:17:21 +0000
1408@@ -104,6 +104,14 @@
1409 new_seed_str = " %s = iseed" % seed
1410 self['mgruncard'] = p.sub(new_seed_str, self['mgruncard'])
1411
1412+ def add_generation_info(self, cross, nb_event):
1413+ """add info on MGGeneration"""
1414+
1415+ text = """
1416+# Number of Events : %s
1417+# Integrated weight (pb) : %s
1418+""" % (nb_event, cross)
1419+ self['MGGenerationInfo'] = text
1420
1421 ############################################################################
1422 # SPLIT BANNER
1423
1424=== modified file 'madgraph/various/gen_crossxhtml.py'
1425--- madgraph/various/gen_crossxhtml.py 2012-04-19 20:49:31 +0000
1426+++ madgraph/various/gen_crossxhtml.py 2012-05-16 04:17:21 +0000
1427@@ -227,8 +227,13 @@
1428 if makehtml:
1429 self.output()
1430
1431- def resetall(self):
1432- """check the output status of all run"""
1433+ def resetall(self, main_path=None):
1434+ """check the output status of all run
1435+ main_path redefines the path associated to the run (allowing to move
1436+ the directory)
1437+ """
1438+
1439+ self.path = main_path
1440
1441 for key,run in self.items():
1442 if key == 'web':
1443@@ -236,6 +241,7 @@
1444 for i,subrun in enumerate(run):
1445 self.def_current(subrun)
1446 self.clean()
1447+ self.current.event_path = pjoin(main_path,'Events')
1448 if i==0:
1449 self.current.update_status()
1450 else:
1451
1452=== modified file 'madgraph/various/misc.py'
1453--- madgraph/various/misc.py 2012-04-15 06:01:59 +0000
1454+++ madgraph/various/misc.py 2012-05-16 04:17:21 +0000
1455@@ -288,7 +288,8 @@
1456 self.data = (self.read(self.blksize) + line).split('\n')
1457 except IOError: # can't seek before the beginning of the file
1458 self.seek(0)
1459- self.data = string.split(self.read(self.size - (self.blksize * (self.blkcount-1))) + line, '\n')
1460+ data = self.read(self.size - (self.blksize * (self.blkcount-1))) + line
1461+ self.data = data.split('\n')
1462
1463 if len(self.data) == 0:
1464 return ""
1465@@ -322,13 +323,6 @@
1466 return line
1467 else:
1468 raise StopIteration
1469-
1470- def close(self):
1471- """ close correctly file """
1472- try:
1473- self.close()
1474- except:
1475- pass
1476
1477
1478
1479
1480=== modified file 'models/sm/coupling_orders.py'
1481--- models/sm/coupling_orders.py 2011-07-19 18:58:02 +0000
1482+++ models/sm/coupling_orders.py 2012-05-16 04:17:21 +0000
1483@@ -1,15 +1,16 @@
1484-# This file was automatically created by FeynRules $Revision: 634 $
1485+# This file was automatically created by FeynRules $Revision: 1105 $
1486 # Mathematica version: 8.0 for Mac OS X x86 (64-bit) (November 6, 2010)
1487-# Date: Tue 19 Jul 2011 18:23:49
1488+# Date: Tue 3 Apr 2012 09:10:20
1489
1490
1491 from object_library import all_orders, CouplingOrder
1492
1493
1494 QCD = CouplingOrder(name = 'QCD',
1495- expansion_order = -1,
1496+ expansion_order = 99,
1497 hierarchy = 1)
1498
1499 QED = CouplingOrder(name = 'QED',
1500- expansion_order = -1,
1501+ expansion_order = 99,
1502 hierarchy = 2)
1503+
1504
1505=== modified file 'models/sm/couplings.py'
1506--- models/sm/couplings.py 2011-07-19 18:58:02 +0000
1507+++ models/sm/couplings.py 2012-05-16 04:17:21 +0000
1508@@ -1,6 +1,6 @@
1509-# This file was automatically created by FeynRules $Revision: 634 $
1510+# This file was automatically created by FeynRules $Revision: 1105 $
1511 # Mathematica version: 8.0 for Mac OS X x86 (64-bit) (November 6, 2010)
1512-# Date: Wed 6 Jul 2011 14:07:37
1513+# Date: Tue 3 Apr 2012 09:10:20
1514
1515
1516 from object_library import all_couplings, Coupling
1517@@ -46,154 +46,158 @@
1518 order = {'QED':2})
1519
1520 GC_10 = Coupling(name = 'GC_10',
1521+ value = '-6*complex(0,1)*lam',
1522+ order = {'QED':2})
1523+
1524+GC_11 = Coupling(name = 'GC_11',
1525 value = '(ee**2*complex(0,1))/(2.*sw**2)',
1526 order = {'QED':2})
1527
1528-GC_11 = Coupling(name = 'GC_11',
1529+GC_12 = Coupling(name = 'GC_12',
1530 value = '(ee*complex(0,1))/(sw*cmath.sqrt(2))',
1531 order = {'QED':1})
1532
1533-GC_12 = Coupling(name = 'GC_12',
1534- value = '(CKM11*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1535- order = {'QED':1})
1536-
1537 GC_13 = Coupling(name = 'GC_13',
1538- value = '(CKM12*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1539+ value = '(CKM1x1*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1540 order = {'QED':1})
1541
1542 GC_14 = Coupling(name = 'GC_14',
1543- value = '(CKM13*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1544+ value = '(CKM1x2*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1545 order = {'QED':1})
1546
1547 GC_15 = Coupling(name = 'GC_15',
1548- value = '(CKM21*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1549+ value = '(CKM1x3*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1550 order = {'QED':1})
1551
1552 GC_16 = Coupling(name = 'GC_16',
1553- value = '(CKM22*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1554+ value = '(CKM2x1*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1555 order = {'QED':1})
1556
1557 GC_17 = Coupling(name = 'GC_17',
1558- value = '(CKM23*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1559+ value = '(CKM2x2*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1560 order = {'QED':1})
1561
1562 GC_18 = Coupling(name = 'GC_18',
1563- value = '(CKM31*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1564+ value = '(CKM2x3*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1565 order = {'QED':1})
1566
1567 GC_19 = Coupling(name = 'GC_19',
1568- value = '(CKM32*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1569+ value = '(CKM3x1*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1570 order = {'QED':1})
1571
1572 GC_20 = Coupling(name = 'GC_20',
1573- value = '(CKM33*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1574+ value = '(CKM3x2*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1575 order = {'QED':1})
1576
1577 GC_21 = Coupling(name = 'GC_21',
1578+ value = '(CKM3x3*ee*complex(0,1))/(sw*cmath.sqrt(2))',
1579+ order = {'QED':1})
1580+
1581+GC_22 = Coupling(name = 'GC_22',
1582 value = '-(cw*ee*complex(0,1))/(2.*sw)',
1583 order = {'QED':1})
1584
1585-GC_22 = Coupling(name = 'GC_22',
1586+GC_23 = Coupling(name = 'GC_23',
1587 value = '(cw*ee*complex(0,1))/(2.*sw)',
1588 order = {'QED':1})
1589
1590-GC_23 = Coupling(name = 'GC_23',
1591+GC_24 = Coupling(name = 'GC_24',
1592 value = '-(ee*complex(0,1)*sw)/(6.*cw)',
1593 order = {'QED':1})
1594
1595-GC_24 = Coupling(name = 'GC_24',
1596+GC_25 = Coupling(name = 'GC_25',
1597 value = '(ee*complex(0,1)*sw)/(2.*cw)',
1598 order = {'QED':1})
1599
1600-GC_25 = Coupling(name = 'GC_25',
1601+GC_26 = Coupling(name = 'GC_26',
1602 value = 'complex(0,1)*gw*sw',
1603 order = {'QED':1})
1604
1605-GC_26 = Coupling(name = 'GC_26',
1606+GC_27 = Coupling(name = 'GC_27',
1607 value = '-2*cw*complex(0,1)*gw**2*sw',
1608 order = {'QED':2})
1609
1610-GC_27 = Coupling(name = 'GC_27',
1611+GC_28 = Coupling(name = 'GC_28',
1612 value = 'complex(0,1)*gw**2*sw**2',
1613 order = {'QED':2})
1614
1615-GC_28 = Coupling(name = 'GC_28',
1616+GC_29 = Coupling(name = 'GC_29',
1617 value = '(cw*ee*complex(0,1))/(2.*sw) + (ee*complex(0,1)*sw)/(2.*cw)',
1618 order = {'QED':1})
1619
1620-GC_29 = Coupling(name = 'GC_29',
1621+GC_30 = Coupling(name = 'GC_30',
1622 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)',
1623 order = {'QED':2})
1624
1625-GC_30 = Coupling(name = 'GC_30',
1626+GC_31 = Coupling(name = 'GC_31',
1627 value = '-6*complex(0,1)*lam*v',
1628 order = {'QED':1})
1629
1630-GC_31 = Coupling(name = 'GC_31',
1631+GC_32 = Coupling(name = 'GC_32',
1632 value = '(ee**2*complex(0,1)*v)/(2.*sw**2)',
1633 order = {'QED':1})
1634
1635-GC_32 = Coupling(name = 'GC_32',
1636+GC_33 = Coupling(name = 'GC_33',
1637 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)',
1638 order = {'QED':1})
1639
1640-GC_33 = Coupling(name = 'GC_33',
1641+GC_34 = Coupling(name = 'GC_34',
1642 value = '-((complex(0,1)*yb)/cmath.sqrt(2))',
1643 order = {'QED':1})
1644
1645-GC_34 = Coupling(name = 'GC_34',
1646+GC_35 = Coupling(name = 'GC_35',
1647 value = '-((complex(0,1)*yc)/cmath.sqrt(2))',
1648 order = {'QED':1})
1649
1650-GC_35 = Coupling(name = 'GC_35',
1651+GC_36 = Coupling(name = 'GC_36',
1652 value = '-((complex(0,1)*ye)/cmath.sqrt(2))',
1653 order = {'QED':1})
1654
1655-GC_36 = Coupling(name = 'GC_36',
1656+GC_37 = Coupling(name = 'GC_37',
1657 value = '-((complex(0,1)*ym)/cmath.sqrt(2))',
1658 order = {'QED':1})
1659
1660-GC_37 = Coupling(name = 'GC_37',
1661+GC_38 = Coupling(name = 'GC_38',
1662 value = '-((complex(0,1)*yt)/cmath.sqrt(2))',
1663 order = {'QED':1})
1664
1665-GC_38 = Coupling(name = 'GC_38',
1666+GC_39 = Coupling(name = 'GC_39',
1667 value = '-((complex(0,1)*ytau)/cmath.sqrt(2))',
1668 order = {'QED':1})
1669
1670-GC_39 = Coupling(name = 'GC_39',
1671- value = '(ee*complex(0,1)*complexconjugate(CKM11))/(sw*cmath.sqrt(2))',
1672- order = {'QED':1})
1673-
1674 GC_40 = Coupling(name = 'GC_40',
1675- value = '(ee*complex(0,1)*complexconjugate(CKM12))/(sw*cmath.sqrt(2))',
1676+ value = '(ee*complex(0,1)*complexconjugate(CKM1x1))/(sw*cmath.sqrt(2))',
1677 order = {'QED':1})
1678
1679 GC_41 = Coupling(name = 'GC_41',
1680- value = '(ee*complex(0,1)*complexconjugate(CKM13))/(sw*cmath.sqrt(2))',
1681+ value = '(ee*complex(0,1)*complexconjugate(CKM1x2))/(sw*cmath.sqrt(2))',
1682 order = {'QED':1})
1683
1684 GC_42 = Coupling(name = 'GC_42',
1685- value = '(ee*complex(0,1)*complexconjugate(CKM21))/(sw*cmath.sqrt(2))',
1686+ value = '(ee*complex(0,1)*complexconjugate(CKM1x3))/(sw*cmath.sqrt(2))',
1687 order = {'QED':1})
1688
1689 GC_43 = Coupling(name = 'GC_43',
1690- value = '(ee*complex(0,1)*complexconjugate(CKM22))/(sw*cmath.sqrt(2))',
1691+ value = '(ee*complex(0,1)*complexconjugate(CKM2x1))/(sw*cmath.sqrt(2))',
1692 order = {'QED':1})
1693
1694 GC_44 = Coupling(name = 'GC_44',
1695- value = '(ee*complex(0,1)*complexconjugate(CKM23))/(sw*cmath.sqrt(2))',
1696+ value = '(ee*complex(0,1)*complexconjugate(CKM2x2))/(sw*cmath.sqrt(2))',
1697 order = {'QED':1})
1698
1699 GC_45 = Coupling(name = 'GC_45',
1700- value = '(ee*complex(0,1)*complexconjugate(CKM31))/(sw*cmath.sqrt(2))',
1701+ value = '(ee*complex(0,1)*complexconjugate(CKM2x3))/(sw*cmath.sqrt(2))',
1702 order = {'QED':1})
1703
1704 GC_46 = Coupling(name = 'GC_46',
1705- value = '(ee*complex(0,1)*complexconjugate(CKM32))/(sw*cmath.sqrt(2))',
1706+ value = '(ee*complex(0,1)*complexconjugate(CKM3x1))/(sw*cmath.sqrt(2))',
1707 order = {'QED':1})
1708
1709 GC_47 = Coupling(name = 'GC_47',
1710- value = '(ee*complex(0,1)*complexconjugate(CKM33))/(sw*cmath.sqrt(2))',
1711+ value = '(ee*complex(0,1)*complexconjugate(CKM3x2))/(sw*cmath.sqrt(2))',
1712+ order = {'QED':1})
1713+
1714+GC_48 = Coupling(name = 'GC_48',
1715+ value = '(ee*complex(0,1)*complexconjugate(CKM3x3))/(sw*cmath.sqrt(2))',
1716 order = {'QED':1})
1717
1718
1719=== modified file 'models/sm/lorentz.py'
1720--- models/sm/lorentz.py 2011-07-19 18:58:02 +0000
1721+++ models/sm/lorentz.py 2012-05-16 04:17:21 +0000
1722@@ -1,6 +1,6 @@
1723-# This file was automatically created by FeynRules $Revision: 634 $
1724+# This file was automatically created by FeynRules $Revision: 1105 $
1725 # Mathematica version: 8.0 for Mac OS X x86 (64-bit) (November 6, 2010)
1726-# Date: Wed 6 Jul 2011 14:07:37
1727+# Date: Tue 3 Apr 2012 09:10:20
1728
1729
1730 from object_library import all_lorentz, Lorentz
1731@@ -49,6 +49,10 @@
1732 spins = [ 3, 3, 3 ],
1733 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)')
1734
1735+SSSS1 = Lorentz(name = 'SSSS1',
1736+ spins = [ 1, 1, 1, 1 ],
1737+ structure = '1')
1738+
1739 VVSS1 = Lorentz(name = 'VVSS1',
1740 spins = [ 3, 3, 1, 1 ],
1741 structure = 'Metric(1,2)')
1742
1743=== modified file 'models/sm/parameters.py'
1744--- models/sm/parameters.py 2011-07-19 18:58:02 +0000
1745+++ models/sm/parameters.py 2012-05-16 04:17:21 +0000
1746@@ -1,6 +1,6 @@
1747-# This file was automatically created by FeynRules $Revision: 634 $
1748+# This file was automatically created by FeynRules $Revision: 1105 $
1749 # Mathematica version: 8.0 for Mac OS X x86 (64-bit) (November 6, 2010)
1750-# Date: Wed 6 Jul 2011 14:07:37
1751+# Date: Tue 3 Apr 2012 09:10:20
1752
1753
1754
1755@@ -225,59 +225,59 @@
1756 lhablock = 'DECAY',
1757 lhacode = [ 15 ])
1758
1759-CKM11 = Parameter(name = 'CKM11',
1760- nature = 'internal',
1761- type = 'complex',
1762- value = '1 - lamWS**2/2.',
1763- texname = '\\text{CKM11}')
1764-
1765-CKM12 = Parameter(name = 'CKM12',
1766- nature = 'internal',
1767- type = 'complex',
1768- value = 'lamWS',
1769- texname = '\\text{CKM12}')
1770-
1771-CKM13 = Parameter(name = 'CKM13',
1772- nature = 'internal',
1773- type = 'complex',
1774- value = 'AWS*lamWS**3*(-(etaWS*complex(0,1)) + rhoWS)',
1775- texname = '\\text{CKM13}')
1776-
1777-CKM21 = Parameter(name = 'CKM21',
1778- nature = 'internal',
1779- type = 'complex',
1780- value = '-lamWS',
1781- texname = '\\text{CKM21}')
1782-
1783-CKM22 = Parameter(name = 'CKM22',
1784- nature = 'internal',
1785- type = 'complex',
1786- value = '1 - lamWS**2/2.',
1787- texname = '\\text{CKM22}')
1788-
1789-CKM23 = Parameter(name = 'CKM23',
1790- nature = 'internal',
1791- type = 'complex',
1792- value = 'AWS*lamWS**2',
1793- texname = '\\text{CKM23}')
1794-
1795-CKM31 = Parameter(name = 'CKM31',
1796- nature = 'internal',
1797- type = 'complex',
1798- value = 'AWS*lamWS**3*(1 - etaWS*complex(0,1) - rhoWS)',
1799- texname = '\\text{CKM31}')
1800-
1801-CKM32 = Parameter(name = 'CKM32',
1802- nature = 'internal',
1803- type = 'complex',
1804- value = '-(AWS*lamWS**2)',
1805- texname = '\\text{CKM32}')
1806-
1807-CKM33 = Parameter(name = 'CKM33',
1808- nature = 'internal',
1809- type = 'complex',
1810- value = '1',
1811- texname = '\\text{CKM33}')
1812+CKM1x1 = Parameter(name = 'CKM1x1',
1813+ nature = 'internal',
1814+ type = 'complex',
1815+ value = '1 - lamWS**2/2.',
1816+ texname = '\\text{CKM1x1}')
1817+
1818+CKM1x2 = Parameter(name = 'CKM1x2',
1819+ nature = 'internal',
1820+ type = 'complex',
1821+ value = 'lamWS',
1822+ texname = '\\text{CKM1x2}')
1823+
1824+CKM1x3 = Parameter(name = 'CKM1x3',
1825+ nature = 'internal',
1826+ type = 'complex',
1827+ value = 'AWS*lamWS**3*(-(etaWS*complex(0,1)) + rhoWS)',
1828+ texname = '\\text{CKM1x3}')
1829+
1830+CKM2x1 = Parameter(name = 'CKM2x1',
1831+ nature = 'internal',
1832+ type = 'complex',
1833+ value = '-lamWS',
1834+ texname = '\\text{CKM2x1}')
1835+
1836+CKM2x2 = Parameter(name = 'CKM2x2',
1837+ nature = 'internal',
1838+ type = 'complex',
1839+ value = '1 - lamWS**2/2.',
1840+ texname = '\\text{CKM2x2}')
1841+
1842+CKM2x3 = Parameter(name = 'CKM2x3',
1843+ nature = 'internal',
1844+ type = 'complex',
1845+ value = 'AWS*lamWS**2',
1846+ texname = '\\text{CKM2x3}')
1847+
1848+CKM3x1 = Parameter(name = 'CKM3x1',
1849+ nature = 'internal',
1850+ type = 'complex',
1851+ value = 'AWS*lamWS**3*(1 - etaWS*complex(0,1) - rhoWS)',
1852+ texname = '\\text{CKM3x1}')
1853+
1854+CKM3x2 = Parameter(name = 'CKM3x2',
1855+ nature = 'internal',
1856+ type = 'complex',
1857+ value = '-(AWS*lamWS**2)',
1858+ texname = '\\text{CKM3x2}')
1859+
1860+CKM3x3 = Parameter(name = 'CKM3x3',
1861+ nature = 'internal',
1862+ type = 'complex',
1863+ value = '1',
1864+ texname = '\\text{CKM3x3}')
1865
1866 aEW = Parameter(name = 'aEW',
1867 nature = 'internal',
1868
1869=== modified file 'models/sm/particles.py'
1870--- models/sm/particles.py 2011-07-19 18:58:02 +0000
1871+++ models/sm/particles.py 2012-05-16 04:17:21 +0000
1872@@ -1,6 +1,6 @@
1873-# This file was automatically created by FeynRules $Revision: 634 $
1874+# This file was automatically created by FeynRules $Revision: 1105 $
1875 # Mathematica version: 8.0 for Mac OS X x86 (64-bit) (November 6, 2010)
1876-# Date: Wed 6 Jul 2011 14:07:37
1877+# Date: Tue 3 Apr 2012 09:10:20
1878
1879
1880 from __future__ import division
1881@@ -15,10 +15,10 @@
1882 mass = Param.ZERO,
1883 width = Param.ZERO,
1884 texname = 've',
1885- antitexname = 've',
1886+ antitexname = 've~',
1887 charge = 0,
1888- LeptonNumber = 1,
1889- GhostNumber = 0)
1890+ GhostNumber = 0,
1891+ LeptonNumber = 1)
1892
1893 ve__tilde__ = ve.anti()
1894
1895@@ -30,10 +30,10 @@
1896 mass = Param.ZERO,
1897 width = Param.ZERO,
1898 texname = 'vm',
1899- antitexname = 'vm',
1900+ antitexname = 'vm~',
1901 charge = 0,
1902- LeptonNumber = 1,
1903- GhostNumber = 0)
1904+ GhostNumber = 0,
1905+ LeptonNumber = 1)
1906
1907 vm__tilde__ = vm.anti()
1908
1909@@ -45,10 +45,10 @@
1910 mass = Param.ZERO,
1911 width = Param.ZERO,
1912 texname = 'vt',
1913- antitexname = 'vt',
1914+ antitexname = 'vt~',
1915 charge = 0,
1916- LeptonNumber = 1,
1917- GhostNumber = 0)
1918+ GhostNumber = 0,
1919+ LeptonNumber = 1)
1920
1921 vt__tilde__ = vt.anti()
1922
1923@@ -60,10 +60,10 @@
1924 mass = Param.ZERO,
1925 width = Param.ZERO,
1926 texname = 'u',
1927- antitexname = 'u',
1928+ antitexname = 'u~',
1929 charge = 2/3,
1930- LeptonNumber = 0,
1931- GhostNumber = 0)
1932+ GhostNumber = 0,
1933+ LeptonNumber = 0)
1934
1935 u__tilde__ = u.anti()
1936
1937@@ -75,10 +75,10 @@
1938 mass = Param.MC,
1939 width = Param.ZERO,
1940 texname = 'c',
1941- antitexname = 'c',
1942+ antitexname = 'c~',
1943 charge = 2/3,
1944- LeptonNumber = 0,
1945- GhostNumber = 0)
1946+ GhostNumber = 0,
1947+ LeptonNumber = 0)
1948
1949 c__tilde__ = c.anti()
1950
1951@@ -90,10 +90,10 @@
1952 mass = Param.MT,
1953 width = Param.WT,
1954 texname = 't',
1955- antitexname = 't',
1956+ antitexname = 't~',
1957 charge = 2/3,
1958- LeptonNumber = 0,
1959- GhostNumber = 0)
1960+ GhostNumber = 0,
1961+ LeptonNumber = 0)
1962
1963 t__tilde__ = t.anti()
1964
1965@@ -105,10 +105,10 @@
1966 mass = Param.ZERO,
1967 width = Param.ZERO,
1968 texname = 'd',
1969- antitexname = 'd',
1970+ antitexname = 'd~',
1971 charge = -1/3,
1972- LeptonNumber = 0,
1973- GhostNumber = 0)
1974+ GhostNumber = 0,
1975+ LeptonNumber = 0)
1976
1977 d__tilde__ = d.anti()
1978
1979@@ -120,10 +120,10 @@
1980 mass = Param.ZERO,
1981 width = Param.ZERO,
1982 texname = 's',
1983- antitexname = 's',
1984+ antitexname = 's~',
1985 charge = -1/3,
1986- LeptonNumber = 0,
1987- GhostNumber = 0)
1988+ GhostNumber = 0,
1989+ LeptonNumber = 0)
1990
1991 s__tilde__ = s.anti()
1992
1993@@ -135,10 +135,10 @@
1994 mass = Param.MB,
1995 width = Param.ZERO,
1996 texname = 'b',
1997- antitexname = 'b',
1998+ antitexname = 'b~',
1999 charge = -1/3,
2000- LeptonNumber = 0,
2001- GhostNumber = 0)
2002+ GhostNumber = 0,
2003+ LeptonNumber = 0)
2004
2005 b__tilde__ = b.anti()
2006
2007@@ -150,10 +150,10 @@
2008 mass = Param.ZERO,
2009 width = Param.ZERO,
2010 texname = 'ghA',
2011- antitexname = 'ghA',
2012+ antitexname = 'ghA~',
2013 charge = 0,
2014- LeptonNumber = 0,
2015- GhostNumber = 1)
2016+ GhostNumber = 1,
2017+ LeptonNumber = 0)
2018
2019 ghA__tilde__ = ghA.anti()
2020
2021@@ -163,12 +163,12 @@
2022 spin = -1,
2023 color = 1,
2024 mass = Param.MZ,
2025- width = Param.ZERO,
2026+ width = Param.WZ,
2027 texname = 'ghZ',
2028- antitexname = 'ghZ',
2029+ antitexname = 'ghZ~',
2030 charge = 0,
2031- LeptonNumber = 0,
2032- GhostNumber = 1)
2033+ GhostNumber = 1,
2034+ LeptonNumber = 0)
2035
2036 ghZ__tilde__ = ghZ.anti()
2037
2038@@ -178,12 +178,12 @@
2039 spin = -1,
2040 color = 1,
2041 mass = Param.MW,
2042- width = Param.ZERO,
2043+ width = Param.WW,
2044 texname = 'ghWp',
2045- antitexname = 'ghWp',
2046+ antitexname = 'ghWp~',
2047 charge = 1,
2048- LeptonNumber = 0,
2049- GhostNumber = 1)
2050+ GhostNumber = 1,
2051+ LeptonNumber = 0)
2052
2053 ghWp__tilde__ = ghWp.anti()
2054
2055@@ -193,12 +193,12 @@
2056 spin = -1,
2057 color = 1,
2058 mass = Param.MW,
2059- width = Param.ZERO,
2060+ width = Param.WW,
2061 texname = 'ghWm',
2062- antitexname = 'ghWm',
2063+ antitexname = 'ghWm~',
2064 charge = -1,
2065- LeptonNumber = 0,
2066- GhostNumber = 1)
2067+ GhostNumber = 1,
2068+ LeptonNumber = 0)
2069
2070 ghWm__tilde__ = ghWm.anti()
2071
2072@@ -210,10 +210,10 @@
2073 mass = Param.ZERO,
2074 width = Param.ZERO,
2075 texname = 'ghG',
2076- antitexname = 'ghG',
2077+ antitexname = 'ghG~',
2078 charge = 0,
2079- LeptonNumber = 0,
2080- GhostNumber = 1)
2081+ GhostNumber = 1,
2082+ LeptonNumber = 0)
2083
2084 ghG__tilde__ = ghG.anti()
2085
2086@@ -227,8 +227,8 @@
2087 texname = 'A',
2088 antitexname = 'A',
2089 charge = 0,
2090- LeptonNumber = 0,
2091- GhostNumber = 0)
2092+ GhostNumber = 0,
2093+ LeptonNumber = 0)
2094
2095 Z = Particle(pdg_code = 23,
2096 name = 'Z',
2097@@ -240,8 +240,8 @@
2098 texname = 'Z',
2099 antitexname = 'Z',
2100 charge = 0,
2101- LeptonNumber = 0,
2102- GhostNumber = 0)
2103+ GhostNumber = 0,
2104+ LeptonNumber = 0)
2105
2106 W__plus__ = Particle(pdg_code = 24,
2107 name = 'W+',
2108@@ -251,10 +251,10 @@
2109 mass = Param.MW,
2110 width = Param.WW,
2111 texname = 'W+',
2112- antitexname = 'W+',
2113+ antitexname = 'W-',
2114 charge = 1,
2115- LeptonNumber = 0,
2116- GhostNumber = 0)
2117+ GhostNumber = 0,
2118+ LeptonNumber = 0)
2119
2120 W__minus__ = W__plus__.anti()
2121
2122@@ -268,8 +268,8 @@
2123 texname = 'G',
2124 antitexname = 'G',
2125 charge = 0,
2126- LeptonNumber = 0,
2127- GhostNumber = 0)
2128+ GhostNumber = 0,
2129+ LeptonNumber = 0)
2130
2131 H = Particle(pdg_code = 25,
2132 name = 'H',
2133@@ -281,8 +281,8 @@
2134 texname = '\\phi',
2135 antitexname = '\\phi',
2136 charge = 0,
2137- LeptonNumber = 0,
2138- GhostNumber = 0)
2139+ GhostNumber = 0,
2140+ LeptonNumber = 0)
2141
2142 phi0 = Particle(pdg_code = 250,
2143 name = 'phi0',
2144@@ -295,8 +295,8 @@
2145 antitexname = 'phi0',
2146 GoldstoneBoson = True,
2147 charge = 0,
2148- LeptonNumber = 0,
2149- GhostNumber = 0)
2150+ GhostNumber = 0,
2151+ LeptonNumber = 0)
2152
2153 phi__plus__ = Particle(pdg_code = 251,
2154 name = 'phi+',
2155@@ -306,11 +306,11 @@
2156 mass = Param.MW,
2157 width = Param.ZERO,
2158 texname = '\\phi^+',
2159- antitexname = '\\phi^+',
2160+ antitexname = '\\phi^-',
2161 GoldstoneBoson = True,
2162 charge = 1,
2163- LeptonNumber = 0,
2164- GhostNumber = 0)
2165+ GhostNumber = 0,
2166+ LeptonNumber = 0)
2167
2168 phi__minus__ = phi__plus__.anti()
2169
2170@@ -322,10 +322,10 @@
2171 mass = Param.Me,
2172 width = Param.ZERO,
2173 texname = 'e-',
2174- antitexname = 'e-',
2175+ antitexname = 'e+',
2176 charge = -1,
2177- LeptonNumber = 1,
2178- GhostNumber = 0)
2179+ GhostNumber = 0,
2180+ LeptonNumber = 1)
2181
2182 e__plus__ = e__minus__.anti()
2183
2184@@ -337,10 +337,10 @@
2185 mass = Param.MM,
2186 width = Param.ZERO,
2187 texname = 'm-',
2188- antitexname = 'm-',
2189+ antitexname = 'm+',
2190 charge = -1,
2191- LeptonNumber = 1,
2192- GhostNumber = 0)
2193+ GhostNumber = 0,
2194+ LeptonNumber = 1)
2195
2196 m__plus__ = m__minus__.anti()
2197
2198@@ -352,10 +352,10 @@
2199 mass = Param.MTA,
2200 width = Param.WTau,
2201 texname = 'tt-',
2202- antitexname = 'tt-',
2203+ antitexname = 'tt+',
2204 charge = -1,
2205- LeptonNumber = 1,
2206- GhostNumber = 0)
2207+ GhostNumber = 0,
2208+ LeptonNumber = 1)
2209
2210 tt__plus__ = tt__minus__.anti()
2211
2212
2213=== added file 'models/sm/restrict_lepton_masses.dat'
2214--- models/sm/restrict_lepton_masses.dat 1970-01-01 00:00:00 +0000
2215+++ models/sm/restrict_lepton_masses.dat 2012-05-16 04:17:21 +0000
2216@@ -0,0 +1,53 @@
2217+######################################################################
2218+## PARAM_CARD AUTOMATICALY GENERATED BY THE UFO #####################
2219+######################################################################
2220+
2221+###################################
2222+## INFORMATION FOR SMINPUTS
2223+###################################
2224+Block SMINPUTS
2225+ 1 1.325070e+02 # aEWM1
2226+ 2 1.166390e-05 # Gf
2227+ 3 1.180000e-01 # aS
2228+
2229+###################################
2230+## INFORMATION FOR MASS
2231+###################################
2232+Block MASS
2233+ 4 0.000000e+00 # MC
2234+ 5 4.700000e+00 # MB
2235+ 6 1.730000e+02 # MT
2236+ 11 5.110000e-04 # Me
2237+ 13 1.056600e-01 # MM
2238+ 15 1.777000e+00 # MTA
2239+ 23 9.118800e+01 # MZ
2240+ 25 1.200000e+02 # MH
2241+
2242+###################################
2243+## INFORMATION FOR DECAY
2244+###################################
2245+DECAY 6 1.491500E+00
2246+DECAY 15 2.270000e-12
2247+DECAY 23 2.441404e+00
2248+DECAY 24 2.047600e+00
2249+DECAY 25 5.753088e-03
2250+
2251+###################################
2252+## INFORMATION FOR WOLFENSTEIN
2253+###################################
2254+Block Wolfenstein
2255+ 1 0.000000e+00 # lamWS
2256+ 2 0.000000e+00 # AWS
2257+ 3 0.000000e+00 # rhoWS
2258+ 4 0.000000e+00 # etaWS
2259+
2260+###################################
2261+## INFORMATION FOR YUKAWA
2262+###################################
2263+Block YUKAWA
2264+ 4 0.000000e+00 # ymc
2265+ 5 4.200000e+00 # ymb
2266+ 6 1.645000e+02 # ymt
2267+ 11 0.000000e+00 # yme
2268+ 13 0.000000e+00 # ymm
2269+ 15 1.777000e+00 # ymtau
2270
2271=== modified file 'models/sm/vertices.py'
2272--- models/sm/vertices.py 2011-07-19 18:58:02 +0000
2273+++ models/sm/vertices.py 2012-05-16 04:17:21 +0000
2274@@ -1,6 +1,6 @@
2275-# This file was automatically created by FeynRules $Revision: 634 $
2276+# This file was automatically created by FeynRules $Revision: 1105 $
2277 # Mathematica version: 8.0 for Mac OS X x86 (64-bit) (November 6, 2010)
2278-# Date: Wed 6 Jul 2011 14:07:37
2279+# Date: Tue 3 Apr 2012 09:10:20
2280
2281
2282 from object_library import all_vertices, Vertex
2283@@ -10,428 +10,434 @@
2284
2285
2286 V_1 = Vertex(name = 'V_1',
2287+ particles = [ P.H, P.H, P.H, P.H ],
2288+ color = [ '1' ],
2289+ lorentz = [ L.SSSS1 ],
2290+ couplings = {(0,0):C.GC_10})
2291+
2292+V_2 = Vertex(name = 'V_2',
2293 particles = [ P.H, P.H, P.H ],
2294 color = [ '1' ],
2295 lorentz = [ L.SSS1 ],
2296- couplings = {(0,0):C.GC_30})
2297+ couplings = {(0,0):C.GC_31})
2298
2299-V_2 = Vertex(name = 'V_2',
2300+V_3 = Vertex(name = 'V_3',
2301 particles = [ P.ghG, P.ghG__tilde__, P.G ],
2302 color = [ 'f(3,1,2)' ],
2303 lorentz = [ L.UUV1 ],
2304 couplings = {(0,0):C.GC_4})
2305
2306-V_3 = Vertex(name = 'V_3',
2307+V_4 = Vertex(name = 'V_4',
2308 particles = [ P.G, P.G, P.G ],
2309 color = [ 'f(1,2,3)' ],
2310 lorentz = [ L.VVV1 ],
2311 couplings = {(0,0):C.GC_4})
2312
2313-V_4 = Vertex(name = 'V_4',
2314+V_5 = Vertex(name = 'V_5',
2315 particles = [ P.G, P.G, P.G, P.G ],
2316 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)' ],
2317 lorentz = [ L.VVVV1, L.VVVV3, L.VVVV4 ],
2318 couplings = {(1,1):C.GC_6,(0,0):C.GC_6,(2,2):C.GC_6})
2319
2320-V_5 = Vertex(name = 'V_5',
2321+V_6 = Vertex(name = 'V_6',
2322 particles = [ P.A, P.W__minus__, P.W__plus__ ],
2323 color = [ '1' ],
2324 lorentz = [ L.VVV1 ],
2325- couplings = {(0,0):C.GC_25})
2326+ couplings = {(0,0):C.GC_26})
2327
2328-V_6 = Vertex(name = 'V_6',
2329+V_7 = Vertex(name = 'V_7',
2330 particles = [ P.W__minus__, P.W__plus__, P.H, P.H ],
2331 color = [ '1' ],
2332 lorentz = [ L.VVSS1 ],
2333- couplings = {(0,0):C.GC_10})
2334+ couplings = {(0,0):C.GC_11})
2335
2336-V_7 = Vertex(name = 'V_7',
2337+V_8 = Vertex(name = 'V_8',
2338 particles = [ P.W__minus__, P.W__plus__, P.H ],
2339 color = [ '1' ],
2340 lorentz = [ L.VVS1 ],
2341- couplings = {(0,0):C.GC_31})
2342+ couplings = {(0,0):C.GC_32})
2343
2344-V_8 = Vertex(name = 'V_8',
2345+V_9 = Vertex(name = 'V_9',
2346 particles = [ P.A, P.A, P.W__minus__, P.W__plus__ ],
2347 color = [ '1' ],
2348 lorentz = [ L.VVVV2 ],
2349- couplings = {(0,0):C.GC_27})
2350-
2351-V_9 = Vertex(name = 'V_9',
2352- particles = [ P.W__minus__, P.W__plus__, P.Z ],
2353- color = [ '1' ],
2354- lorentz = [ L.VVV1 ],
2355- couplings = {(0,0):C.GC_7})
2356+ couplings = {(0,0):C.GC_28})
2357
2358 V_10 = Vertex(name = 'V_10',
2359+ particles = [ P.W__minus__, P.W__plus__, P.Z ],
2360+ color = [ '1' ],
2361+ lorentz = [ L.VVV1 ],
2362+ couplings = {(0,0):C.GC_7})
2363+
2364+V_11 = Vertex(name = 'V_11',
2365 particles = [ P.W__minus__, P.W__minus__, P.W__plus__, P.W__plus__ ],
2366 color = [ '1' ],
2367 lorentz = [ L.VVVV2 ],
2368 couplings = {(0,0):C.GC_8})
2369
2370-V_11 = Vertex(name = 'V_11',
2371+V_12 = Vertex(name = 'V_12',
2372 particles = [ P.A, P.W__minus__, P.W__plus__, P.Z ],
2373 color = [ '1' ],
2374 lorentz = [ L.VVVV5 ],
2375- couplings = {(0,0):C.GC_26})
2376+ couplings = {(0,0):C.GC_27})
2377
2378-V_12 = Vertex(name = 'V_12',
2379+V_13 = Vertex(name = 'V_13',
2380 particles = [ P.Z, P.Z, P.H, P.H ],
2381 color = [ '1' ],
2382 lorentz = [ L.VVSS1 ],
2383- couplings = {(0,0):C.GC_29})
2384+ couplings = {(0,0):C.GC_30})
2385
2386-V_13 = Vertex(name = 'V_13',
2387+V_14 = Vertex(name = 'V_14',
2388 particles = [ P.Z, P.Z, P.H ],
2389 color = [ '1' ],
2390 lorentz = [ L.VVS1 ],
2391- couplings = {(0,0):C.GC_32})
2392+ couplings = {(0,0):C.GC_33})
2393
2394-V_14 = Vertex(name = 'V_14',
2395+V_15 = Vertex(name = 'V_15',
2396 particles = [ P.W__minus__, P.W__plus__, P.Z, P.Z ],
2397 color = [ '1' ],
2398 lorentz = [ L.VVVV2 ],
2399 couplings = {(0,0):C.GC_9})
2400
2401-V_15 = Vertex(name = 'V_15',
2402+V_16 = Vertex(name = 'V_16',
2403 particles = [ P.d__tilde__, P.d, P.A ],
2404 color = [ 'Identity(1,2)' ],
2405 lorentz = [ L.FFV1 ],
2406 couplings = {(0,0):C.GC_1})
2407
2408-V_16 = Vertex(name = 'V_16',
2409+V_17 = Vertex(name = 'V_17',
2410 particles = [ P.s__tilde__, P.s, P.A ],
2411 color = [ 'Identity(1,2)' ],
2412 lorentz = [ L.FFV1 ],
2413 couplings = {(0,0):C.GC_1})
2414
2415-V_17 = Vertex(name = 'V_17',
2416+V_18 = Vertex(name = 'V_18',
2417 particles = [ P.b__tilde__, P.b, P.A ],
2418 color = [ 'Identity(1,2)' ],
2419 lorentz = [ L.FFV1 ],
2420 couplings = {(0,0):C.GC_1})
2421
2422-V_18 = Vertex(name = 'V_18',
2423- particles = [ P.e__plus__, P.e__minus__, P.A ],
2424- color = [ '1' ],
2425- lorentz = [ L.FFV1 ],
2426- couplings = {(0,0):C.GC_3})
2427-
2428 V_19 = Vertex(name = 'V_19',
2429- particles = [ P.m__plus__, P.m__minus__, P.A ],
2430- color = [ '1' ],
2431+ particles = [ P.d__tilde__, P.d, P.G ],
2432+ color = [ 'T(3,2,1)' ],
2433 lorentz = [ L.FFV1 ],
2434- couplings = {(0,0):C.GC_3})
2435+ couplings = {(0,0):C.GC_5})
2436
2437 V_20 = Vertex(name = 'V_20',
2438- particles = [ P.tt__plus__, P.tt__minus__, P.A ],
2439- color = [ '1' ],
2440+ particles = [ P.s__tilde__, P.s, P.G ],
2441+ color = [ 'T(3,2,1)' ],
2442 lorentz = [ L.FFV1 ],
2443- couplings = {(0,0):C.GC_3})
2444+ couplings = {(0,0):C.GC_5})
2445
2446 V_21 = Vertex(name = 'V_21',
2447- particles = [ P.u__tilde__, P.u, P.A ],
2448- color = [ 'Identity(1,2)' ],
2449+ particles = [ P.b__tilde__, P.b, P.G ],
2450+ color = [ 'T(3,2,1)' ],
2451 lorentz = [ L.FFV1 ],
2452- couplings = {(0,0):C.GC_2})
2453+ couplings = {(0,0):C.GC_5})
2454
2455 V_22 = Vertex(name = 'V_22',
2456- particles = [ P.c__tilde__, P.c, P.A ],
2457+ particles = [ P.b__tilde__, P.b, P.H ],
2458 color = [ 'Identity(1,2)' ],
2459- lorentz = [ L.FFV1 ],
2460- couplings = {(0,0):C.GC_2})
2461+ lorentz = [ L.FFS1 ],
2462+ couplings = {(0,0):C.GC_34})
2463
2464 V_23 = Vertex(name = 'V_23',
2465- particles = [ P.t__tilde__, P.t, P.A ],
2466+ particles = [ P.d__tilde__, P.d, P.Z ],
2467 color = [ 'Identity(1,2)' ],
2468- lorentz = [ L.FFV1 ],
2469- couplings = {(0,0):C.GC_2})
2470+ lorentz = [ L.FFV2, L.FFV3 ],
2471+ couplings = {(0,0):C.GC_22,(0,1):C.GC_24})
2472
2473 V_24 = Vertex(name = 'V_24',
2474- particles = [ P.d__tilde__, P.d, P.G ],
2475- color = [ 'T(3,2,1)' ],
2476- lorentz = [ L.FFV1 ],
2477- couplings = {(0,0):C.GC_5})
2478+ particles = [ P.s__tilde__, P.s, P.Z ],
2479+ color = [ 'Identity(1,2)' ],
2480+ lorentz = [ L.FFV2, L.FFV3 ],
2481+ couplings = {(0,0):C.GC_22,(0,1):C.GC_24})
2482
2483 V_25 = Vertex(name = 'V_25',
2484- particles = [ P.s__tilde__, P.s, P.G ],
2485- color = [ 'T(3,2,1)' ],
2486- lorentz = [ L.FFV1 ],
2487- couplings = {(0,0):C.GC_5})
2488+ particles = [ P.b__tilde__, P.b, P.Z ],
2489+ color = [ 'Identity(1,2)' ],
2490+ lorentz = [ L.FFV2, L.FFV3 ],
2491+ couplings = {(0,1):C.GC_24,(0,0):C.GC_22})
2492
2493 V_26 = Vertex(name = 'V_26',
2494- particles = [ P.b__tilde__, P.b, P.G ],
2495- color = [ 'T(3,2,1)' ],
2496- lorentz = [ L.FFV1 ],
2497- couplings = {(0,0):C.GC_5})
2498+ particles = [ P.u__tilde__, P.d, P.W__plus__ ],
2499+ color = [ 'Identity(1,2)' ],
2500+ lorentz = [ L.FFV2 ],
2501+ couplings = {(0,0):C.GC_40})
2502
2503 V_27 = Vertex(name = 'V_27',
2504- particles = [ P.b__tilde__, P.b, P.H ],
2505+ particles = [ P.c__tilde__, P.d, P.W__plus__ ],
2506 color = [ 'Identity(1,2)' ],
2507- lorentz = [ L.FFS1 ],
2508- couplings = {(0,0):C.GC_33})
2509+ lorentz = [ L.FFV2 ],
2510+ couplings = {(0,0):C.GC_43})
2511
2512 V_28 = Vertex(name = 'V_28',
2513- particles = [ P.d__tilde__, P.d, P.Z ],
2514+ particles = [ P.t__tilde__, P.d, P.W__plus__ ],
2515 color = [ 'Identity(1,2)' ],
2516- lorentz = [ L.FFV2, L.FFV3 ],
2517- couplings = {(0,0):C.GC_21,(0,1):C.GC_23})
2518+ lorentz = [ L.FFV2 ],
2519+ couplings = {(0,0):C.GC_46})
2520
2521 V_29 = Vertex(name = 'V_29',
2522- particles = [ P.s__tilde__, P.s, P.Z ],
2523+ particles = [ P.u__tilde__, P.s, P.W__plus__ ],
2524 color = [ 'Identity(1,2)' ],
2525- lorentz = [ L.FFV2, L.FFV3 ],
2526- couplings = {(0,0):C.GC_21,(0,1):C.GC_23})
2527+ lorentz = [ L.FFV2 ],
2528+ couplings = {(0,0):C.GC_41})
2529
2530 V_30 = Vertex(name = 'V_30',
2531- particles = [ P.b__tilde__, P.b, P.Z ],
2532+ particles = [ P.c__tilde__, P.s, P.W__plus__ ],
2533 color = [ 'Identity(1,2)' ],
2534- lorentz = [ L.FFV2, L.FFV3 ],
2535- couplings = {(0,0):C.GC_21,(0,1):C.GC_23})
2536+ lorentz = [ L.FFV2 ],
2537+ couplings = {(0,0):C.GC_44})
2538
2539 V_31 = Vertex(name = 'V_31',
2540- particles = [ P.d__tilde__, P.u, P.W__minus__ ],
2541+ particles = [ P.t__tilde__, P.s, P.W__plus__ ],
2542 color = [ 'Identity(1,2)' ],
2543 lorentz = [ L.FFV2 ],
2544- couplings = {(0,0):C.GC_12})
2545+ couplings = {(0,0):C.GC_47})
2546
2547 V_32 = Vertex(name = 'V_32',
2548- particles = [ P.d__tilde__, P.c, P.W__minus__ ],
2549+ particles = [ P.u__tilde__, P.b, P.W__plus__ ],
2550 color = [ 'Identity(1,2)' ],
2551 lorentz = [ L.FFV2 ],
2552- couplings = {(0,0):C.GC_15})
2553+ couplings = {(0,0):C.GC_42})
2554
2555 V_33 = Vertex(name = 'V_33',
2556- particles = [ P.d__tilde__, P.t, P.W__minus__ ],
2557+ particles = [ P.c__tilde__, P.b, P.W__plus__ ],
2558 color = [ 'Identity(1,2)' ],
2559 lorentz = [ L.FFV2 ],
2560- couplings = {(0,0):C.GC_18})
2561+ couplings = {(0,0):C.GC_45})
2562
2563 V_34 = Vertex(name = 'V_34',
2564- particles = [ P.s__tilde__, P.u, P.W__minus__ ],
2565+ particles = [ P.t__tilde__, P.b, P.W__plus__ ],
2566 color = [ 'Identity(1,2)' ],
2567 lorentz = [ L.FFV2 ],
2568- couplings = {(0,0):C.GC_13})
2569+ couplings = {(0,0):C.GC_48})
2570
2571 V_35 = Vertex(name = 'V_35',
2572- particles = [ P.s__tilde__, P.c, P.W__minus__ ],
2573- color = [ 'Identity(1,2)' ],
2574- lorentz = [ L.FFV2 ],
2575- couplings = {(0,0):C.GC_16})
2576+ particles = [ P.e__plus__, P.e__minus__, P.A ],
2577+ color = [ '1' ],
2578+ lorentz = [ L.FFV1 ],
2579+ couplings = {(0,0):C.GC_3})
2580
2581 V_36 = Vertex(name = 'V_36',
2582- particles = [ P.s__tilde__, P.t, P.W__minus__ ],
2583- color = [ 'Identity(1,2)' ],
2584- lorentz = [ L.FFV2 ],
2585- couplings = {(0,0):C.GC_19})
2586+ particles = [ P.m__plus__, P.m__minus__, P.A ],
2587+ color = [ '1' ],
2588+ lorentz = [ L.FFV1 ],
2589+ couplings = {(0,0):C.GC_3})
2590
2591 V_37 = Vertex(name = 'V_37',
2592- particles = [ P.b__tilde__, P.u, P.W__minus__ ],
2593- color = [ 'Identity(1,2)' ],
2594- lorentz = [ L.FFV2 ],
2595- couplings = {(0,0):C.GC_14})
2596+ particles = [ P.tt__plus__, P.tt__minus__, P.A ],
2597+ color = [ '1' ],
2598+ lorentz = [ L.FFV1 ],
2599+ couplings = {(0,0):C.GC_3})
2600
2601 V_38 = Vertex(name = 'V_38',
2602- particles = [ P.b__tilde__, P.c, P.W__minus__ ],
2603- color = [ 'Identity(1,2)' ],
2604- lorentz = [ L.FFV2 ],
2605- couplings = {(0,0):C.GC_17})
2606+ particles = [ P.e__plus__, P.e__minus__, P.H ],
2607+ color = [ '1' ],
2608+ lorentz = [ L.FFS1 ],
2609+ couplings = {(0,0):C.GC_36})
2610
2611 V_39 = Vertex(name = 'V_39',
2612- particles = [ P.b__tilde__, P.t, P.W__minus__ ],
2613- color = [ 'Identity(1,2)' ],
2614- lorentz = [ L.FFV2 ],
2615- couplings = {(0,0):C.GC_20})
2616+ particles = [ P.m__plus__, P.m__minus__, P.H ],
2617+ color = [ '1' ],
2618+ lorentz = [ L.FFS1 ],
2619+ couplings = {(0,0):C.GC_37})
2620
2621 V_40 = Vertex(name = 'V_40',
2622- particles = [ P.u__tilde__, P.d, P.W__plus__ ],
2623- color = [ 'Identity(1,2)' ],
2624- lorentz = [ L.FFV2 ],
2625+ particles = [ P.tt__plus__, P.tt__minus__, P.H ],
2626+ color = [ '1' ],
2627+ lorentz = [ L.FFS1 ],
2628 couplings = {(0,0):C.GC_39})
2629
2630 V_41 = Vertex(name = 'V_41',
2631- particles = [ P.c__tilde__, P.d, P.W__plus__ ],
2632- color = [ 'Identity(1,2)' ],
2633- lorentz = [ L.FFV2 ],
2634- couplings = {(0,0):C.GC_42})
2635+ particles = [ P.e__plus__, P.e__minus__, P.Z ],
2636+ color = [ '1' ],
2637+ lorentz = [ L.FFV2, L.FFV4 ],
2638+ couplings = {(0,0):C.GC_22,(0,1):C.GC_25})
2639
2640 V_42 = Vertex(name = 'V_42',
2641- particles = [ P.t__tilde__, P.d, P.W__plus__ ],
2642- color = [ 'Identity(1,2)' ],
2643- lorentz = [ L.FFV2 ],
2644- couplings = {(0,0):C.GC_45})
2645+ particles = [ P.m__plus__, P.m__minus__, P.Z ],
2646+ color = [ '1' ],
2647+ lorentz = [ L.FFV2, L.FFV4 ],
2648+ couplings = {(0,0):C.GC_22,(0,1):C.GC_25})
2649
2650 V_43 = Vertex(name = 'V_43',
2651- particles = [ P.u__tilde__, P.s, P.W__plus__ ],
2652- color = [ 'Identity(1,2)' ],
2653- lorentz = [ L.FFV2 ],
2654- couplings = {(0,0):C.GC_40})
2655+ particles = [ P.tt__plus__, P.tt__minus__, P.Z ],
2656+ color = [ '1' ],
2657+ lorentz = [ L.FFV2, L.FFV4 ],
2658+ couplings = {(0,0):C.GC_22,(0,1):C.GC_25})
2659
2660 V_44 = Vertex(name = 'V_44',
2661- particles = [ P.c__tilde__, P.s, P.W__plus__ ],
2662- color = [ 'Identity(1,2)' ],
2663+ particles = [ P.ve__tilde__, P.e__minus__, P.W__plus__ ],
2664+ color = [ '1' ],
2665 lorentz = [ L.FFV2 ],
2666- couplings = {(0,0):C.GC_43})
2667+ couplings = {(0,0):C.GC_12})
2668
2669 V_45 = Vertex(name = 'V_45',
2670- particles = [ P.t__tilde__, P.s, P.W__plus__ ],
2671- color = [ 'Identity(1,2)' ],
2672+ particles = [ P.vm__tilde__, P.m__minus__, P.W__plus__ ],
2673+ color = [ '1' ],
2674 lorentz = [ L.FFV2 ],
2675- couplings = {(0,0):C.GC_46})
2676+ couplings = {(0,0):C.GC_12})
2677
2678 V_46 = Vertex(name = 'V_46',
2679- particles = [ P.u__tilde__, P.b, P.W__plus__ ],
2680- color = [ 'Identity(1,2)' ],
2681+ particles = [ P.vt__tilde__, P.tt__minus__, P.W__plus__ ],
2682+ color = [ '1' ],
2683 lorentz = [ L.FFV2 ],
2684- couplings = {(0,0):C.GC_41})
2685+ couplings = {(0,0):C.GC_12})
2686
2687 V_47 = Vertex(name = 'V_47',
2688- particles = [ P.c__tilde__, P.b, P.W__plus__ ],
2689+ particles = [ P.d__tilde__, P.u, P.W__minus__ ],
2690 color = [ 'Identity(1,2)' ],
2691 lorentz = [ L.FFV2 ],
2692- couplings = {(0,0):C.GC_44})
2693+ couplings = {(0,0):C.GC_13})
2694
2695 V_48 = Vertex(name = 'V_48',
2696- particles = [ P.t__tilde__, P.b, P.W__plus__ ],
2697+ particles = [ P.s__tilde__, P.u, P.W__minus__ ],
2698 color = [ 'Identity(1,2)' ],
2699 lorentz = [ L.FFV2 ],
2700- couplings = {(0,0):C.GC_47})
2701+ couplings = {(0,0):C.GC_14})
2702
2703 V_49 = Vertex(name = 'V_49',
2704- particles = [ P.u__tilde__, P.u, P.G ],
2705- color = [ 'T(3,2,1)' ],
2706- lorentz = [ L.FFV1 ],
2707- couplings = {(0,0):C.GC_5})
2708+ particles = [ P.b__tilde__, P.u, P.W__minus__ ],
2709+ color = [ 'Identity(1,2)' ],
2710+ lorentz = [ L.FFV2 ],
2711+ couplings = {(0,0):C.GC_15})
2712
2713 V_50 = Vertex(name = 'V_50',
2714- particles = [ P.c__tilde__, P.c, P.G ],
2715- color = [ 'T(3,2,1)' ],
2716- lorentz = [ L.FFV1 ],
2717- couplings = {(0,0):C.GC_5})
2718+ particles = [ P.d__tilde__, P.c, P.W__minus__ ],
2719+ color = [ 'Identity(1,2)' ],
2720+ lorentz = [ L.FFV2 ],
2721+ couplings = {(0,0):C.GC_16})
2722
2723 V_51 = Vertex(name = 'V_51',
2724- particles = [ P.t__tilde__, P.t, P.G ],
2725- color = [ 'T(3,2,1)' ],
2726- lorentz = [ L.FFV1 ],
2727- couplings = {(0,0):C.GC_5})
2728+ particles = [ P.s__tilde__, P.c, P.W__minus__ ],
2729+ color = [ 'Identity(1,2)' ],
2730+ lorentz = [ L.FFV2 ],
2731+ couplings = {(0,0):C.GC_17})
2732
2733 V_52 = Vertex(name = 'V_52',
2734- particles = [ P.e__plus__, P.e__minus__, P.H ],
2735- color = [ '1' ],
2736- lorentz = [ L.FFS1 ],
2737- couplings = {(0,0):C.GC_35})
2738+ particles = [ P.b__tilde__, P.c, P.W__minus__ ],
2739+ color = [ 'Identity(1,2)' ],
2740+ lorentz = [ L.FFV2 ],
2741+ couplings = {(0,0):C.GC_18})
2742
2743 V_53 = Vertex(name = 'V_53',
2744- particles = [ P.m__plus__, P.m__minus__, P.H ],
2745- color = [ '1' ],
2746- lorentz = [ L.FFS1 ],
2747- couplings = {(0,0):C.GC_36})
2748+ particles = [ P.d__tilde__, P.t, P.W__minus__ ],
2749+ color = [ 'Identity(1,2)' ],
2750+ lorentz = [ L.FFV2 ],
2751+ couplings = {(0,0):C.GC_19})
2752
2753 V_54 = Vertex(name = 'V_54',
2754- particles = [ P.tt__plus__, P.tt__minus__, P.H ],
2755- color = [ '1' ],
2756- lorentz = [ L.FFS1 ],
2757- couplings = {(0,0):C.GC_38})
2758+ particles = [ P.s__tilde__, P.t, P.W__minus__ ],
2759+ color = [ 'Identity(1,2)' ],
2760+ lorentz = [ L.FFV2 ],
2761+ couplings = {(0,0):C.GC_20})
2762
2763 V_55 = Vertex(name = 'V_55',
2764- particles = [ P.c__tilde__, P.c, P.H ],
2765+ particles = [ P.b__tilde__, P.t, P.W__minus__ ],
2766 color = [ 'Identity(1,2)' ],
2767- lorentz = [ L.FFS1 ],
2768- couplings = {(0,0):C.GC_34})
2769+ lorentz = [ L.FFV2 ],
2770+ couplings = {(0,0):C.GC_21})
2771
2772 V_56 = Vertex(name = 'V_56',
2773- particles = [ P.t__tilde__, P.t, P.H ],
2774+ particles = [ P.u__tilde__, P.u, P.A ],
2775 color = [ 'Identity(1,2)' ],
2776- lorentz = [ L.FFS1 ],
2777- couplings = {(0,0):C.GC_37})
2778+ lorentz = [ L.FFV1 ],
2779+ couplings = {(0,0):C.GC_2})
2780
2781 V_57 = Vertex(name = 'V_57',
2782- particles = [ P.e__plus__, P.e__minus__, P.Z ],
2783- color = [ '1' ],
2784- lorentz = [ L.FFV2, L.FFV4 ],
2785- couplings = {(0,0):C.GC_21,(0,1):C.GC_24})
2786+ particles = [ P.c__tilde__, P.c, P.A ],
2787+ color = [ 'Identity(1,2)' ],
2788+ lorentz = [ L.FFV1 ],
2789+ couplings = {(0,0):C.GC_2})
2790
2791 V_58 = Vertex(name = 'V_58',
2792- particles = [ P.m__plus__, P.m__minus__, P.Z ],
2793- color = [ '1' ],
2794- lorentz = [ L.FFV2, L.FFV4 ],
2795- couplings = {(0,0):C.GC_21,(0,1):C.GC_24})
2796+ particles = [ P.t__tilde__, P.t, P.A ],
2797+ color = [ 'Identity(1,2)' ],
2798+ lorentz = [ L.FFV1 ],
2799+ couplings = {(0,0):C.GC_2})
2800
2801 V_59 = Vertex(name = 'V_59',
2802- particles = [ P.tt__plus__, P.tt__minus__, P.Z ],
2803- color = [ '1' ],
2804- lorentz = [ L.FFV2, L.FFV4 ],
2805- couplings = {(0,0):C.GC_21,(0,1):C.GC_24})
2806+ particles = [ P.u__tilde__, P.u, P.G ],
2807+ color = [ 'T(3,2,1)' ],
2808+ lorentz = [ L.FFV1 ],
2809+ couplings = {(0,0):C.GC_5})
2810
2811 V_60 = Vertex(name = 'V_60',
2812- particles = [ P.e__plus__, P.ve, P.W__minus__ ],
2813- color = [ '1' ],
2814- lorentz = [ L.FFV2 ],
2815- couplings = {(0,0):C.GC_11})
2816+ particles = [ P.c__tilde__, P.c, P.G ],
2817+ color = [ 'T(3,2,1)' ],
2818+ lorentz = [ L.FFV1 ],
2819+ couplings = {(0,0):C.GC_5})
2820
2821 V_61 = Vertex(name = 'V_61',
2822- particles = [ P.m__plus__, P.vm, P.W__minus__ ],
2823- color = [ '1' ],
2824- lorentz = [ L.FFV2 ],
2825- couplings = {(0,0):C.GC_11})
2826+ particles = [ P.t__tilde__, P.t, P.G ],
2827+ color = [ 'T(3,2,1)' ],
2828+ lorentz = [ L.FFV1 ],
2829+ couplings = {(0,0):C.GC_5})
2830
2831 V_62 = Vertex(name = 'V_62',
2832- particles = [ P.tt__plus__, P.vt, P.W__minus__ ],
2833- color = [ '1' ],
2834- lorentz = [ L.FFV2 ],
2835- couplings = {(0,0):C.GC_11})
2836+ particles = [ P.c__tilde__, P.c, P.H ],
2837+ color = [ 'Identity(1,2)' ],
2838+ lorentz = [ L.FFS1 ],
2839+ couplings = {(0,0):C.GC_35})
2840
2841 V_63 = Vertex(name = 'V_63',
2842- particles = [ P.ve__tilde__, P.e__minus__, P.W__plus__ ],
2843- color = [ '1' ],
2844- lorentz = [ L.FFV2 ],
2845- couplings = {(0,0):C.GC_11})
2846+ particles = [ P.t__tilde__, P.t, P.H ],
2847+ color = [ 'Identity(1,2)' ],
2848+ lorentz = [ L.FFS1 ],
2849+ couplings = {(0,0):C.GC_38})
2850
2851 V_64 = Vertex(name = 'V_64',
2852- particles = [ P.vm__tilde__, P.m__minus__, P.W__plus__ ],
2853- color = [ '1' ],
2854- lorentz = [ L.FFV2 ],
2855- couplings = {(0,0):C.GC_11})
2856+ particles = [ P.u__tilde__, P.u, P.Z ],
2857+ color = [ 'Identity(1,2)' ],
2858+ lorentz = [ L.FFV2, L.FFV5 ],
2859+ couplings = {(0,0):C.GC_23,(0,1):C.GC_24})
2860
2861 V_65 = Vertex(name = 'V_65',
2862- particles = [ P.vt__tilde__, P.tt__minus__, P.W__plus__ ],
2863- color = [ '1' ],
2864- lorentz = [ L.FFV2 ],
2865- couplings = {(0,0):C.GC_11})
2866+ particles = [ P.c__tilde__, P.c, P.Z ],
2867+ color = [ 'Identity(1,2)' ],
2868+ lorentz = [ L.FFV2, L.FFV5 ],
2869+ couplings = {(0,0):C.GC_23,(0,1):C.GC_24})
2870
2871 V_66 = Vertex(name = 'V_66',
2872- particles = [ P.u__tilde__, P.u, P.Z ],
2873+ particles = [ P.t__tilde__, P.t, P.Z ],
2874 color = [ 'Identity(1,2)' ],
2875 lorentz = [ L.FFV2, L.FFV5 ],
2876- couplings = {(0,0):C.GC_22,(0,1):C.GC_23})
2877+ couplings = {(0,0):C.GC_23,(0,1):C.GC_24})
2878
2879 V_67 = Vertex(name = 'V_67',
2880- particles = [ P.c__tilde__, P.c, P.Z ],
2881- color = [ 'Identity(1,2)' ],
2882- lorentz = [ L.FFV2, L.FFV5 ],
2883- couplings = {(0,0):C.GC_22,(0,1):C.GC_23})
2884+ particles = [ P.e__plus__, P.ve, P.W__minus__ ],
2885+ color = [ '1' ],
2886+ lorentz = [ L.FFV2 ],
2887+ couplings = {(0,0):C.GC_12})
2888
2889 V_68 = Vertex(name = 'V_68',
2890- particles = [ P.t__tilde__, P.t, P.Z ],
2891- color = [ 'Identity(1,2)' ],
2892- lorentz = [ L.FFV2, L.FFV5 ],
2893- couplings = {(0,0):C.GC_22,(0,1):C.GC_23})
2894+ particles = [ P.m__plus__, P.vm, P.W__minus__ ],
2895+ color = [ '1' ],
2896+ lorentz = [ L.FFV2 ],
2897+ couplings = {(0,0):C.GC_12})
2898
2899 V_69 = Vertex(name = 'V_69',
2900+ particles = [ P.tt__plus__, P.vt, P.W__minus__ ],
2901+ color = [ '1' ],
2902+ lorentz = [ L.FFV2 ],
2903+ couplings = {(0,0):C.GC_12})
2904+
2905+V_70 = Vertex(name = 'V_70',
2906 particles = [ P.ve__tilde__, P.ve, P.Z ],
2907 color = [ '1' ],
2908 lorentz = [ L.FFV2 ],
2909- couplings = {(0,0):C.GC_28})
2910+ couplings = {(0,0):C.GC_29})
2911
2912-V_70 = Vertex(name = 'V_70',
2913+V_71 = Vertex(name = 'V_71',
2914 particles = [ P.vm__tilde__, P.vm, P.Z ],
2915 color = [ '1' ],
2916 lorentz = [ L.FFV2 ],
2917- couplings = {(0,0):C.GC_28})
2918+ couplings = {(0,0):C.GC_29})
2919
2920-V_71 = Vertex(name = 'V_71',
2921+V_72 = Vertex(name = 'V_72',
2922 particles = [ P.vt__tilde__, P.vt, P.Z ],
2923 color = [ '1' ],
2924 lorentz = [ L.FFV2 ],
2925- couplings = {(0,0):C.GC_28})
2926+ couplings = {(0,0):C.GC_29})
2927
2928
2929=== modified file 'models/sm/write_param_card.py'
2930--- models/sm/write_param_card.py 2011-03-20 16:49:47 +0000
2931+++ models/sm/write_param_card.py 2012-05-16 04:17:21 +0000
2932@@ -1,5 +1,5 @@
2933
2934-__date__ = "3 june 2010"
2935+__date__ = "22 Sept 2011"
2936 __author__ = 'olivier.mattelaer@uclouvain.be'
2937
2938 from function_library import *
2939@@ -162,7 +162,7 @@
2940 text += self.data % {'pdg': part.pdg_code,
2941 'name': part.name,
2942 'charge': 3 * part.charge,
2943- 'spin': 2 * part.spin + 1,
2944+ 'spin': part.spin,
2945 'color': part.color,
2946 'antipart': part.name != part.antiname and 1 or 0}
2947
2948
2949=== modified file 'tests/acceptance_tests/test_cmd.py'
2950--- tests/acceptance_tests/test_cmd.py 2012-03-20 19:55:40 +0000
2951+++ tests/acceptance_tests/test_cmd.py 2012-05-16 04:17:21 +0000
2952@@ -1001,18 +1001,19 @@
2953
2954 self.do('import model sm')
2955 self.assertEqual(len(self.cmd._curr_model.get('particles')), 17)
2956- self.assertEqual(len(self.cmd._curr_model.get('interactions')), 55)
2957+ self.assertEqual(len(self.cmd._curr_model.get('interactions')), 56)
2958 self.do('save model /tmp/model.pkl')
2959 self.do('import model mssm-full')
2960 self.do('load model /tmp/model.pkl')
2961 self.assertEqual(len(self.cmd._curr_model.get('particles')), 17)
2962- self.assertEqual(len(self.cmd._curr_model.get('interactions')), 55)
2963+ self.assertEqual(len(self.cmd._curr_model.get('interactions')), 56)
2964 self.do('generate mu+ mu- > ta+ ta-')
2965 self.assertEqual(len(self.cmd._curr_amps), 1)
2966 nicestring = """Process: mu+ mu- > ta+ ta- WEIGHTED=4
2967 2 diagrams:
2968-1 ((1(13),2(-13)>1(22),id:18),(3(-15),4(15),1(22),id:19)) (QCD=0,QED=2,WEIGHTED=4)
2969-2 ((1(13),2(-13)>1(23),id:57),(3(-15),4(15),1(23),id:58)) (QCD=0,QED=2,WEIGHTED=4)"""
2970+1 ((1(13),2(-13)>1(22),id:35),(3(-15),4(15),1(22),id:36)) (QCD=0,QED=2,WEIGHTED=4)
2971+2 ((1(13),2(-13)>1(23),id:41),(3(-15),4(15),1(23),id:42)) (QCD=0,QED=2,WEIGHTED=4)"""
2972+
2973 self.assertEqual(self.cmd._curr_amps[0].nice_string().split('\n'), nicestring.split('\n'))
2974 self.do('save processes /tmp/model.pkl')
2975 self.do('generate e+ e- > e+ e-')
2976
2977=== modified file 'tests/acceptance_tests/test_model_equivalence.py'
2978--- tests/acceptance_tests/test_model_equivalence.py 2012-03-20 21:46:23 +0000
2979+++ tests/acceptance_tests/test_model_equivalence.py 2012-05-16 04:17:21 +0000
2980@@ -121,7 +121,7 @@
2981 except ValueError:
2982 mg4_vertices.append(pdg_code_mg4)
2983
2984- self.assertEqual(ufo_vertices, []) # [[25,25,25,25]]
2985+ self.assertEqual(ufo_vertices, [[25,25,25,25]])
2986 self.assertEqual(mg4_vertices, [])
2987
2988 def test_mssm_equivalence(self):
2989@@ -299,7 +299,8 @@
2990 testprog = subprocess.Popen("./testprog", stdout=subprocess.PIPE,
2991 cwd=self.output_path,
2992 stderr=subprocess.STDOUT, shell=True)
2993- solutions={'CKM22 ': [1.0], 'G ': [1.2177157847767195], 'GC_1 ': [-0.0, -0.10265], 'GC_10 ': [0.0, 0.21336], 'GC_16 ': [0.0, 0.46191], 'GC_2 ': [0.0, 0.2053], 'GC_21 ': [-0.0, -0.28804], 'GC_22 ': [0.0, 0.28804], 'GC_23 ': [-0.0, -0.027437], 'GC_24 ': [0.0, 0.08231], 'GC_25 ': [0.0, 0.30795], 'GC_26 ': [-0.0, -0.35482], 'GC_27 ': [0.0, 0.094836], 'GC_28 ': [0.0, 0.37035], 'GC_29 ': [0.0, 0.27432], 'GC_3 ': [-0.0, -0.30795], 'GC_30 ': [-0.0, -175.45], 'GC_31 ': [0.0, 52.532], 'GC_32 ': [0.0, 67.544], 'GC_33 ': [-0.0, -0.017058], 'GC_37 ': [-0.0, -0.66811], 'GC_38 ': [-0.0, -0.0072172], 'GC_4 ': [-1.2177, 0.0], 'GC_5 ': [0.0, 1.2177], 'GC_6 ': [0.0, 1.4828], 'GC_7 ': [0.0, 0.57609], 'GC_8 ': [-0.0, -0.42671], 'GC_9 ': [0.0, 0.33188], 'G__exp__2 ': [1.4828317324943818], 'Gf ': [1.16639e-05], 'MB ': [4.7], 'MH ': [120.0], 'MH__exp__2 ': [14400.0], 'MT ': [173.0], 'MTA ': [1.777], 'MW ': [80.419002445756163], 'MW__exp__2 ': [6467.2159543705357], 'MZ ': [91.188], 'MZ__exp__2 ': [8315.25134], 'MZ__exp__4 ': [69143404.913893804], 'WH ': [0.005753088], 'WT ': [1.4915], 'WW ': [2.0476], 'WZ ': [2.441404], 'aEW ': [0.0075467711139788835], 'aEWM1 ': [132.507], 'aS ': [0.118], 'complexi ': (0.0, 1.0), 'cw ': [0.88190334743339216], 'cw__exp__2 ': [0.77775351421422245], 'ee ': [0.30795376724436879], 'ee__exp__2 ': [0.094835522759998875], 'g1 ': [0.34919219678733299], 'gw ': [0.6532329303475799], 'gw__exp__2 ': [0.42671326129048615], 'lam ': [0.11876576810517747], 'muH ': [84.852813742385706], 'sqrt__2 ': [1.4142135623730951], 'sqrt__aEW ': [0.086872153846781555], 'sqrt__aS ': [0.34351128074635334], 'sqrt__sw2 ': [0.4714302554840723], 'sw ': [0.4714302554840723], 'sw2 ': [0.22224648578577766], 'sw__exp__2 ': [0.22224648578577769], 'v ': [246.21845810181637], 'v__exp__2 ': [60623.529110035903], 'yb ': [0.024123686777011714], 'ymb ': [4.2], 'ymt ': [164.5], 'ymtau ': [1.777], 'yt ': [0.944844398766292], 'ytau ': [0.010206617000654717]}
2994+
2995+ solutions={'sqrt__aEW ': [0.0868721538], 'ymtau ': [1.777], 'GC_5 ': [0.0, 1.2177], 'sqrt__sw2 ': [0.471430255], 'sw__exp__2 ': [0.222246486], 'GC_11 ': [0.0, 0.21336], 'GC_3 ': [0.0, -0.30795], 'aEW ': [0.00754677111], 'MZ__exp__2 ': [8315.25134], 'MZ ': [91.188], 'WW ': [2.0476], 'GC_1 ': [0.0, -0.10265], 'GC_38 ': [0.0, -0.66811], 'GC_9 ': [0.0, 0.33188], 'GC_7 ': [0.0, 0.57609], 'GC_10 ': [0.0, -0.71259], 'ee__exp__2 ': [0.0948355228], 'aEWM1 ': [132.507], 'GC_29 ': [0.0, 0.37035], 'gw ': [0.65323293], 'ytau ': [0.010206617], 'GC_8 ': [0.0, -0.42671], 'MTA ': [1.777], 'sqrt__aS ': [0.343511281], 'MH ': [120.0], 'GC_27 ': [0.0, -0.35482], 'GC_31 ': [0.0, -175.45], 'GC_23 ': [0.0, 0.28804], 'aS ': [0.118], 'ymb ': [4.2], 'MZ__exp__4 ': [69143404.9], 'complexi ': [0.0, 1.0], 'yb ': [0.0241236868], 'MW__exp__2 ': [6467.21595], 'Gf ': [1.16639e-05], 'GC_33 ': [0.0, 67.544], 'ee ': [0.307953767], 'WZ ': [2.441404], 'v__exp__2 ': [60623.5291], 'v ': [246.218458], 'WH ': [0.005753088], 'cw__exp__2 ': [0.777753514], 'GC_6 ': [0.0, 1.4828], 'sw2 ': [0.222246486], 'GC_2 ': [0.0, 0.2053], 'GC_24 ': [0.0, -0.027437], 'MB ': [4.7], 'WT ': [1.4915], 'GC_28 ': [0.0, 0.094836], 'GC_4 ': [-1.2177, 0.0], 'MH__exp__2 ': [14400.0], 'ymt ': [164.5], 'GC_39 ': [0.0, -0.0072172], 'G__exp__2 ': [1.48283173], 'MT ': [173.0], 'lam ': [0.118765768], 'GC_25 ': [0.0, 0.08231], 'sw ': [0.471430255], 'gw__exp__2 ': [0.426713261], 'GC_26 ': [0.0, 0.30795], 'GC_34 ': [0.0, -0.017058], 'g1 ': [0.349192197], 'GC_22 ': [0.0, -0.28804], 'GC_30 ': [0.0, 0.27432], 'MW ': [80.4190024], 'CKM2x2 ': [1.0], 'muH ': [84.8528137], 'GC_17 ': [0.0, 0.46191], 'cw ': [0.881903347], 'sqrt__2 ': [1.41421356], 'GC_32 ': [0.0, 52.532], 'yt ': [0.944844399]}
2996 nb_value = 0
2997 for line in testprog.stdout:
2998 self.assertTrue('Warning' not in line)
2999@@ -325,8 +326,8 @@
3000 # solutions[variable] = [singlevalue]
3001 # else:
3002 # solutions[variable].append(singlevalue)
3003-
3004- self.assertEqual(nb_value, 71)
3005+
3006+ self.assertEqual(nb_value, 72)
3007
3008
3009
3010@@ -346,7 +347,7 @@
3011 alreadydefine.append(new_def)
3012 alreadydefine = [name.lower() for name in alreadydefine]
3013 alreadydefine.sort()
3014- solution = ['aew ', 'as ', 'ckm22 ', 'complexi ', 'cw ', 'cw__exp__2 ', 'ee ', 'ee__exp__2 ','g ', 'g1 ', 'g__exp__2 ', 'gal(1) ', 'gal(2) ', 'gw ', 'gw__exp__2 ', 'lam ', 'mh__exp__2 ', 'muh ', 'mw ', 'mw__exp__2 ', 'mz__exp__2 ', 'mz__exp__4 ', 'sqrt__2 ', 'sqrt__aew ', 'sqrt__as ', 'sqrt__sw2 ', 'sw ', 'sw2 ', 'sw__exp__2 ', 'v ', 'v__exp__2 ', 'yb ', 'yt ', 'ytau ']
3015+ solution = ['aew ', 'as ', 'ckm2x2 ', 'complexi ', 'cw ', 'cw__exp__2 ', 'ee ', 'ee__exp__2 ','g ', 'g1 ', 'g__exp__2 ', 'gal(1) ', 'gal(2) ', 'gw ', 'gw__exp__2 ', 'lam ', 'mh__exp__2 ', 'muh ', 'mw ', 'mw__exp__2 ', 'mz__exp__2 ', 'mz__exp__4 ', 'sqrt__2 ', 'sqrt__aew ', 'sqrt__as ', 'sqrt__sw2 ', 'sw ', 'sw2 ', 'sw__exp__2 ', 'v ', 'v__exp__2 ', 'yb ', 'yt ', 'ytau ']
3016 self.assertEqual(alreadydefine, solution)
3017
3018
3019
3020=== modified file 'tests/parallel_tests/compare_with_old_mg5_version.py'
3021--- tests/parallel_tests/compare_with_old_mg5_version.py 2012-02-27 16:23:02 +0000
3022+++ tests/parallel_tests/compare_with_old_mg5_version.py 2012-05-16 04:17:21 +0000
3023@@ -38,7 +38,7 @@
3024 """A class to compare the value of a old MG5 version and the current one"""
3025
3026 old_mg5 = None # link to the previous version of MG5 (prevent multiple build)
3027- reference_number = 186 #146 corresponds to 1.3.3
3028+ reference_number = 229 #186 #146 corresponds to 1.3.3
3029 nb_test = 0
3030
3031
3032
3033=== modified file 'tests/parallel_tests/input_files/mg5_short_paralleltest_sm.pkl'
3034Binary files tests/parallel_tests/input_files/mg5_short_paralleltest_sm.pkl 2011-11-28 20:34:18 +0000 and tests/parallel_tests/input_files/mg5_short_paralleltest_sm.pkl 2012-05-16 04:17:21 +0000 differ
3035=== modified file 'tests/unit_tests/iolibs/test_export_cpp.py'
3036--- tests/unit_tests/iolibs/test_export_cpp.py 2012-02-17 06:01:41 +0000
3037+++ tests/unit_tests/iolibs/test_export_cpp.py 2012-05-16 04:17:21 +0000
3038@@ -1300,6 +1300,562 @@
3039 #print open(self.give_pos('test.cc')).read()
3040 self.assertFileContains('test.cc', goal_string)
3041
3042+ def test_write_cpp_four_fermion_vertex(self):
3043+ """Testing process u u > t t g with fermion flow (u~t)(u~t)
3044+ """
3045+
3046+ # Set up model
3047+
3048+ mypartlist = base_objects.ParticleList()
3049+ myinterlist = base_objects.InteractionList()
3050+
3051+ # A u quark and its antiparticle
3052+ mypartlist.append(base_objects.Particle({'name':'u',
3053+ 'antiname':'u~',
3054+ 'spin':2,
3055+ 'color':3,
3056+ 'mass':'zero',
3057+ 'width':'zero',
3058+ 'texname':'u',
3059+ 'antitexname':'\bar u',
3060+ 'line':'straight',
3061+ 'charge':2. / 3.,
3062+ 'pdg_code':2,
3063+ 'propagating':True,
3064+ 'is_part':True,
3065+ 'self_antipart':False}))
3066+ u = mypartlist[len(mypartlist) - 1]
3067+ antiu = copy.copy(u)
3068+ antiu.set('is_part', False)
3069+
3070+ # A t quark and its antiparticle
3071+ mypartlist.append(base_objects.Particle({'name':'t',
3072+ 'antiname':'t~',
3073+ 'spin':2,
3074+ 'color':3,
3075+ 'mass':'MT',
3076+ 'width':'WT',
3077+ 'texname':'t',
3078+ 'antitexname':'\bar t',
3079+ 'line':'straight',
3080+ 'charge':2. / 3.,
3081+ 'pdg_code':6,
3082+ 'propagating':True,
3083+ 'is_part':True,
3084+ 'self_antipart':False}))
3085+ t = mypartlist[len(mypartlist) - 1]
3086+ antit = copy.copy(t)
3087+ antit.set('is_part', False)
3088+
3089+ # A gluon
3090+ mypartlist.append(base_objects.Particle({'name':'g',
3091+ 'antiname':'g',
3092+ 'spin':3,
3093+ 'color':8,
3094+ 'mass':'zero',
3095+ 'width':'zero',
3096+ 'texname':'g',
3097+ 'antitexname':'g',
3098+ 'line':'curly',
3099+ 'charge':0.,
3100+ 'pdg_code':21,
3101+ 'propagating':True,
3102+ 'is_part':True,
3103+ 'self_antipart':True}))
3104+
3105+ g = mypartlist[len(mypartlist) - 1]
3106+
3107+ # Gluon couplings to quarks
3108+ myinterlist.append(base_objects.Interaction({
3109+ 'id': 1,
3110+ 'particles': base_objects.ParticleList(\
3111+ [antiu, \
3112+ u, \
3113+ g]),
3114+ 'color': [color.ColorString([color.T(2, 1, 0)])],
3115+ 'lorentz':['FFV1'],
3116+ 'couplings':{(0, 0):'GG'},
3117+ 'orders':{'QCD':1}}))
3118+
3119+ myinterlist.append(base_objects.Interaction({
3120+ 'id': 2,
3121+ 'particles': base_objects.ParticleList(\
3122+ [antit, \
3123+ t, \
3124+ g]),
3125+ 'color': [color.ColorString([color.T(2, 1, 0)])],
3126+ 'lorentz':['FFV1'],
3127+ 'couplings':{(0, 0):'GG'},
3128+ 'orders':{'QCD':1}}))
3129+
3130+ # Four fermion vertex
3131+ myinterlist.append(base_objects.Interaction({
3132+ 'id': 3,
3133+ 'particles': base_objects.ParticleList(\
3134+ [antiu,
3135+ t,
3136+ antiu,
3137+ t]),
3138+ 'color': [color.ColorString([color.T(1, 0),
3139+ color.T(3, 2)])],
3140+ 'lorentz':['FFFF1'],
3141+ 'couplings':{(0, 0):'GEFF'},
3142+ 'orders':{'NP':2}}))
3143+
3144+ mybasemodel = base_objects.Model()
3145+ mybasemodel.set('particles', mypartlist)
3146+ mybasemodel.set('interactions', myinterlist)
3147+
3148+ myleglist = base_objects.LegList()
3149+
3150+ myleglist.append(base_objects.Leg({'id':2,
3151+ 'state':False}))
3152+ myleglist.append(base_objects.Leg({'id':2,
3153+ 'state':False}))
3154+ myleglist.append(base_objects.Leg({'id':6,
3155+ 'state':True}))
3156+ myleglist.append(base_objects.Leg({'id':6,
3157+ 'state':True}))
3158+ myleglist.append(base_objects.Leg({'id':21,
3159+ 'state':True}))
3160+
3161+ myproc = base_objects.Process({'legs':myleglist,
3162+ 'model':mybasemodel})
3163+
3164+ myamplitude = diagram_generation.Amplitude({'process': myproc})
3165+
3166+ matrix_element = helas_objects.HelasMultiProcess(myamplitude)
3167+ matrix_element.get('matrix_elements')[0].set('has_mirror_process',
3168+ True)
3169+
3170+ goal_string = \
3171+"""//==========================================================================
3172+// This file has been automatically generated for Pythia 8
3173+// MadGraph 5 v. %(version)s, %(date)s
3174+// By the MadGraph Development Team
3175+// Please visit us at https://launchpad.net/madgraph5
3176+//==========================================================================
3177+
3178+#ifndef Pythia8_Sigma__uu_ttg_H
3179+#define Pythia8_Sigma__uu_ttg_H
3180+
3181+#include <complex>
3182+
3183+#include "SigmaProcess.h"
3184+#include "Parameters_.h"
3185+
3186+using namespace std;
3187+
3188+namespace Pythia8
3189+{
3190+//==========================================================================
3191+// A class for calculating the matrix elements for
3192+// Process: u u > t t g
3193+//--------------------------------------------------------------------------
3194+
3195+class Sigma__uu_ttg : public Sigma3Process
3196+{
3197+ public:
3198+
3199+ // Constructor.
3200+ Sigma__uu_ttg() {}
3201+
3202+ // Initialize process.
3203+ virtual void initProc();
3204+
3205+ // Calculate flavour-independent parts of cross section.
3206+ virtual void sigmaKin();
3207+
3208+ // Evaluate sigmaHat(sHat).
3209+ virtual double sigmaHat();
3210+
3211+ // Select flavour, colour and anticolour.
3212+ virtual void setIdColAcol();
3213+
3214+ // Evaluate weight for decay angles.
3215+ virtual double weightDecay(Event& process, int iResBeg, int iResEnd);
3216+
3217+ // Info on the subprocess.
3218+ virtual string name() const {return "u u > t t g ()";}
3219+
3220+ virtual int code() const {return 10000;}
3221+
3222+ virtual string inFlux() const {return "qq";}
3223+ int id3Mass() const {return 6;}
3224+ int id4Mass() const {return 6;}
3225+ virtual int resonanceA() const {return 6;}
3226+ // Tell Pythia that sigmaHat returns the ME^2
3227+ virtual bool convertM2() const {return true;}
3228+
3229+ private:
3230+
3231+ // Private functions to calculate the matrix element for all subprocesses
3232+ // Calculate wavefunctions
3233+ void calculate_wavefunctions(const int perm[], const int hel[]);
3234+ static const int nwavefuncs = 9;
3235+ std::complex<double> w[nwavefuncs][18];
3236+ static const int namplitudes = 4;
3237+ std::complex<double> amp[namplitudes];
3238+ double matrix_uu_ttg();
3239+
3240+ // Constants for array limits
3241+ static const int nexternal = 5;
3242+ static const int nprocesses = 2;
3243+
3244+ // Store the matrix element value from sigmaKin
3245+ double matrix_element[nprocesses];
3246+
3247+ // Color flows, used when selecting color
3248+ double * jamp2[nprocesses];
3249+
3250+ // Pointer to the model parameters
3251+ Parameters_ * pars;
3252+
3253+};
3254+
3255+} // end namespace Pythia
3256+
3257+#endif // Pythia8_Sigma__uu_ttg_H
3258+""" % misc.get_pkg_info()
3259+
3260+ exporter = export_cpp.ProcessExporterPythia8(matrix_element,
3261+ self.mycppwriter)
3262+
3263+ exporter.write_process_h_file(\
3264+ writers.CPPWriter(self.give_pos('test.h')))
3265+
3266+ #print open(self.give_pos('test.h')).read()
3267+ self.assertFileContains('test.h', goal_string)
3268+
3269+ goal_string = \
3270+"""//==========================================================================
3271+// This file has been automatically generated for Pythia 8 by
3272+// MadGraph 5 v. 1.4.6, 2012-04-XX
3273+// By the MadGraph Development Team
3274+// Please visit us at https://launchpad.net/madgraph5
3275+//==========================================================================
3276+
3277+#include "Sigma__uu_ttg.h"
3278+#include "HelAmps_.h"
3279+
3280+using namespace Pythia8_;
3281+
3282+namespace Pythia8
3283+{
3284+
3285+//==========================================================================
3286+// Class member functions for calculating the matrix elements for
3287+// Process: u u > t t g
3288+
3289+//--------------------------------------------------------------------------
3290+// Initialize process.
3291+
3292+void Sigma__uu_ttg::initProc()
3293+{
3294+ // Instantiate the model class and set parameters that stay fixed during run
3295+ pars = Parameters_::getInstance();
3296+ pars->setIndependentParameters(particleDataPtr, couplingsPtr, slhaPtr);
3297+ pars->setIndependentCouplings();
3298+ // Set massive/massless matrix elements for c/b/mu/tau
3299+ mcME = 0.;
3300+ mbME = 0.;
3301+ mmuME = 0.;
3302+ mtauME = 0.;
3303+ jamp2[0] = new double[3];
3304+}
3305+
3306+//--------------------------------------------------------------------------
3307+// Evaluate |M|^2, part independent of incoming flavour.
3308+
3309+void Sigma__uu_ttg::sigmaKin()
3310+{
3311+ // Set the parameters which change event by event
3312+ pars->setDependentParameters(particleDataPtr, couplingsPtr, slhaPtr, alpS);
3313+ pars->setDependentCouplings();
3314+ // Reset color flows
3315+ for(int i = 0; i < 3; i++ )
3316+ jamp2[0][i] = 0.;
3317+
3318+ // Local variables and constants
3319+ const int ncomb = 32;
3320+ static bool goodhel[ncomb] = {ncomb * false};
3321+ static int ntry = 0, sum_hel = 0, ngood = 0;
3322+ static int igood[ncomb];
3323+ static int jhel;
3324+ double t[nprocesses];
3325+ // Helicities for the process
3326+ static const int helicities[ncomb][nexternal] = {{-1, -1, -1, -1, -1}, {-1,
3327+ -1, -1, -1, 1}, {-1, -1, -1, 1, -1}, {-1, -1, -1, 1, 1}, {-1, -1, 1, -1,
3328+ -1}, {-1, -1, 1, -1, 1}, {-1, -1, 1, 1, -1}, {-1, -1, 1, 1, 1}, {-1, 1,
3329+ -1, -1, -1}, {-1, 1, -1, -1, 1}, {-1, 1, -1, 1, -1}, {-1, 1, -1, 1, 1},
3330+ {-1, 1, 1, -1, -1}, {-1, 1, 1, -1, 1}, {-1, 1, 1, 1, -1}, {-1, 1, 1, 1,
3331+ 1}, {1, -1, -1, -1, -1}, {1, -1, -1, -1, 1}, {1, -1, -1, 1, -1}, {1, -1,
3332+ -1, 1, 1}, {1, -1, 1, -1, -1}, {1, -1, 1, -1, 1}, {1, -1, 1, 1, -1}, {1,
3333+ -1, 1, 1, 1}, {1, 1, -1, -1, -1}, {1, 1, -1, -1, 1}, {1, 1, -1, 1, -1},
3334+ {1, 1, -1, 1, 1}, {1, 1, 1, -1, -1}, {1, 1, 1, -1, 1}, {1, 1, 1, 1, -1},
3335+ {1, 1, 1, 1, 1}};
3336+ // Denominators: spins, colors and identical particles
3337+ const int denominators[nprocesses] = {72, 72};
3338+
3339+ ntry = ntry + 1;
3340+
3341+ // Reset the matrix elements
3342+ for(int i = 0; i < nprocesses; i++ )
3343+ {
3344+ matrix_element[i] = 0.;
3345+ t[i] = 0.;
3346+ }
3347+
3348+ // Define permutation
3349+ int perm[nexternal];
3350+ for(int i = 0; i < nexternal; i++ )
3351+ {
3352+ perm[i] = i;
3353+ }
3354+
3355+ // For now, call setupForME() here
3356+ id1 = 2;
3357+ id2 = 2;
3358+ if( !setupForME())
3359+ {
3360+ return;
3361+ }
3362+
3363+ if (sum_hel == 0 || ntry < 10)
3364+ {
3365+ // Calculate the matrix element for all helicities
3366+ for(int ihel = 0; ihel < ncomb; ihel++ )
3367+ {
3368+ if (goodhel[ihel] || ntry < 2)
3369+ {
3370+ calculate_wavefunctions(perm, helicities[ihel]);
3371+ t[0] = matrix_uu_ttg();
3372+ // Mirror initial state momenta for mirror process
3373+ perm[0] = 1;
3374+ perm[1] = 0;
3375+ // Calculate wavefunctions
3376+ calculate_wavefunctions(perm, helicities[ihel]);
3377+ // Mirror back
3378+ perm[0] = 0;
3379+ perm[1] = 1;
3380+ // Calculate matrix elements
3381+ t[1] = matrix_uu_ttg();
3382+ double tsum = 0;
3383+ for(int iproc = 0; iproc < nprocesses; iproc++ )
3384+ {
3385+ matrix_element[iproc] += t[iproc];
3386+ tsum += t[iproc];
3387+ }
3388+ // Store which helicities give non-zero result
3389+ if (tsum != 0. && !goodhel[ihel])
3390+ {
3391+ goodhel[ihel] = true;
3392+ ngood++;
3393+ igood[ngood] = ihel;
3394+ }
3395+ }
3396+ }
3397+ jhel = 0;
3398+ sum_hel = min(sum_hel, ngood);
3399+ }
3400+ else
3401+ {
3402+ // Only use the "good" helicities
3403+ for(int j = 0; j < sum_hel; j++ )
3404+ {
3405+ jhel++;
3406+ if (jhel >= ngood)
3407+ jhel = 0;
3408+ double hwgt = double(ngood)/double(sum_hel);
3409+ int ihel = igood[jhel];
3410+ calculate_wavefunctions(perm, helicities[ihel]);
3411+ t[0] = matrix_uu_ttg();
3412+ // Mirror initial state momenta for mirror process
3413+ perm[0] = 1;
3414+ perm[1] = 0;
3415+ // Calculate wavefunctions
3416+ calculate_wavefunctions(perm, helicities[ihel]);
3417+ // Mirror back
3418+ perm[0] = 0;
3419+ perm[1] = 1;
3420+ // Calculate matrix elements
3421+ t[1] = matrix_uu_ttg();
3422+ for(int iproc = 0; iproc < nprocesses; iproc++ )
3423+ {
3424+ matrix_element[iproc] += t[iproc] * hwgt;
3425+ }
3426+ }
3427+ }
3428+
3429+ for (int i = 0; i < nprocesses; i++ )
3430+ matrix_element[i] /= denominators[i];
3431+
3432+
3433+
3434+}
3435+
3436+//--------------------------------------------------------------------------
3437+// Evaluate |M|^2, including incoming flavour dependence.
3438+
3439+double Sigma__uu_ttg::sigmaHat()
3440+{
3441+ // Select between the different processes
3442+ if(id1 == 2 && id2 == 2)
3443+ {
3444+ // Add matrix elements for processes with beams (2, 2)
3445+ return matrix_element[0] + matrix_element[1];
3446+ }
3447+ else
3448+ {
3449+ // Return 0 if not correct initial state assignment
3450+ return 0.;
3451+ }
3452+}
3453+
3454+//--------------------------------------------------------------------------
3455+// Select identity, colour and anticolour.
3456+
3457+void Sigma__uu_ttg::setIdColAcol()
3458+{
3459+ if(id1 == 2 && id2 == 2)
3460+ {
3461+ // Pick one of the flavor combinations (6, 6, 21)
3462+ int flavors[1][3] = {{6, 6, 21}};
3463+ vector<double> probs;
3464+ double sum = matrix_element[0];
3465+ probs.push_back(matrix_element[0]/sum);
3466+ int choice = rndmPtr->pick(probs);
3467+ id3 = flavors[choice][0];
3468+ id4 = flavors[choice][1];
3469+ id5 = flavors[choice][2];
3470+ }
3471+ setId(id1, id2, id3, id4, id5);
3472+ // Pick color flow
3473+ int ncolor[1] = {3};
3474+ if(id1 == 2 && id2 == 2 && id3 == 6 && id4 == 6 && id5 == 21)
3475+ {
3476+ vector<double> probs;
3477+ double sum = jamp2[0][0] + jamp2[0][1] + jamp2[0][2];
3478+ for(int i = 0; i < ncolor[0]; i++ )
3479+ probs.push_back(jamp2[0][i]/sum);
3480+ int ic = rndmPtr->pick(probs);
3481+ static int colors[3][10] = {{3, 0, 1, 0, 1, 0, 2, 0, 3, 2}, {2, 0, 3, 0, 1,
3482+ 0, 2, 0, 3, 1}, {3, 0, 2, 0, 1, 0, 2, 0, 3, 1}};
3483+ setColAcol(colors[ic][0], colors[ic][1], colors[ic][2], colors[ic][3],
3484+ colors[ic][4], colors[ic][5], colors[ic][6], colors[ic][7],
3485+ colors[ic][8], colors[ic][9]);
3486+ }
3487+ else if(id1 == 2 && id2 == 2 && id3 == 6 && id4 == 6 && id5 == 21)
3488+ {
3489+ vector<double> probs;
3490+ double sum = jamp2[0][0] + jamp2[0][1] + jamp2[0][2];
3491+ for(int i = 0; i < ncolor[0]; i++ )
3492+ probs.push_back(jamp2[0][i]/sum);
3493+ int ic = rndmPtr->pick(probs);
3494+ static int colors[3][10] = {{1, 0, 3, 0, 1, 0, 2, 0, 3, 2}, {3, 0, 2, 0, 1,
3495+ 0, 2, 0, 3, 1}, {2, 0, 3, 0, 1, 0, 2, 0, 3, 1}};
3496+ setColAcol(colors[ic][0], colors[ic][1], colors[ic][2], colors[ic][3],
3497+ colors[ic][4], colors[ic][5], colors[ic][6], colors[ic][7],
3498+ colors[ic][8], colors[ic][9]);
3499+ }
3500+}
3501+
3502+//--------------------------------------------------------------------------
3503+// Evaluate weight for angles of decay products in process
3504+
3505+double Sigma__uu_ttg::weightDecay(Event& process, int iResBeg, int iResEnd)
3506+{
3507+ // Just use isotropic decay (default)
3508+ return 1.;
3509+}
3510+
3511+//==========================================================================
3512+// Private class member functions
3513+
3514+//--------------------------------------------------------------------------
3515+// Evaluate |M|^2 for each subprocess
3516+
3517+void Sigma__uu_ttg::calculate_wavefunctions(const int perm[], const int hel[])
3518+{
3519+ // Calculate wavefunctions for all processes
3520+ double p[nexternal][4];
3521+ int i;
3522+
3523+ // Convert Pythia 4-vectors to double[]
3524+ for(i = 0; i < nexternal; i++ )
3525+ {
3526+ p[i][0] = pME[i].e();
3527+ p[i][1] = pME[i].px();
3528+ p[i][2] = pME[i].py();
3529+ p[i][3] = pME[i].pz();
3530+ }
3531+
3532+ // Calculate all wavefunctions
3533+ ixxxxx(p[perm[0]], mME[0], hel[0], +1, w[0]);
3534+ ixxxxx(p[perm[1]], mME[1], hel[1], +1, w[1]);
3535+ oxxxxx(p[perm[2]], mME[2], hel[2], +1, w[2]);
3536+ oxxxxx(p[perm[3]], mME[3], hel[3], +1, w[3]);
3537+ vxxxxx(p[perm[4]], mME[4], hel[4], +1, w[4]);
3538+ FFV1_2(w[0], w[4], pars->GG, pars->zero, pars->zero, w[5]);
3539+ FFFF1_2(w[0], w[1], w[2], pars->GEFF, pars->MT, pars->WT, w[6]);
3540+ FFFF1_2(w[0], w[1], w[3], pars->GEFF, pars->MT, pars->WT, w[7]);
3541+ FFFF1_1(w[2], w[0], w[3], pars->GEFF, pars->zero, pars->zero, w[8]);
3542+
3543+ // Calculate all amplitudes
3544+ // Amplitude(s) for diagram number 0
3545+ FFFF1_0(w[1], w[2], w[5], w[3], pars->GEFF, amp[0]);
3546+ FFV1_0(w[6], w[3], w[4], pars->GG, amp[1]);
3547+ FFV1_0(w[7], w[2], w[4], pars->GG, amp[2]);
3548+ FFV1_0(w[1], w[8], w[4], pars->GG, amp[3]);
3549+
3550+
3551+}
3552+double Sigma__uu_ttg::matrix_uu_ttg()
3553+{
3554+ int i, j;
3555+ // Local variables
3556+ const int ngraphs = 4;
3557+ const int ncolor = 3;
3558+ std::complex<double> ztemp;
3559+ std::complex<double> jamp[ncolor];
3560+ // The color matrix;
3561+ static const double denom[ncolor] = {1, 1, 1};
3562+ static const double cf[ncolor][ncolor] = {{12, 0, 4}, {0, 12, 4}, {4, 4,
3563+ 12}};
3564+
3565+ // Calculate color flows
3566+ jamp[0] = +amp[0] + amp[1];
3567+ jamp[1] = +amp[3];
3568+ jamp[2] = -amp[2];
3569+
3570+ // Sum and square the color flows to get the matrix element
3571+ double matrix = 0;
3572+ for(i = 0; i < ncolor; i++ )
3573+ {
3574+ ztemp = 0.;
3575+ for(j = 0; j < ncolor; j++ )
3576+ ztemp = ztemp + cf[i][j] * jamp[j];
3577+ matrix = matrix + real(ztemp * conj(jamp[i]))/denom[i];
3578+ }
3579+
3580+ // Store the leading color flows for choice of color
3581+ for(i = 0; i < ncolor; i++ )
3582+ jamp2[0][i] += real(jamp[i] * conj(jamp[i]));
3583+
3584+ return matrix;
3585+}
3586+
3587+
3588+} // end namespace Pythia
3589+"""
3590+
3591+ exporter.write_process_cc_file(\
3592+ writers.CPPWriter(self.give_pos('test.cc')))
3593+
3594+ #print open(self.give_pos('test.cc')).read()
3595+ self.assertFileContains('test.cc', goal_string)
3596+
3597+
3598 def disabled_test_write_process_files(self):
3599 """Test writing the .h and .cc Pythia file for a matrix element"""
3600
3601@@ -1312,6 +1868,7 @@
3602 print "cd /tmp; g++ -c -I $PATH_TO_PYTHIA8/include Sigma_sm_qqx_qqx.cc.cc"
3603
3604
3605+
3606 #===============================================================================
3607 # ExportUFOModelPythia8Test
3608 #===============================================================================
3609@@ -1340,68 +1897,54 @@
3610 """Test writing the Pythia model parameter files"""
3611
3612 goal_file_h = \
3613-"""//==========================================================================
3614-// This file has been automatically generated for Pythia 8
3615+"""//==========================================================================\n
3616+// This file has been automatically generated for Pythia 8\n
3617 # MadGraph 5 v. %(version)s, %(date)s
3618-# By the MadGraph Development Team
3619-# Please visit us at https://launchpad.net/madgraph5
3620-//==========================================================================
3621-
3622-#ifndef Pythia8_parameters_sm_H
3623-#define Pythia8_parameters_sm_H
3624-
3625-#include <complex>
3626-
3627-#include "ParticleData.h"
3628-#include "StandardModel.h"
3629-#include "SusyLesHouches.h"
3630-
3631-using namespace std;
3632-
3633-namespace Pythia8 {
3634-
3635-class Parameters_sm
3636-{
3637-public:
3638-
3639-static Parameters_sm* getInstance();
3640-
3641-// Model parameters independent of aS
3642-double WTau,WH,WW,WZ,WT,MTA,MM,Me,MH,MZ,MB,MT,MC,ymtau,ymm,yme,ymt,ymb,ymc,etaWS,rhoWS,AWS,lamWS,Gf,aEWM1,ZERO,lamWS__exp__2,lamWS__exp__3,MZ__exp__2,MZ__exp__4,sqrt__2,MH__exp__2,aEW,MW,sqrt__aEW,ee,MW__exp__2,sw2,cw,sqrt__sw2,sw,g1,gw,v,v__exp__2,lam,yb,yc,ye,ym,yt,ytau,muH,gw__exp__2,cw__exp__2,ee__exp__2,sw__exp__2;
3643-std::complex<double> CKM11,CKM12,complexi,CKM13,CKM21,CKM22,CKM23,CKM31,CKM32,CKM33,conjg__CKM11,conjg__CKM12,conjg__CKM13,conjg__CKM21,conjg__CKM22,conjg__CKM23,conjg__CKM31,conjg__CKM32,conjg__CKM33;
3644-// Model parameters dependent on aS
3645-double aS,sqrt__aS,G,G__exp__2;
3646-// Model couplings independent of aS
3647-std::complex<double> GC_1,GC_2,GC_3,GC_7,GC_8,GC_9,GC_10,GC_11,GC_12,GC_13,GC_14,GC_15,GC_16,GC_17,GC_18,GC_19,GC_20,GC_21,GC_22,GC_23,GC_24,GC_25,GC_26,GC_27,GC_28,GC_29,GC_30,GC_31,GC_32,GC_33,GC_34,GC_35,GC_36,GC_37,GC_38,GC_39,GC_40,GC_41,GC_42,GC_43,GC_44,GC_45,GC_46,GC_47;
3648-// Model couplings dependent on aS
3649-std::complex<double> GC_6,GC_5,GC_4;
3650-
3651-// Set parameters that are unchanged during the run
3652-void setIndependentParameters(ParticleData*& pd, Couplings*& csm, SusyLesHouches*& slhaPtr);
3653-// Set couplings that are unchanged during the run
3654-void setIndependentCouplings();
3655-// Set parameters that are changed event by event
3656-void setDependentParameters(ParticleData*& pd, Couplings*& csm, SusyLesHouches*& slhaPtr, double alpS);
3657-// Set couplings that are changed event by event
3658-void setDependentCouplings();
3659-
3660-// Print parameters that are unchanged during the run
3661-void printIndependentParameters();
3662-// Print couplings that are unchanged during the run
3663-void printIndependentCouplings();
3664-// Print parameters that are changed event by event
3665-void printDependentParameters();
3666-// Print couplings that are changed event by event
3667-void printDependentCouplings();
3668-
3669-
3670- private:
3671-static Parameters_sm* instance;
3672-};
3673-
3674-} // end namespace Pythia8
3675-#endif // Pythia8_parameters_sm_H
3676-""" % misc.get_pkg_info()
3677+# By the MadGraph Development Team\n
3678+# Please visit us at https://launchpad.net/madgraph5\n
3679+//==========================================================================\n\n
3680+#ifndef Pythia8_parameters_sm_H\n
3681+#define Pythia8_parameters_sm_H\n\n
3682+#include <complex>\n\n
3683+#include "ParticleData.h"\n
3684+#include "StandardModel.h"\n
3685+#include "SusyLesHouches.h"\n\n
3686+using namespace std;\n\n
3687+namespace Pythia8 {\n\n
3688+class Parameters_sm\n
3689+{\n
3690+public:\n\n
3691+static Parameters_sm* getInstance();\n\n
3692+// Model parameters independent of aS\n
3693+double WTau,WH,WW,WZ,WT,MTA,MM,Me,MH,MZ,MB,MT,MC,ymtau,ymm,yme,ymt,ymb,ymc,etaWS,rhoWS,AWS,lamWS,Gf,aEWM1,ZERO,lamWS__exp__2,lamWS__exp__3,MZ__exp__2,MZ__exp__4,sqrt__2,MH__exp__2,aEW,MW,sqrt__aEW,ee,MW__exp__2,sw2,cw,sqrt__sw2,sw,g1,gw,v,v__exp__2,lam,yb,yc,ye,ym,yt,ytau,muH,gw__exp__2,cw__exp__2,ee__exp__2,sw__exp__2;\n
3694+std::complex<double> CKM1x1,CKM1x2,complexi,CKM1x3,CKM2x1,CKM2x2,CKM2x3,CKM3x1,CKM3x2,CKM3x3,conjg__CKM1x1,conjg__CKM1x2,conjg__CKM1x3,conjg__CKM2x1,conjg__CKM2x2,conjg__CKM2x3,conjg__CKM3x1,conjg__CKM3x2,conjg__CKM3x3;\n
3695+// Model parameters dependent on aS\n
3696+double aS,sqrt__aS,G,G__exp__2;\n
3697+// Model couplings independent of aS\n
3698+std::complex<double> GC_1,GC_2,GC_3,GC_7,GC_8,GC_9,GC_10,GC_11,GC_12,GC_13,GC_14,GC_15,GC_16,GC_17,GC_18,GC_19,GC_20,GC_21,GC_22,GC_23,GC_24,GC_25,GC_26,GC_27,GC_28,GC_29,GC_30,GC_31,GC_32,GC_33,GC_34,GC_35,GC_36,GC_37,GC_38,GC_39,GC_40,GC_41,GC_42,GC_43,GC_44,GC_45,GC_46,GC_47,GC_48;\n
3699+// Model couplings dependent on aS\n
3700+std::complex<double> GC_6,GC_5,GC_4;\n\n
3701+// Set parameters that are unchanged during the run\n
3702+void setIndependentParameters(ParticleData*& pd, Couplings*& csm, SusyLesHouches*& slhaPtr);\n
3703+// Set couplings that are unchanged during the run\n
3704+void setIndependentCouplings();\n
3705+// Set parameters that are changed event by event\n
3706+void setDependentParameters(ParticleData*& pd, Couplings*& csm, SusyLesHouches*& slhaPtr, double alpS);\n
3707+// Set couplings that are changed event by event\n
3708+void setDependentCouplings();\n\n
3709+// Print parameters that are unchanged during the run\n
3710+void printIndependentParameters();\n
3711+// Print couplings that are unchanged during the run\n
3712+void printIndependentCouplings();\n
3713+// Print parameters that are changed event by event\n
3714+void printDependentParameters();\n
3715+// Print couplings that are changed event by event\n
3716+void printDependentCouplings();\n\n\n
3717+ private:\n
3718+static Parameters_sm* instance;\n
3719+};\n\n
3720+} // end namespace Pythia8\n
3721+#endif // Pythia8_parameters_sm_H\n""" % misc.get_pkg_info()
3722
3723 goal_file_cc = \
3724 """//==========================================================================
3725@@ -1422,14 +1965,14 @@
3726
3727 // Function to get static instance - only one instance per program
3728 Parameters_sm* Parameters_sm::getInstance(){
3729- if (instance == 0)
3730- instance = new Parameters_sm();
3731+\tif (instance == 0)
3732+\t instance = new Parameters_sm();
3733
3734- return instance;
3735+ return instance;
3736 }
3737
3738 void Parameters_sm::setIndependentParameters(ParticleData*& pd, Couplings*& csm, SusyLesHouches*& slhaPtr){
3739- WTau=pd->mWidth(15);
3740+\tWTau=pd->mWidth(15);
3741 WH=pd->mWidth(25);
3742 WW=pd->mWidth(24);
3743 WZ=pd->mWidth(23);
3744@@ -1464,30 +2007,30 @@
3745 aEWM1 = 1./csm->alphaEM(pow(pd->m0(23),2));
3746 ZERO = 0.;
3747 lamWS__exp__2 = pow(lamWS,2.);
3748-CKM11 = 1.-lamWS__exp__2/2.;
3749-CKM12 = lamWS;
3750+CKM1x1 = 1.-lamWS__exp__2/2.;
3751+CKM1x2 = lamWS;
3752 complexi = std::complex<double>(0.,1.);
3753 lamWS__exp__3 = pow(lamWS,3.);
3754-CKM13 = AWS*lamWS__exp__3*(-(etaWS*complexi)+rhoWS);
3755-CKM21 = -lamWS;
3756-CKM22 = 1.-lamWS__exp__2/2.;
3757-CKM23 = AWS*lamWS__exp__2;
3758-CKM31 = AWS*lamWS__exp__3*(1.-etaWS*complexi-rhoWS);
3759-CKM32 = -(AWS*lamWS__exp__2);
3760-CKM33 = 1.;
3761+CKM1x3 = AWS*lamWS__exp__3*(-(etaWS*complexi)+rhoWS);
3762+CKM2x1 = -lamWS;
3763+CKM2x2 = 1.-lamWS__exp__2/2.;
3764+CKM2x3 = AWS*lamWS__exp__2;
3765+CKM3x1 = AWS*lamWS__exp__3*(1.-etaWS*complexi-rhoWS);
3766+CKM3x2 = -(AWS*lamWS__exp__2);
3767+CKM3x3 = 1.;
3768 MZ__exp__2 = pow(MZ,2.);
3769 MZ__exp__4 = pow(MZ,4.);
3770 sqrt__2 = sqrt(2.);
3771 MH__exp__2 = pow(MH,2.);
3772-conjg__CKM11 = conj(CKM11);
3773-conjg__CKM12 = conj(CKM12);
3774-conjg__CKM13 = conj(CKM13);
3775-conjg__CKM21 = conj(CKM21);
3776-conjg__CKM22 = conj(CKM22);
3777-conjg__CKM23 = conj(CKM23);
3778-conjg__CKM31 = conj(CKM31);
3779-conjg__CKM32 = conj(CKM32);
3780-conjg__CKM33 = conj(CKM33);
3781+conjg__CKM1x1 = conj(CKM1x1);
3782+conjg__CKM1x2 = conj(CKM1x2);
3783+conjg__CKM1x3 = conj(CKM1x3);
3784+conjg__CKM2x1 = conj(CKM2x1);
3785+conjg__CKM2x2 = conj(CKM2x2);
3786+conjg__CKM2x3 = conj(CKM2x3);
3787+conjg__CKM3x1 = conj(CKM3x1);
3788+conjg__CKM3x2 = conj(CKM3x2);
3789+conjg__CKM3x3 = conj(CKM3x3);
3790 aEW = 1./aEWM1;
3791 MW = sqrt(MZ__exp__2/2.+sqrt(MZ__exp__4/4.-(aEW*M_PI*MZ__exp__2)/(Gf*sqrt__2)));
3792 sqrt__aEW = sqrt(aEW);
3793@@ -1515,67 +2058,68 @@
3794 sw__exp__2 = pow(sw,2.);
3795 }
3796 void Parameters_sm::setIndependentCouplings(){
3797- GC_1 = -(ee*complexi)/3.;
3798+\tGC_1 = -(ee*complexi)/3.;
3799 GC_2 = (2.*ee*complexi)/3.;
3800 GC_3 = -(ee*complexi);
3801 GC_7 = cw*complexi*gw;
3802 GC_8 = -(complexi*gw__exp__2);
3803 GC_9 = cw__exp__2*complexi*gw__exp__2;
3804-GC_10 = (ee__exp__2*complexi)/(2.*sw__exp__2);
3805-GC_11 = (ee*complexi)/(sw*sqrt__2);
3806-GC_12 = (CKM11*ee*complexi)/(sw*sqrt__2);
3807-GC_13 = (CKM12*ee*complexi)/(sw*sqrt__2);
3808-GC_14 = (CKM13*ee*complexi)/(sw*sqrt__2);
3809-GC_15 = (CKM21*ee*complexi)/(sw*sqrt__2);
3810-GC_16 = (CKM22*ee*complexi)/(sw*sqrt__2);
3811-GC_17 = (CKM23*ee*complexi)/(sw*sqrt__2);
3812-GC_18 = (CKM31*ee*complexi)/(sw*sqrt__2);
3813-GC_19 = (CKM32*ee*complexi)/(sw*sqrt__2);
3814-GC_20 = (CKM33*ee*complexi)/(sw*sqrt__2);
3815-GC_21 = -(cw*ee*complexi)/(2.*sw);
3816-GC_22 = (cw*ee*complexi)/(2.*sw);
3817-GC_23 = -(ee*complexi*sw)/(6.*cw);
3818-GC_24 = (ee*complexi*sw)/(2.*cw);
3819-GC_25 = complexi*gw*sw;
3820-GC_26 = -2.*cw*complexi*gw__exp__2*sw;
3821-GC_27 = complexi*gw__exp__2*sw__exp__2;
3822-GC_28 = (cw*ee*complexi)/(2.*sw)+(ee*complexi*sw)/(2.*cw);
3823-GC_29 = ee__exp__2*complexi+(cw__exp__2*ee__exp__2*complexi)/(2.*sw__exp__2)+(ee__exp__2*complexi*sw__exp__2)/(2.*cw__exp__2);
3824-GC_30 = -6.*complexi*lam*v;
3825-GC_31 = (ee__exp__2*complexi*v)/(2.*sw__exp__2);
3826-GC_32 = ee__exp__2*complexi*v+(cw__exp__2*ee__exp__2*complexi*v)/(2.*sw__exp__2)+(ee__exp__2*complexi*sw__exp__2*v)/(2.*cw__exp__2);
3827-GC_33 = -((complexi*yb)/sqrt__2);
3828-GC_34 = -((complexi*yc)/sqrt__2);
3829-GC_35 = -((complexi*ye)/sqrt__2);
3830-GC_36 = -((complexi*ym)/sqrt__2);
3831-GC_37 = -((complexi*yt)/sqrt__2);
3832-GC_38 = -((complexi*ytau)/sqrt__2);
3833-GC_39 = (ee*complexi*conjg__CKM11)/(sw*sqrt__2);
3834-GC_40 = (ee*complexi*conjg__CKM12)/(sw*sqrt__2);
3835-GC_41 = (ee*complexi*conjg__CKM13)/(sw*sqrt__2);
3836-GC_42 = (ee*complexi*conjg__CKM21)/(sw*sqrt__2);
3837-GC_43 = (ee*complexi*conjg__CKM22)/(sw*sqrt__2);
3838-GC_44 = (ee*complexi*conjg__CKM23)/(sw*sqrt__2);
3839-GC_45 = (ee*complexi*conjg__CKM31)/(sw*sqrt__2);
3840-GC_46 = (ee*complexi*conjg__CKM32)/(sw*sqrt__2);
3841-GC_47 = (ee*complexi*conjg__CKM33)/(sw*sqrt__2);
3842+GC_10 = -6.*complexi*lam;
3843+GC_11 = (ee__exp__2*complexi)/(2.*sw__exp__2);
3844+GC_12 = (ee*complexi)/(sw*sqrt__2);
3845+GC_13 = (CKM1x1*ee*complexi)/(sw*sqrt__2);
3846+GC_14 = (CKM1x2*ee*complexi)/(sw*sqrt__2);
3847+GC_15 = (CKM1x3*ee*complexi)/(sw*sqrt__2);
3848+GC_16 = (CKM2x1*ee*complexi)/(sw*sqrt__2);
3849+GC_17 = (CKM2x2*ee*complexi)/(sw*sqrt__2);
3850+GC_18 = (CKM2x3*ee*complexi)/(sw*sqrt__2);
3851+GC_19 = (CKM3x1*ee*complexi)/(sw*sqrt__2);
3852+GC_20 = (CKM3x2*ee*complexi)/(sw*sqrt__2);
3853+GC_21 = (CKM3x3*ee*complexi)/(sw*sqrt__2);
3854+GC_22 = -(cw*ee*complexi)/(2.*sw);
3855+GC_23 = (cw*ee*complexi)/(2.*sw);
3856+GC_24 = -(ee*complexi*sw)/(6.*cw);
3857+GC_25 = (ee*complexi*sw)/(2.*cw);
3858+GC_26 = complexi*gw*sw;
3859+GC_27 = -2.*cw*complexi*gw__exp__2*sw;
3860+GC_28 = complexi*gw__exp__2*sw__exp__2;
3861+GC_29 = (cw*ee*complexi)/(2.*sw)+(ee*complexi*sw)/(2.*cw);
3862+GC_30 = ee__exp__2*complexi+(cw__exp__2*ee__exp__2*complexi)/(2.*sw__exp__2)+(ee__exp__2*complexi*sw__exp__2)/(2.*cw__exp__2);
3863+GC_31 = -6.*complexi*lam*v;
3864+GC_32 = (ee__exp__2*complexi*v)/(2.*sw__exp__2);
3865+GC_33 = ee__exp__2*complexi*v+(cw__exp__2*ee__exp__2*complexi*v)/(2.*sw__exp__2)+(ee__exp__2*complexi*sw__exp__2*v)/(2.*cw__exp__2);
3866+GC_34 = -((complexi*yb)/sqrt__2);
3867+GC_35 = -((complexi*yc)/sqrt__2);
3868+GC_36 = -((complexi*ye)/sqrt__2);
3869+GC_37 = -((complexi*ym)/sqrt__2);
3870+GC_38 = -((complexi*yt)/sqrt__2);
3871+GC_39 = -((complexi*ytau)/sqrt__2);
3872+GC_40 = (ee*complexi*conjg__CKM1x1)/(sw*sqrt__2);
3873+GC_41 = (ee*complexi*conjg__CKM1x2)/(sw*sqrt__2);
3874+GC_42 = (ee*complexi*conjg__CKM1x3)/(sw*sqrt__2);
3875+GC_43 = (ee*complexi*conjg__CKM2x1)/(sw*sqrt__2);
3876+GC_44 = (ee*complexi*conjg__CKM2x2)/(sw*sqrt__2);
3877+GC_45 = (ee*complexi*conjg__CKM2x3)/(sw*sqrt__2);
3878+GC_46 = (ee*complexi*conjg__CKM3x1)/(sw*sqrt__2);
3879+GC_47 = (ee*complexi*conjg__CKM3x2)/(sw*sqrt__2);
3880+GC_48 = (ee*complexi*conjg__CKM3x3)/(sw*sqrt__2);
3881 }
3882 void Parameters_sm::setDependentParameters(ParticleData*& pd, Couplings*& csm, SusyLesHouches*& slhaPtr, double alpS){
3883- aS = alpS;
3884+\taS = alpS;
3885 sqrt__aS = sqrt(aS);
3886 G = 2.*sqrt__aS*sqrt(M_PI);
3887 G__exp__2 = pow(G,2.);
3888 }
3889 void Parameters_sm::setDependentCouplings(){
3890- GC_6 = complexi*G__exp__2;
3891+\tGC_6 = complexi*G__exp__2;
3892 GC_5 = complexi*G;
3893 GC_4 = -G;
3894 }
3895
3896 // Routines for printing out parameters
3897 void Parameters_sm::printIndependentParameters(){
3898- cout << "sm model parameters independent of event kinematics:" << endl;
3899- cout << setw(20) << "WTau " << "= " << setiosflags(ios::scientific) << setw(10) << WTau << endl;
3900+\tcout << "sm model parameters independent of event kinematics:" << endl;
3901+\tcout << setw(20) << "WTau " << "= " << setiosflags(ios::scientific) << setw(10) << WTau << endl;
3902 cout << setw(20) << "WH " << "= " << setiosflags(ios::scientific) << setw(10) << WH << endl;
3903 cout << setw(20) << "WW " << "= " << setiosflags(ios::scientific) << setw(10) << WW << endl;
3904 cout << setw(20) << "WZ " << "= " << setiosflags(ios::scientific) << setw(10) << WZ << endl;
3905@@ -1602,30 +2146,30 @@
3906 cout << setw(20) << "aEWM1 " << "= " << setiosflags(ios::scientific) << setw(10) << aEWM1 << endl;
3907 cout << setw(20) << "ZERO " << "= " << setiosflags(ios::scientific) << setw(10) << ZERO << endl;
3908 cout << setw(20) << "lamWS__exp__2 " << "= " << setiosflags(ios::scientific) << setw(10) << lamWS__exp__2 << endl;
3909-cout << setw(20) << "CKM11 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM11 << endl;
3910-cout << setw(20) << "CKM12 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM12 << endl;
3911+cout << setw(20) << "CKM1x1 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM1x1 << endl;
3912+cout << setw(20) << "CKM1x2 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM1x2 << endl;
3913 cout << setw(20) << "complexi " << "= " << setiosflags(ios::scientific) << setw(10) << complexi << endl;
3914 cout << setw(20) << "lamWS__exp__3 " << "= " << setiosflags(ios::scientific) << setw(10) << lamWS__exp__3 << endl;
3915-cout << setw(20) << "CKM13 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM13 << endl;
3916-cout << setw(20) << "CKM21 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM21 << endl;
3917-cout << setw(20) << "CKM22 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM22 << endl;
3918-cout << setw(20) << "CKM23 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM23 << endl;
3919-cout << setw(20) << "CKM31 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM31 << endl;
3920-cout << setw(20) << "CKM32 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM32 << endl;
3921-cout << setw(20) << "CKM33 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM33 << endl;
3922+cout << setw(20) << "CKM1x3 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM1x3 << endl;
3923+cout << setw(20) << "CKM2x1 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM2x1 << endl;
3924+cout << setw(20) << "CKM2x2 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM2x2 << endl;
3925+cout << setw(20) << "CKM2x3 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM2x3 << endl;
3926+cout << setw(20) << "CKM3x1 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM3x1 << endl;
3927+cout << setw(20) << "CKM3x2 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM3x2 << endl;
3928+cout << setw(20) << "CKM3x3 " << "= " << setiosflags(ios::scientific) << setw(10) << CKM3x3 << endl;
3929 cout << setw(20) << "MZ__exp__2 " << "= " << setiosflags(ios::scientific) << setw(10) << MZ__exp__2 << endl;
3930 cout << setw(20) << "MZ__exp__4 " << "= " << setiosflags(ios::scientific) << setw(10) << MZ__exp__4 << endl;
3931 cout << setw(20) << "sqrt__2 " << "= " << setiosflags(ios::scientific) << setw(10) << sqrt__2 << endl;
3932 cout << setw(20) << "MH__exp__2 " << "= " << setiosflags(ios::scientific) << setw(10) << MH__exp__2 << endl;
3933-cout << setw(20) << "conjg__CKM11 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM11 << endl;
3934-cout << setw(20) << "conjg__CKM12 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM12 << endl;
3935-cout << setw(20) << "conjg__CKM13 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM13 << endl;
3936-cout << setw(20) << "conjg__CKM21 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM21 << endl;
3937-cout << setw(20) << "conjg__CKM22 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM22 << endl;
3938-cout << setw(20) << "conjg__CKM23 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM23 << endl;
3939-cout << setw(20) << "conjg__CKM31 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM31 << endl;
3940-cout << setw(20) << "conjg__CKM32 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM32 << endl;
3941-cout << setw(20) << "conjg__CKM33 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM33 << endl;
3942+cout << setw(20) << "conjg__CKM1x1 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM1x1 << endl;
3943+cout << setw(20) << "conjg__CKM1x2 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM1x2 << endl;
3944+cout << setw(20) << "conjg__CKM1x3 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM1x3 << endl;
3945+cout << setw(20) << "conjg__CKM2x1 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM2x1 << endl;
3946+cout << setw(20) << "conjg__CKM2x2 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM2x2 << endl;
3947+cout << setw(20) << "conjg__CKM2x3 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM2x3 << endl;
3948+cout << setw(20) << "conjg__CKM3x1 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM3x1 << endl;
3949+cout << setw(20) << "conjg__CKM3x2 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM3x2 << endl;
3950+cout << setw(20) << "conjg__CKM3x3 " << "= " << setiosflags(ios::scientific) << setw(10) << conjg__CKM3x3 << endl;
3951 cout << setw(20) << "aEW " << "= " << setiosflags(ios::scientific) << setw(10) << aEW << endl;
3952 cout << setw(20) << "MW " << "= " << setiosflags(ios::scientific) << setw(10) << MW << endl;
3953 cout << setw(20) << "sqrt__aEW " << "= " << setiosflags(ios::scientific) << setw(10) << sqrt__aEW << endl;
3954@@ -1653,8 +2197,8 @@
3955 cout << setw(20) << "sw__exp__2 " << "= " << setiosflags(ios::scientific) << setw(10) << sw__exp__2 << endl;
3956 }
3957 void Parameters_sm::printIndependentCouplings(){
3958- cout << "sm model couplings independent of event kinematics:" << endl;
3959- cout << setw(20) << "GC_1 " << "= " << setiosflags(ios::scientific) << setw(10) << GC_1 << endl;
3960+\tcout << "sm model couplings independent of event kinematics:" << endl;
3961+\tcout << setw(20) << "GC_1 " << "= " << setiosflags(ios::scientific) << setw(10) << GC_1 << endl;
3962 cout << setw(20) << "GC_2 " << "= " << setiosflags(ios::scientific) << setw(10) << GC_2 << endl;
3963 cout << setw(20) << "GC_3 " << "= " << setiosflags(ios::scientific) << setw(10) << GC_3 << endl;
3964 cout << setw(20) << "GC_7 " << "= " << setiosflags(ios::scientific) << setw(10) << GC_7 << endl;
3965@@ -1698,17 +2242,18 @@
3966 cout << setw(20) << "GC_45 " << "= " << setiosflags(ios::scientific) << setw(10) << GC_45 << endl;
3967 cout << setw(20) << "GC_46 " << "= " << setiosflags(ios::scientific) << setw(10) << GC_46 << endl;
3968 cout << setw(20) << "GC_47 " << "= " << setiosflags(ios::scientific) << setw(10) << GC_47 << endl;
3969+cout << setw(20) << "GC_48 " << "= " << setiosflags(ios::scientific) << setw(10) << GC_48 << endl;
3970 }
3971 void Parameters_sm::printDependentParameters(){
3972- cout << "sm model parameters dependent on event kinematics:" << endl;
3973- cout << setw(20) << "aS " << "= " << setiosflags(ios::scientific) << setw(10) << aS << endl;
3974+\tcout << "sm model parameters dependent on event kinematics:" << endl;
3975+\tcout << setw(20) << "aS " << "= " << setiosflags(ios::scientific) << setw(10) << aS << endl;
3976 cout << setw(20) << "sqrt__aS " << "= " << setiosflags(ios::scientific) << setw(10) << sqrt__aS << endl;
3977 cout << setw(20) << "G " << "= " << setiosflags(ios::scientific) << setw(10) << G << endl;
3978 cout << setw(20) << "G__exp__2 " << "= " << setiosflags(ios::scientific) << setw(10) << G__exp__2 << endl;
3979 }
3980 void Parameters_sm::printDependentCouplings(){
3981- cout << "sm model couplings dependent on event kinematics:" << endl;
3982- cout << setw(20) << "GC_6 " << "= " << setiosflags(ios::scientific) << setw(10) << GC_6 << endl;
3983+\tcout << "sm model couplings dependent on event kinematics:" << endl;
3984+\tcout << setw(20) << "GC_6 " << "= " << setiosflags(ios::scientific) << setw(10) << GC_6 << endl;
3985 cout << setw(20) << "GC_5 " << "= " << setiosflags(ios::scientific) << setw(10) << GC_5 << endl;
3986 cout << setw(20) << "GC_4 " << "= " << setiosflags(ios::scientific) << setw(10) << GC_4 << endl;
3987 }
3988@@ -1718,6 +2263,9 @@
3989
3990 file_h, file_cc = self.model_builder.generate_parameters_class_files()
3991
3992- self.assertEqual(file_h, goal_file_h)
3993- self.assertEqual(file_cc, goal_file_cc)
3994+ self.assertEqual([l for l in file_h.split('\n') if l.strip()],
3995+ [l for l in goal_file_h.split('\n') if l.strip()])
3996+
3997+ self.assertEqual([l.strip() for l in file_cc.split('\n') if l.strip()],
3998+ [l.strip() for l in goal_file_cc.split('\n') if l.strip()])
3999
4000
4001=== modified file 'tests/unit_tests/iolibs/test_export_v4.py'
4002--- tests/unit_tests/iolibs/test_export_v4.py 2012-04-16 08:48:53 +0000
4003+++ tests/unit_tests/iolibs/test_export_v4.py 2012-05-16 04:17:21 +0000
4004@@ -4775,6 +4775,259 @@
4005 # Amplitude(s) for diagram number 28
4006 CALL VVVXXX(W(1,4),W(1,2),W(1,24),MGVX5,AMP(28))""")
4007
4008+ def test_helas_diagrams_gg_gogo_go_tt1x_t_wpb(self):
4009+ """Testing g g > go go, (go > t t1~, t > w+ b)
4010+ """
4011+
4012+ # Set up model
4013+
4014+ mypartlist = base_objects.ParticleList()
4015+ myinterlist = base_objects.InteractionList()
4016+
4017+ # A gluon and gluino
4018+ mypartlist.append(base_objects.Particle({'name':'g',
4019+ 'antiname':'g',
4020+ 'spin':3,
4021+ 'color':8,
4022+ 'mass':'zero',
4023+ 'width':'zero',
4024+ 'texname':'g',
4025+ 'antitexname':'g',
4026+ 'line':'curly',
4027+ 'charge':0.,
4028+ 'pdg_code':21,
4029+ 'propagating':True,
4030+ 'is_part':True,
4031+ 'self_antipart':True}))
4032+ g = mypartlist[-1]
4033+
4034+ mypartlist.append(base_objects.Particle({'name':'go',
4035+ 'antiname':'go',
4036+ 'spin':2,
4037+ 'color':8,
4038+ 'mass':'MGO',
4039+ 'width':'WGO',
4040+ 'texname':'g',
4041+ 'antitexname':'g',
4042+ 'line':'curly',
4043+ 'charge':0.,
4044+ 'pdg_code':1000021,
4045+ 'propagating':True,
4046+ 'is_part':True,
4047+ 'self_antipart':True}))
4048+ go = mypartlist[-1]
4049+
4050+ # A top quark and stop squark
4051+ mypartlist.append(base_objects.Particle({'name':'t',
4052+ 'antiname':'t~',
4053+ 'spin':2,
4054+ 'color':3,
4055+ 'mass':'MT',
4056+ 'width':'WT',
4057+ 'texname':'t',
4058+ 'antitexname':'\bar t',
4059+ 'line':'straight',
4060+ 'charge':2. / 3.,
4061+ 'pdg_code':6,
4062+ 'propagating':True,
4063+ 'is_part':True,
4064+ 'self_antipart':False}))
4065+ t = mypartlist[len(mypartlist) - 1]
4066+ antit = copy.copy(t)
4067+ antit.set('is_part', False)
4068+
4069+ mypartlist.append(base_objects.Particle({'name':'t1',
4070+ 'antiname':'t1~',
4071+ 'spin':0,
4072+ 'color':3,
4073+ 'mass':'MT1',
4074+ 'width':'WT1',
4075+ 'texname':'t1',
4076+ 'antitexname':'\bar t1',
4077+ 'line':'dashed',
4078+ 'charge':2. / 3.,
4079+ 'pdg_code':1000006,
4080+ 'propagating':True,
4081+ 'is_part':True,
4082+ 'self_antipart':False}))
4083+ t1 = mypartlist[len(mypartlist) - 1]
4084+ antit1 = copy.copy(t1)
4085+ antit1.set('is_part', False)
4086+
4087+ # A W
4088+ mypartlist.append(base_objects.Particle({'name':'W+',
4089+ 'antiname':'W-',
4090+ 'spin':3,
4091+ 'color':1,
4092+ 'mass':'MW',
4093+ 'width':'WW',
4094+ 'texname':'W^+',
4095+ 'antitexname':'W^-',
4096+ 'line':'wavy',
4097+ 'charge':1.,
4098+ 'pdg_code':24,
4099+ 'propagating':True,
4100+ 'is_part':True,
4101+ 'self_antipart':False}))
4102+ Wplus = mypartlist[len(mypartlist) - 1]
4103+ Wminus = copy.copy(Wplus)
4104+ Wminus.set('is_part', False)
4105+
4106+ # b quark
4107+ mypartlist.append(base_objects.Particle({'name':'b',
4108+ 'antiname':'b~',
4109+ 'spin':2,
4110+ 'color':3,
4111+ 'mass':'zero',
4112+ 'width':'zero',
4113+ 'texname':'b',
4114+ 'antitexname':'\bar b',
4115+ 'line':'straight',
4116+ 'charge':-1. / 3.,
4117+ 'pdg_code':5,
4118+ 'propagating':True,
4119+ 'is_part':True,
4120+ 'self_antipart':False}))
4121+ b = mypartlist[len(mypartlist) - 1]
4122+ antib = copy.copy(b)
4123+ antib.set('is_part', False)
4124+
4125+ # top-w-b coupling
4126+ myinterlist.append(base_objects.Interaction({
4127+ 'id': 1,
4128+ 'particles': base_objects.ParticleList([antib, t, Wminus]),
4129+ 'color': [color.ColorString([color.T(1,0)])],
4130+ 'lorentz': ['FFV2'],
4131+ 'couplings': {(0, 0): 'GC_108'},
4132+ 'orders': {'QED': 1}
4133+ }))
4134+ myinterlist.append(base_objects.Interaction({
4135+ 'id': 2,
4136+ 'particles': base_objects.ParticleList([antit, b, Wplus]),
4137+ 'color': [color.ColorString([color.T(1,0)])],
4138+ 'lorentz': ['FFV2'],
4139+ 'couplings': {(0, 0): 'GC_108'},
4140+ 'orders': {'QED': 1}
4141+ }))
4142+
4143+ # Gluon couplings to gluino
4144+ myinterlist.append(base_objects.Interaction({
4145+ 'id': 3,
4146+ 'particles': base_objects.ParticleList(\
4147+ [go, \
4148+ go, \
4149+ g]),
4150+ 'color': [],
4151+ 'lorentz':['L1'],
4152+ 'couplings':{(0, 0):'GQQ'},
4153+ 'orders':{'QCD':1}}))
4154+
4155+ # Gluino couplings to top and stop
4156+ myinterlist.append(base_objects.Interaction({
4157+ 'id': 11,
4158+ 'particles': base_objects.ParticleList(\
4159+ [go, \
4160+ t, \
4161+ antit1]),
4162+ 'color': [],
4163+ 'lorentz':['L1'],
4164+ 'couplings':{(0, 0):'GQQ'},
4165+ 'orders':{'QCD':1}}))
4166+
4167+ myinterlist.append(base_objects.Interaction({
4168+ 'id': 12,
4169+ 'particles': base_objects.ParticleList(\
4170+ [antit, \
4171+ go, \
4172+ t1]),
4173+ 'color': [],
4174+ 'lorentz':['L1'],
4175+ 'couplings':{(0, 0):'GQQ'},
4176+ 'orders':{'QCD':1}}))
4177+
4178+ mybasemodel = base_objects.Model()
4179+ mybasemodel.set('particles', mypartlist)
4180+ mybasemodel.set('interactions', myinterlist)
4181+
4182+ myleglist = base_objects.LegList()
4183+
4184+ myleglist.append(base_objects.Leg({'id':21,
4185+ 'state':False}))
4186+ myleglist.append(base_objects.Leg({'id':21,
4187+ 'state':False}))
4188+ myleglist.append(base_objects.Leg({'id':1000021}))
4189+ myleglist.append(base_objects.Leg({'id':1000021}))
4190+
4191+ core_proc = base_objects.Process({'legs':myleglist,
4192+ 'model':mybasemodel})
4193+
4194+ myleglist = base_objects.LegList()
4195+
4196+ myleglist.append(base_objects.Leg({'id':1000021,
4197+ 'state':False}))
4198+ myleglist.append(base_objects.Leg({'id':6}))
4199+ myleglist.append(base_objects.Leg({'id':-1000006}))
4200+
4201+ decay1_process = base_objects.Process({'legs':myleglist,
4202+ 'model':mybasemodel,
4203+ 'is_decay_chain': True})
4204+
4205+ core_proc.get('decay_chains').append(decay1_process)
4206+
4207+ myleglist = base_objects.LegList()
4208+
4209+ myleglist.append(base_objects.Leg({'id':6,
4210+ 'state':False}))
4211+ myleglist.append(base_objects.Leg({'id':5}))
4212+ myleglist.append(base_objects.Leg({'id':24}))
4213+
4214+ decay2_process = base_objects.Process({'legs':myleglist,
4215+ 'model':mybasemodel,
4216+ 'is_decay_chain': True})
4217+
4218+ decay1_process.get('decay_chains').append(decay2_process)
4219+
4220+ amplitude = diagram_generation.DecayChainAmplitude(core_proc)
4221+
4222+ self.assertEqual(len(amplitude.get('amplitudes')),1)
4223+
4224+ matrix_elements = helas_objects.HelasDecayChainProcess(amplitude)
4225+
4226+ matrix_element = matrix_elements.combine_decay_chain_processes()[0]
4227+
4228+ #print "\n".join(helas_call_writers.FortranUFOHelasCallWriter().\
4229+ # get_matrix_element_calls(matrix_element))
4230+
4231+ self.assertEqual("\n".join(helas_call_writers.FortranUFOHelasCallWriter().\
4232+ get_matrix_element_calls(matrix_element)),
4233+ """CALL VXXXXX(P(0,1),zero,NHEL(1),-1*IC(1),W(1,1))
4234+CALL VXXXXX(P(0,2),zero,NHEL(2),-1*IC(2),W(1,2))
4235+CALL OXXXXX(P(0,3),zero,NHEL(3),+1*IC(3),W(1,3))
4236+CALL VXXXXX(P(0,4),MW,NHEL(4),+1*IC(4),W(1,4))
4237+CALL FFV2_1(W(1,3),W(1,4),GC_108,MT, WT, W(1,5))
4238+CALL SXXXXX(P(0,5),+1*IC(5),W(1,6))
4239+CALL L1_1(W(1,5),W(1,6),GQQ,MGO, WGO, W(1,7))
4240+CALL IXXXXX(P(0,6),zero,NHEL(6),-1*IC(6),W(1,8))
4241+CALL VXXXXX(P(0,7),MW,NHEL(7),+1*IC(7),W(1,9))
4242+CALL FFV2C1_2(W(1,8),W(1,9),GC_108,MT, WT, W(1,10))
4243+CALL SXXXXX(P(0,8),+1*IC(8),W(1,11))
4244+CALL L1C1_2(W(1,10),W(1,11),GQQ,MGO, WGO, W(1,12))
4245+CALL L1_1(W(1,7),W(1,1),GQQ,MGO, WGO, W(1,13))
4246+# Amplitude(s) for diagram number 1
4247+CALL L1_0(W(1,12),W(1,13),W(1,2),GQQ,AMP(1))
4248+CALL L1_2(W(1,12),W(1,1),-GQQ,MGO, WGO, W(1,14))
4249+# Amplitude(s) for diagram number 2
4250+CALL L1_0(W(1,14),W(1,7),W(1,2),GQQ,AMP(2))""")
4251+
4252+ # Test get_used_lorentz
4253+ goal_lorentz_list = [(('FFV2',), (), 1), (('L1',), (), 1),
4254+ (('FFV2',), (1,), 2), (('L1',), (1,), 2),
4255+ (('L1',), (), 1), (('L1',), (), 2),
4256+ (('L1',), (), 0), (('L1',), (), 0)]
4257+
4258+ self.assertEqual(matrix_element.get_used_lorentz(),
4259+ goal_lorentz_list)
4260+
4261 def test_multiple_lorentz_structures(self):
4262 """Testing multiple Lorentz structures for one diagram.
4263 """
4264@@ -9318,8 +9571,7 @@
4265
4266 # couplings
4267 self.assertEqual(len(mg4_model.coups_dep), 3)
4268- sol= ['GC_1', 'GC_2', 'GC_3', 'GC_7', 'GC_8', 'GC_9', 'GC_10', 'GC_16', 'GC_21', 'GC_22', 'GC_23', 'GC_24', 'GC_25', 'GC_26', 'GC_27', 'GC_28', 'GC_29', 'GC_30', 'GC_31', 'GC_32', 'GC_33', 'GC_37', 'GC_38']
4269-
4270+ sol = ['GC_1', 'GC_2', 'GC_3', 'GC_7', 'GC_8', 'GC_9', 'GC_10', 'GC_11', 'GC_17', 'GC_22', 'GC_23', 'GC_24', 'GC_25', 'GC_26', 'GC_27', 'GC_28', 'GC_29', 'GC_30', 'GC_31', 'GC_32', 'GC_33', 'GC_34', 'GC_38', 'GC_39']
4271 self.assertEqual(sol, [ p.name for p in mg4_model.coups_indep])
4272
4273
4274
4275=== modified file 'tests/unit_tests/iolibs/test_group_subprocs.py'
4276--- tests/unit_tests/iolibs/test_group_subprocs.py 2012-02-17 06:01:41 +0000
4277+++ tests/unit_tests/iolibs/test_group_subprocs.py 2012-05-16 04:17:21 +0000
4278@@ -764,3 +764,371 @@
4279 self.assertEqual(me.get('processes')[0].nice_string(),
4280 me_strings[i])
4281
4282+
4283+ def test_even_more_special_group_decay_chain(self):
4284+ """Test group_amplitudes for even more special decay chain"""
4285+
4286+ mypartlist = base_objects.ParticleList()
4287+ myinterlist = base_objects.InteractionList()
4288+
4289+ # A d quark and its antiparticle
4290+ mypartlist.append(base_objects.Particle({'name':'d',
4291+ 'antiname':'d~',
4292+ 'spin':2,
4293+ 'color':1,
4294+ 'mass':'zero',
4295+ 'width':'zero',
4296+ 'texname':'d',
4297+ 'antitexname':'\bar d',
4298+ 'line':'straight',
4299+ 'charge':-1. / 3.,
4300+ 'pdg_code':1,
4301+ 'propagating':True,
4302+ 'is_part':True,
4303+ 'self_antipart':False}))
4304+ d = mypartlist[-1]
4305+ antid = copy.copy(d)
4306+ antid.set('is_part', False)
4307+
4308+ # A u quark and its antiparticle
4309+ mypartlist.append(base_objects.Particle({'name':'u',
4310+ 'antiname':'u~',
4311+ 'spin':2,
4312+ 'color':3,
4313+ 'mass':'zero',
4314+ 'width':'zero',
4315+ 'texname':'u',
4316+ 'antitexname':'\bar u',
4317+ 'line':'straight',
4318+ 'charge':2. / 3.,
4319+ 'pdg_code':2,
4320+ 'propagating':True,
4321+ 'is_part':True,
4322+ 'self_antipart':False}))
4323+ u = mypartlist[len(mypartlist) - 1]
4324+ antiu = copy.copy(u)
4325+ antiu.set('is_part', False)
4326+
4327+ # An s and its antiparticle
4328+ mypartlist.append(base_objects.Particle({'name':'s',
4329+ 'antiname':'s~',
4330+ 'spin':2,
4331+ 'color':1,
4332+ 'mass':'zero',
4333+ 'width':'zero',
4334+ 'texname':'d',
4335+ 'antitexname':'\bar d',
4336+ 'line':'straight',
4337+ 'charge':-1. / 3.,
4338+ 'pdg_code':3,
4339+ 'propagating':True,
4340+ 'is_part':True,
4341+ 'self_antipart':False}))
4342+ s = mypartlist[-1]
4343+ antis = copy.copy(s)
4344+ antis.set('is_part', False)
4345+
4346+ # A c quark and its antiparticle
4347+ mypartlist.append(base_objects.Particle({'name':'c',
4348+ 'antiname':'c~',
4349+ 'spin':2,
4350+ 'color':3,
4351+ 'mass':'zero',
4352+ 'width':'zero',
4353+ 'texname':'c',
4354+ 'antitexname':'\bar c',
4355+ 'line':'straight',
4356+ 'charge':2. / 3.,
4357+ 'pdg_code':4,
4358+ 'propagating':True,
4359+ 'is_part':True,
4360+ 'self_antipart':False}))
4361+ c = mypartlist[len(mypartlist) - 1]
4362+ antic = copy.copy(c)
4363+ antic.set('is_part', False)
4364+
4365+ # A b quark and its antiparticle
4366+ mypartlist.append(base_objects.Particle({'name':'b',
4367+ 'antiname':'b~',
4368+ 'spin':2,
4369+ 'color':1,
4370+ 'mass':'MB',
4371+ 'width':'zero',
4372+ 'texname':'b',
4373+ 'antitexname':'\bar b',
4374+ 'line':'straight',
4375+ 'charge':-1. / 3.,
4376+ 'pdg_code':5,
4377+ 'propagating':True,
4378+ 'is_part':True,
4379+ 'self_antipart':False}))
4380+ b = mypartlist[-1]
4381+ antib = copy.copy(b)
4382+ antib.set('is_part', False)
4383+
4384+ # A t quark and its antiparticle
4385+ mypartlist.append(base_objects.Particle({'name':'t',
4386+ 'antiname':'t~',
4387+ 'spin':2,
4388+ 'color':3,
4389+ 'mass':'MT',
4390+ 'width':'zero',
4391+ 'texname':'t',
4392+ 'antitexname':'\bar t',
4393+ 'line':'straight',
4394+ 'charge':2. / 3.,
4395+ 'pdg_code':6,
4396+ 'propagating':True,
4397+ 'is_part':True,
4398+ 'self_antipart':False}))
4399+ t = mypartlist[len(mypartlist) - 1]
4400+ antit = copy.copy(t)
4401+ antit.set('is_part', False)
4402+
4403+ # A funny Zprime
4404+ mypartlist.append(base_objects.Particle({
4405+ 'name': 'Zp',
4406+ 'antiname': 'Zp',
4407+ 'spin': 3,
4408+ 'color': 1,
4409+ 'charge': 0.00,
4410+ 'mass': 'MZp',
4411+ 'width': 'WZp',
4412+ 'pdg_code': 9900032,
4413+ 'texname': 'Zp',
4414+ 'antitexname': 'Zp',
4415+ 'line': 'wavy',
4416+ 'propagating': True,
4417+ 'is_part': True,
4418+ 'self_antipart': True}))
4419+
4420+ Zp = mypartlist[-1]
4421+
4422+ # A funny neutralino
4423+ mypartlist.append(base_objects.Particle({
4424+ 'name': '~n1',
4425+ 'antiname': '~n1',
4426+ 'spin': 2,
4427+ 'color': 1,
4428+ 'charge': 0.00,
4429+ 'mass': 'MnH1',
4430+ 'width': 'WnH1',
4431+ 'pdg_code': 9910012,
4432+ 'texname': '~n1',
4433+ 'antitexname': '~n1',
4434+ 'line': 'swavy',
4435+ 'propagating': True,
4436+ 'is_part': True,
4437+ 'self_antipart': True}))
4438+ n1 = mypartlist[-1]
4439+
4440+ # A W
4441+ mypartlist.append(base_objects.Particle({'name':'W+',
4442+ 'antiname':'W-',
4443+ 'spin':3,
4444+ 'color':1,
4445+ 'mass':'MW',
4446+ 'width':'WW',
4447+ 'texname':'W^+',
4448+ 'antitexname':'W^-',
4449+ 'line':'wavy',
4450+ 'charge':1.,
4451+ 'pdg_code':24,
4452+ 'propagating':True,
4453+ 'is_part':True,
4454+ 'self_antipart':False}))
4455+ Wplus = mypartlist[len(mypartlist) - 1]
4456+ Wminus = copy.copy(Wplus)
4457+ Wminus.set('is_part', False)
4458+
4459+ # A electron and positron
4460+ mypartlist.append(base_objects.Particle({'name':'e-',
4461+ 'antiname':'e+',
4462+ 'spin':2,
4463+ 'color':1,
4464+ 'mass':'me',
4465+ 'width':'zero',
4466+ 'texname':'e^-',
4467+ 'antitexname':'e^+',
4468+ 'line':'straight',
4469+ 'charge':-1.,
4470+ 'pdg_code':11,
4471+ 'propagating':True,
4472+ 'is_part':True,
4473+ 'self_antipart':False}))
4474+ eminus = mypartlist[len(mypartlist) - 1]
4475+ eplus = copy.copy(eminus)
4476+ eplus.set('is_part', False)
4477+
4478+ # Interactions
4479+
4480+ myinterlist.append(base_objects.Interaction({
4481+ 'id': 1,
4482+ 'particles': base_objects.ParticleList(\
4483+ [antid,u,Wminus]),
4484+ 'color': [],
4485+ 'lorentz': ['FFV3'],
4486+ 'couplings': {(0, 0): 'GC_35'},
4487+ 'orders': {'QED': 1}}))
4488+
4489+ myinterlist.append(base_objects.Interaction({
4490+ 'id': 2,
4491+ 'particles': base_objects.ParticleList(\
4492+ [antiu,d,Wplus]),
4493+ 'color': [],
4494+ 'lorentz': ['FFV3'],
4495+ 'couplings': {(0, 0): 'GC_112'},
4496+ 'orders': {'QED': 1}}))
4497+
4498+ myinterlist.append(base_objects.Interaction({
4499+ 'id': 3,
4500+ 'particles': base_objects.ParticleList(\
4501+ [antis,c,Wminus]),
4502+ 'color': [],
4503+ 'lorentz': ['FFV3'],
4504+ 'couplings': {(0, 0): 'GC_35'},
4505+ 'orders': {'QED': 1}}))
4506+
4507+ myinterlist.append(base_objects.Interaction({
4508+ 'id': 4,
4509+ 'particles': base_objects.ParticleList(\
4510+ [antic,s,Wplus]),
4511+ 'color': [],
4512+ 'lorentz': ['FFV3'],
4513+ 'couplings': {(0, 0): 'GC_112'},
4514+ 'orders': {'QED': 1}}))
4515+
4516+ myinterlist.append(base_objects.Interaction({
4517+ 'id': 5,
4518+ 'particles': base_objects.ParticleList(\
4519+ [antib,t,Wminus]),
4520+ 'color': [],
4521+ 'lorentz': ['FFV3'],
4522+ 'couplings': {(0, 0): 'GC_35'},
4523+ 'orders': {'QED': 1}}))
4524+
4525+ myinterlist.append(base_objects.Interaction({
4526+ 'id': 6,
4527+ 'particles': base_objects.ParticleList(\
4528+ [antit,b,Wplus]),
4529+ 'color': [],
4530+ 'lorentz': ['FFV3'],
4531+ 'couplings': {(0, 0): 'GC_112'},
4532+ 'orders': {'QED': 1}}))
4533+
4534+ myinterlist.append(base_objects.Interaction({
4535+ 'id': 7,
4536+ 'particles': base_objects.ParticleList(\
4537+ [antid,d,Zp]),
4538+ 'color': [],
4539+ 'lorentz': ['FFV1'],
4540+ 'couplings': {(0, 0): 'GC_7'},
4541+ 'orders': {'QED': 1}
4542+ }))
4543+
4544+ myinterlist.append(base_objects.Interaction({
4545+ 'id': 8,
4546+ 'particles': base_objects.ParticleList(\
4547+ [n1,n1,Zp]),
4548+ 'color': [],
4549+ 'lorentz': ['FFV2'],
4550+ 'couplings': {(0, 0): 'GC_22'},
4551+ 'orders': {'QED': 1}
4552+ }))
4553+
4554+ myinterlist.append(base_objects.Interaction({
4555+ 'id': 9,
4556+ 'particles': base_objects.ParticleList(\
4557+ [eplus,n1,Wminus]),
4558+ 'color': [],
4559+ 'lorentz': ['FFV3'],
4560+ 'couplings': {(0, 0): 'GC_46'},
4561+ 'orders': {'QED': 1}
4562+ }))
4563+
4564+ myinterlist.append(base_objects.Interaction({
4565+ 'id': 10,
4566+ 'particles': base_objects.ParticleList(\
4567+ [n1,eminus,Wplus]),
4568+ 'color': [],
4569+ 'lorentz': ['FFV3'],
4570+ 'couplings': {(0, 0): 'GC_46'},
4571+ 'orders': {'QED': 1}
4572+ }))
4573+
4574+ mymodel = base_objects.Model()
4575+ mymodel.set('particles', mypartlist)
4576+ mymodel.set('interactions', myinterlist)
4577+ mymodel.set('name', 'sm')
4578+
4579+ # Multiparticle labels
4580+ ds = [1,-1]
4581+ qs = [1,3,2,4,-1,-3,-2,-4]
4582+
4583+ my_leglist = base_objects.MultiLegList()
4584+ my_leglist.append(base_objects.MultiLeg({'ids': ds,
4585+ 'state': False}))
4586+ my_leglist.append(base_objects.MultiLeg({'ids': ds,
4587+ 'state': False}))
4588+ my_leglist.append(base_objects.MultiLeg({'ids': [n1.get('pdg_code')]}))
4589+ my_leglist.append(base_objects.MultiLeg({'ids': [n1.get('pdg_code')]}))
4590+
4591+ core_process = base_objects.ProcessDefinition({'legs':my_leglist,
4592+ 'model':mymodel})
4593+
4594+ decay1proc1 = [[n1.get('pdg_code')],
4595+ [11], [24]]
4596+ my_leglist = base_objects.MultiLegList([\
4597+ base_objects.MultiLeg({'ids': id}) for id in decay1proc1])
4598+ my_leglist[0].set('state', False)
4599+ decay1process1 = base_objects.ProcessDefinition({'legs':my_leglist,
4600+ 'model':mymodel})
4601+ decay1process2 = base_objects.ProcessDefinition({'legs':my_leglist,
4602+ 'model':mymodel})
4603+
4604+ decay2proc1 = [[24], qs, qs]
4605+ my_leglist = base_objects.MultiLegList([\
4606+ base_objects.MultiLeg({'ids': id}) for id in decay2proc1])
4607+ my_leglist[0].set('state', False)
4608+ decay2process1 = base_objects.ProcessDefinition({'legs':my_leglist,
4609+ 'model':mymodel})
4610+ decay2proc2 = [[24], [6], [-5]]
4611+ my_leglist = base_objects.MultiLegList([\
4612+ base_objects.MultiLeg({'ids': id}) for id in decay2proc2])
4613+ my_leglist[0].set('state', False)
4614+ decay2process2 = base_objects.ProcessDefinition({'legs':my_leglist,
4615+ 'model':mymodel})
4616+
4617+ decay1process1.get('decay_chains').append(decay2process1)
4618+ decay1process2.get('decay_chains').append(decay2process2)
4619+ core_process.get('decay_chains').append(decay1process1)
4620+ core_process.get('decay_chains').append(decay1process2)
4621+
4622+ my_amplitude = diagram_generation.DecayChainAmplitude(core_process)
4623+
4624+ dc_subproc_group = group_subprocs.DecayChainSubProcessGroup.\
4625+ group_amplitudes(my_amplitude)
4626+
4627+ subproc_groups = \
4628+ dc_subproc_group.generate_helas_decay_chain_subproc_groups()
4629+
4630+ self.assertEqual(len(subproc_groups), 1)
4631+
4632+ self.assertEqual(len(subproc_groups[0].get('matrix_elements')),2)
4633+
4634+ me_strings = ["""Process: d d~ > ~n1 ~n1 WEIGHTED=2
4635+ Decay: ~n1 > e- W+ WEIGHTED=1
4636+ Decay: W+ > u d~ WEIGHTED=1
4637+ Decay: ~n1 > e- W+ WEIGHTED=1
4638+ Decay: W+ > t b~ WEIGHTED=1""",
4639+ """Process: d~ d > ~n1 ~n1 WEIGHTED=2
4640+ Decay: ~n1 > e- W+ WEIGHTED=1
4641+ Decay: W+ > u d~ WEIGHTED=1
4642+ Decay: ~n1 > e- W+ WEIGHTED=1
4643+ Decay: W+ > t b~ WEIGHTED=1"""]
4644+
4645+
4646+ for i,me in enumerate(subproc_groups[0].get('matrix_elements')):
4647+ self.assertEqual(me.get('processes')[0].nice_string(),
4648+ me_strings[i])
4649+
4650
4651=== modified file 'tests/unit_tests/various/test_aloha.py'
4652--- tests/unit_tests/various/test_aloha.py 2012-03-06 17:38:56 +0000
4653+++ tests/unit_tests/various/test_aloha.py 2012-05-16 04:17:21 +0000
4654@@ -3051,7 +3051,8 @@
4655 # Check that full identification symmetry works
4656 helas_suite = create_aloha.AbstractALOHAModel('sm')
4657 helas_suite.look_for_symmetries()
4658- solution = {'VVVV2': {2: 1 ,4: 3}, 'SSS1': {2: 1, 3: 2}, 'VVSS1': {2: 1, 4: 3}, 'VVS1': {2: 1}}
4659+ solution = {'VVVV2': {2: 1 ,4: 3}, 'SSS1': {2: 1, 3: 2}, 'VVSS1': {2: 1, 4: 3},
4660+ 'VVS1': {2: 1},'SSSS1': {2: 1, 3: 2, 4:3}}
4661 self.assertEqual(solution, helas_suite.symmetries)
4662
4663 def test_has_symmetries(self):
4664
4665=== modified file 'tests/unit_tests/various/test_import_ufo.py'
4666--- tests/unit_tests/various/test_import_ufo.py 2011-12-14 17:09:28 +0000
4667+++ tests/unit_tests/various/test_import_ufo.py 2012-05-16 04:17:21 +0000
4668@@ -73,12 +73,12 @@
4669 def test_detect_special_parameters(self):
4670 """ check that detect zero parameters works"""
4671
4672- expected = set(['etaWS', 'conjg__CKM13', 'conjg__CKM12', 'conjg__CKM32', 'conjg__CKM31', 'CKM23', 'WT', 'lamWS', 'WTau', 'AWS', 'ymc', 'ymb', 'yme', 'ymm', 'Me', 'MB', 'CKM32', 'CKM31', 'ym', 'CKM13', 'CKM12', 'lamWS__exp__2', 'lamWS__exp__3', 'yc', 'yb', 'ye', 'conjg__CKM21', 'CKM21', 'conjg__CKM23', 'MC', 'MM', 'rhoWS'])
4673+ expected = set(['etaWS', 'conjg__CKM1x3', 'conjg__CKM1x2', 'conjg__CKM3x2', 'conjg__CKM3x1', 'CKM2x3', 'WT', 'lamWS', 'WTau', 'AWS', 'ymc', 'ymb', 'yme', 'ymm', 'Me', 'MB', 'CKM3x2', 'CKM3x1', 'ym', 'CKM1x3', 'CKM1x2', 'lamWS__exp__2', 'lamWS__exp__3', 'yc', 'yb', 'ye', 'conjg__CKM2x1', 'CKM2x1', 'conjg__CKM2x3', 'MC', 'MM', 'rhoWS'])
4674 zero, one = self.model.detect_special_parameters()
4675 result = set(zero)
4676 self.assertEqual(expected, result)
4677
4678- expected = set(['CKM33', 'conjg__CKM11', 'conjg__CKM33', 'CKM22', 'CKM11', 'conjg__CKM22'])
4679+ expected = set(['CKM3x3', 'conjg__CKM1x1', 'conjg__CKM3x3', 'CKM2x2', 'CKM1x1', 'conjg__CKM2x2'])
4680 result = set(one)
4681 self.assertEqual(expected, result)
4682
4683@@ -130,7 +130,7 @@
4684 zero, iden = self.model.detect_identical_couplings()
4685
4686 # check what is the zero coupling
4687- expected = set(['GC_17', 'GC_15', 'GC_14', 'GC_13', 'GC_40', 'GC_41', 'GC_19', 'GC_18', 'GC_46', 'GC_44', 'GC_45', 'GC_33', 'GC_35', 'GC_34', 'GC_42', 'GC_36'])
4688+ expected = set(['GC_18', 'GC_16', 'GC_15', 'GC_14', 'GC_41', 'GC_42', 'GC_20', 'GC_19', 'GC_47', 'GC_45', 'GC_46', 'GC_34', 'GC_36', 'GC_35', 'GC_43', 'GC_37'])
4689 result = set(zero)
4690 for name in result:
4691 self.assertEqual(self.model['coupling_dict'][name], 0)
4692@@ -138,7 +138,7 @@
4693 self.assertEqual(expected, result)
4694
4695 # check what are the identical coupling
4696- expected = [['GC_16', 'GC_12', 'GC_11', 'GC_39', 'GC_47', 'GC_43', 'GC_20']]
4697+ expected = [['GC_17', 'GC_13', 'GC_12', 'GC_40', 'GC_44', 'GC_48', 'GC_21']]
4698 expected.sort()
4699 iden.sort()
4700 self.assertEqual(expected, iden)
4701@@ -146,11 +146,11 @@
4702 def test_locate_couplings(self):
4703 """ check the creation of the coupling to vertex dict """
4704
4705- target = ['GC_33', 'GC_29', 'GC_24', 'GC_25']
4706- sol = {'GC_33': [26],
4707- 'GC_29': [11],
4708- 'GC_24': [56, 57, 58],
4709- 'GC_25': [4]}
4710+ target = ['GC_34', 'GC_30', 'GC_25', 'GC_26']
4711+ sol = {'GC_34': [21],
4712+ 'GC_30': [12],
4713+ 'GC_25': [40, 41, 42],
4714+ 'GC_26': [5]}
4715
4716 self.model.locate_coupling()
4717 for coup in target:
4718@@ -166,13 +166,15 @@
4719 zero, iden = self.model.detect_identical_couplings()
4720
4721 # Check that All the code/model is the one intended for this test
4722- target = ['GC_16', 'GC_12', 'GC_11', 'GC_39', 'GC_47', 'GC_43', 'GC_20']
4723+ target = ['GC_17', 'GC_13', 'GC_12', 'GC_40', 'GC_44', 'GC_48', 'GC_21']
4724 assert target in iden, 'test not up-to-date'
4725
4726- check_content = [['d', 'u', 'w+'], ['s', 'c', 'w+'], ['b', 't', 'w+'], ['u', 'd', 'w+'], ['c', 's', 'w+'], ['t', 'b', 'w+'], ['e-', 've', 'w+'], ['m-', 'vm', 'w+'], ['tt-', 'vt', 'w+'], ['ve', 'e-', 'w+'], ['vm', 'm-', 'w+'], ['vt', 'tt-', 'w+']]
4727+ check_content = [['u', 'd', 'w+'], ['c', 's', 'w+'], ['t', 'b', 'w+'], ['ve', 'e-', 'w+'], ['vm', 'm-', 'w+'], ['vt', 'tt-', 'w+'], ['d', 'u', 'w+'], ['s', 'c', 'w+'], ['b', 't', 'w+'], ['e-', 've', 'w+'], ['m-', 'vm', 'w+'], ['tt-', 'vt', 'w+']]
4728+
4729 content = [[p.get('name') for p in v.get('particles')] \
4730 for v in self.model.get('interactions') \
4731 if any([c in target for c in v['couplings'].values()])]
4732+
4733 assert check_content == content, 'test not up-to-date'
4734
4735 vertex_id = [v.get('id') \
4736@@ -190,12 +192,12 @@
4737 # check now that everything is fine
4738 self.model.merge_iden_couplings(target)
4739 for id in vertex_id:
4740- has_33 = False
4741+ has_coup = False
4742 for coup in self.model.get_interaction(id)['couplings'].values():
4743 self.assertFalse(coup in target[1:])
4744- if coup == 'GC_16':
4745- has_16 = True
4746- self.assertTrue(has_16, True)
4747+ if coup == 'GC_17':
4748+ has_coup = True
4749+ self.assertTrue(has_coup, True)
4750
4751 def test_remove_couplings(self):
4752 """ check that the detection of irrelevant interactions works """
4753@@ -203,24 +205,24 @@
4754 # first test case where they are all deleted
4755 # check that we have the valid model
4756 input = self.model['interactions'][3] # four gluon
4757- input2 = self.model['interactions'][28] # b b~ h
4758- self.assertTrue('GC_25' in input['couplings'].values())
4759- self.assertTrue('GC_21' in input2['couplings'].values())
4760- found_25 = 0
4761- found_21 = 0
4762+ input2 = self.model['interactions'][20] # b b~ h
4763+ self.assertTrue('GC_6' in input['couplings'].values())
4764+ self.assertTrue('GC_34' in input2['couplings'].values())
4765+ found_gggg = 0
4766+ found_bbh = 0
4767 for dep,data in self.model['couplings'].items():
4768 for param in data:
4769- if param.name == 'GC_25': found_25 +=1
4770- elif param.name == 'GC_21': found_21 +=1
4771- self.assertTrue(found_25>0)
4772- self.assertTrue(found_21>0)
4773+ if param.name == 'GC_6': found_gggg +=1
4774+ elif param.name == 'GC_34': found_bbh +=1
4775+ self.assertTrue(found_gggg>0)
4776+ self.assertTrue(found_bbh>0)
4777
4778 # make the real test
4779- result = self.model.remove_couplings(['GC_25','GC_21'])
4780+ result = self.model.remove_couplings(['GC_6','GC_34'])
4781
4782 for dep,data in self.model['couplings'].items():
4783 for param in data:
4784- self.assertFalse(param.name in ['GC_25', 'GC_21'])
4785+ self.assertFalse(param.name in ['GC_6', 'GC_34'])
4786
4787
4788 def test_remove_interactions(self):
4789@@ -229,38 +231,38 @@
4790
4791 # first test case where they are all deleted
4792 # check that we have the valid model
4793- input = self.model['interactions'][2] # four gluon
4794- input2 = self.model['interactions'][25] # b b~ h
4795+ input = self.model['interactions'][3] # four gluon
4796+ input2 = self.model['interactions'][20] # b b~ h
4797 self.assertTrue('GC_6' in input['couplings'].values())
4798- self.assertTrue('GC_33' in input2['couplings'].values())
4799+ self.assertTrue('GC_34' in input2['couplings'].values())
4800 found_6 = 0
4801- found_33 = 0
4802+ found_34 = 0
4803 for dep,data in self.model['couplings'].items():
4804 for param in data:
4805 if param.name == 'GC_6': found_6 +=1
4806- elif param.name == 'GC_33': found_33 +=1
4807+ elif param.name == 'GC_34': found_34 +=1
4808 self.assertTrue(found_6>0)
4809- self.assertTrue(found_33>0)
4810+ self.assertTrue(found_34>0)
4811
4812 # make the real test
4813 self.model.locate_coupling()
4814- result = self.model.remove_interactions(['GC_6','GC_33'])
4815+ result = self.model.remove_interactions(['GC_6','GC_34'])
4816 self.assertFalse(input in self.model['interactions'])
4817 self.assertFalse(input2 in self.model['interactions'])
4818
4819
4820 # Now test case where some of them are deleted and some not
4821- input = self.model['interactions'][26] # d d~ Z
4822- input2 = self.model['interactions'][55] # e+ e- Z
4823- self.assertTrue('GC_23' in input['couplings'].values())
4824- self.assertTrue('GC_21' in input['couplings'].values())
4825- self.assertTrue('GC_21' in input2['couplings'].values())
4826- self.assertTrue('GC_24' in input2['couplings'].values())
4827- result = self.model.remove_interactions(['GC_21','GC_24'])
4828- self.assertTrue('GC_23' in input['couplings'].values())
4829- self.assertFalse('GC_21' in input['couplings'].values())
4830- self.assertFalse('GC_21' in input2['couplings'].values())
4831- self.assertFalse('GC_24' in input2['couplings'].values())
4832+ input = self.model['interactions'][21] # d d~ Z
4833+ input2 = self.model['interactions'][39] # e+ e- Z
4834+ self.assertTrue('GC_24' in input['couplings'].values())
4835+ self.assertTrue('GC_22' in input['couplings'].values())
4836+ self.assertTrue('GC_22' in input2['couplings'].values())
4837+ self.assertTrue('GC_25' in input2['couplings'].values())
4838+ result = self.model.remove_interactions(['GC_22','GC_25'])
4839+ self.assertTrue('GC_24' in input['couplings'].values())
4840+ self.assertFalse('GC_22' in input['couplings'].values())
4841+ self.assertFalse('GC_22' in input2['couplings'].values())
4842+ self.assertFalse('GC_25' in input2['couplings'].values())
4843
4844 def test_put_parameters_to_zero(self):
4845 """check that we remove parameters correctly"""
4846@@ -302,11 +304,11 @@
4847 def test_restrict_from_a_param_card(self):
4848 """ check the full restriction chain in one case b b~ h """
4849
4850- interaction = self.model['interactions'][25]
4851+ interaction = self.model['interactions'][20]
4852 #check sanity of the checks
4853 assert [p['pdg_code'] for p in interaction['particles']] == [5, 5, 25], \
4854 'Initial model not valid for this test => update the test'
4855- assert interaction['couplings'] == {(0,0): 'GC_33'}
4856+ assert interaction['couplings'] == {(0,0): 'GC_34'}
4857
4858 self.model.restrict_model(self.restrict_file)
4859
4860@@ -321,7 +323,7 @@
4861 # check remove couplings
4862 for dep,data in self.model['couplings'].items():
4863 for param in data:
4864- self.assertFalse(param.name in ['GC_33'])
4865+ self.assertFalse(param.name in ['GC_34'])
4866
4867 # check masses
4868 part_b = self.model.get_particle(5)
4869
4870=== modified file 'tests/unit_tests/various/test_process_checks.py'
4871--- tests/unit_tests/various/test_process_checks.py 2011-07-21 04:25:51 +0000
4872+++ tests/unit_tests/various/test_process_checks.py 2012-05-16 04:17:21 +0000
4873@@ -199,7 +199,8 @@
4874 """Test that check process fails for wrong color-Lorentz."""
4875
4876 # Change 4g interaction so color and lorentz don't agree
4877- gggg = self.base_model.get_interaction(3)
4878+ gggg = self.base_model.get_interaction(4)
4879+ assert [p['pdg_code'] for p in gggg['particles']] == [21,21,21,21]
4880 gggg.set('lorentz', ['VVVV1', 'VVVV4', 'VVVV3'])
4881
4882 myleglist = base_objects.LegList()

Subscribers

People subscribed via source and target branches