Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F19244576
test_classify.cc
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
58 KB
Referenced Files
None
Subscribers
None
test_classify.cc
View Options
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#include
<iostream>
#include
<random>
#include
"HEJ/Event.hh"
#include
"HEJ/exceptions.hh"
#define ASSERT(x) if(!(x)) { \
throw std::logic_error("Assertion '" #x "' failed."); \
}
namespace
{
const
fastjet
::
JetDefinition
jet_def
{
fastjet
::
JetAlgorithm
::
antikt_algorithm
,
0.4
};
const
double
min_jet_pt
{
30.
};
const
std
::
vector
<
std
::
string
>
all_quarks
{
"-4"
,
"-1"
,
"1"
,
"2"
,
"3"
,
"4"
};
const
std
::
vector
<
std
::
string
>
all_partons
{
"g"
,
"-2"
,
"-1"
,
"1"
,
"2"
,
"3"
,
"4"
};
const
std
::
vector
<
std
::
string
>
all_bosons
{
"h"
,
"Wp"
,
"Wm"
};
const
std
::
vector
<
std
::
string
>
all_gZ
{
"photon"
,
"Z"
};
const
std
::
vector
<
std
::
string
>
all_w
{
"W+"
,
"W-"
};
static
std
::
mt19937_64
ran
{
0
};
void
shuffle_particles
(
HEJ
::
Event
::
EventData
&
ev
)
{
// incoming
std
::
shuffle
(
begin
(
ev
.
incoming
),
end
(
ev
.
incoming
),
ran
);
// outgoing (through index)
auto
old_outgoing
=
std
::
move
(
ev
.
outgoing
);
std
::
vector
<
size_t
>
idx
(
old_outgoing
.
size
());
std
::
iota
(
idx
.
begin
(),
idx
.
end
(),
0
);
std
::
shuffle
(
begin
(
idx
),
end
(
idx
),
ran
);
ev
.
outgoing
.
clear
();
ev
.
outgoing
.
reserve
(
old_outgoing
.
size
());
for
(
size_t
i
:
idx
)
{
ev
.
outgoing
.
emplace_back
(
std
::
move
(
old_outgoing
[
i
]));
}
// find decays again
if
(
!
ev
.
decays
.
empty
()){
auto
old_decays
=
std
::
move
(
ev
.
decays
);
ev
.
decays
.
clear
();
for
(
size_t
i
=
0
;
i
<
idx
.
size
();
++
i
)
{
auto
decay
=
old_decays
.
find
(
idx
[
i
]);
if
(
decay
!=
old_decays
.
end
())
ev
.
decays
.
emplace
(
i
,
std
::
move
(
decay
->
second
));
}
for
(
auto
&
decay
:
ev
.
decays
){
std
::
shuffle
(
begin
(
decay
.
second
),
end
(
decay
.
second
),
ran
);
}
}
}
// if pos_boson = -1 (or not implemented) -> no boson
// njet==7 is special: has less jets, i.e. multiple parton in one jet,
// all partons are massive (4 GeV) -> can be boson/decay
// pos_boson < 0 to select process (see list for details)
HEJ
::
Event
::
EventData
get_process
(
int
const
njet
,
int
const
pos_boson
){
using
namespace
HEJ
::
pid
;
HEJ
::
Event
::
EventData
ev
;
if
(
njet
==
0
){
// jet idx: -1 -1
ev
.
outgoing
.
push_back
({
gluon
,
{
-
24
,
12
,
-
57
,
63
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
24
,
-
12
,
41
,
49
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
64
,
64
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
48
,
48
},
{}};
return
ev
;
}
else
if
(
njet
==
1
){
// jet idx: 0 -1 -1
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
28
,
-
44
,
57
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
-
24
,
-
12
,
29
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
-
4
,
39
,
41
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
72
,
72
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
55
,
55
},
{}};
return
ev
;
}
else
if
(
njet
==
2
){
switch
(
pos_boson
){
case
0
:
ev
.
outgoing
.
push_back
({
higgs
,
{
198
,
33
,
-
170
,
291
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
154
,
68
,
44
,
174
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
44
,
-
101
,
88
,
141
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
322
,
322
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
284
,
284
},
{}};
return
ev
;
case
1
:
ev
.
outgoing
.
push_back
({
gluon
,
{
-
6
,
82
,
-
159
,
179
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
195
,
-
106
,
74
,
265
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
189
,
24
,
108
,
219
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
320
,
320
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
343
,
343
},
{}};
return
ev
;
case
2
:
ev
.
outgoing
.
push_back
({
gluon
,
{
-
80
,
-
80
,
-
140
,
180
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
60
,
-
32
,
0
,
68
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
140
,
112
,
177
,
281
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
246
,
246
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
283
,
283
},
{}};
return
ev
;
default
:
ev
.
outgoing
.
push_back
({
gluon
,
{
-
72
,
24
,
18
,
78
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
72
,
-
24
,
74
,
106
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
46
,
46
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
138
,
138
},
{}};
return
ev
;
}
}
if
(
njet
==
3
){
switch
(
pos_boson
){
case
0
:
ev
.
outgoing
.
push_back
({
higgs
,
{
152
,
-
117
,
-
88
,
245
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
146
,
62
,
-
11
,
159
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
126
,
-
72
,
96
,
174
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
132
,
127
,
144
,
233
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
335
,
335
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
476
,
476
},
{}};
return
ev
;
case
1
:
ev
.
outgoing
.
push_back
({
gluon
,
{
-
191
,
188
,
-
128
,
297
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
199
,
72
,
-
76
,
257
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
184
,
-
172
,
-
8
,
252
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
192
,
-
88
,
54
,
218
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
591
,
591
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
433
,
433
},
{}};
return
ev
;
case
2
:
ev
.
outgoing
.
push_back
({
gluon
,
{
-
42
,
18
,
-
49
,
67
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
-
54
,
-
28
,
62
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
99
,
32
,
-
16
,
163
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
45
,
4
,
72
,
85
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
199
,
199
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
178
,
178
},
{}};
return
ev
;
case
3
:
ev
.
outgoing
.
push_back
({
gluon
,
{
-
65
,
-
32
,
-
76
,
105
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
22
,
31
,
-
34
,
51
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
-
67
,
-
36
,
77
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
99
,
68
,
-
4
,
173
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
278
,
278
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
128
,
128
},
{}};
return
ev
;
default
:
ev
.
outgoing
.
push_back
({
gluon
,
{
-
90
,
-
135
,
30
,
165
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
108
,
198
,
76
,
238
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
198
,
-
63
,
126
,
243
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
207
,
207
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
439
,
439
},
{}};
return
ev
;
}
}
if
(
njet
==
4
){
switch
(
pos_boson
){
case
0
:
ev
.
outgoing
.
push_back
({
higgs
,
{
199
,
72
,
-
76
,
257
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
200
,
-
155
,
-
64
,
261
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
198
,
194
,
57
,
283
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
1
,
32
,
8
,
33
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
198
,
-
143
,
186
,
307
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
515
,
515
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
626
,
626
},
{}};
return
ev
;
case
1
:
ev
.
outgoing
.
push_back
({
gluon
,
{
198
,
61
,
-
162
,
263
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
199
,
72
,
-
76
,
257
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
200
,
135
,
144
,
281
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
198
,
-
186
,
171
,
321
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
1
,
-
82
,
122
,
147
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
535
,
535
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
734
,
734
},
{}};
return
ev
;
case
2
:
ev
.
outgoing
.
push_back
({
gluon
,
{
-
180
,
-
27
,
-
164
,
245
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
108
,
78
,
-
36
,
138
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
196
,
-
189
,
68
,
307
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
107
,
136
,
76
,
189
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
199
,
2
,
178
,
267
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
512
,
512
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
634
,
634
},
{}};
return
ev
;
case
3
:
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
-
30
,
-
84
,
90
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
72
,
22
,
-
96
,
122
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
0
,
-
51
,
85
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
64
,
72
,
-
81
,
177
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
64
,
84
,
116
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
409
,
409
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
181
,
181
},
{}};
return
ev
;
case
4
:
ev
.
outgoing
.
push_back
({
gluon
,
{
-
72
,
-
49
,
-
72
,
113
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
0
,
-
36
,
60
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
54
,
-
36
,
66
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
-
77
,
-
56
,
117
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
64
,
72
,
-
81
,
177
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
407
,
407
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
126
,
126
},
{}};
return
ev
;
default
:
ev
.
outgoing
.
push_back
({
gluon
,
{
248
,
-
56
,
-
122
,
282
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
249
,
30
,
-
10
,
251
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
249
,
-
18
,
26
,
251
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
248
,
44
,
199
,
321
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
506
,
506
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
599
,
599
},
{}};
return
ev
;
}
}
if
(
njet
==
6
){
switch
(
pos_boson
){
case
0
:
ev
.
outgoing
.
push_back
({
higgs
,
{
349
,
330
,
-
94
,
505
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
315
,
-
300
,
0
,
435
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
347
,
306
,
18
,
463
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
249
,
-
342
,
162
,
453
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
345
,
312
,
284
,
545
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
324
,
-
126
,
292
,
454
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
153
,
-
180
,
304
,
385
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
1137
,
1137
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
2103
,
2103
},
{}};
return
ev
;
case
1
:
ev
.
outgoing
.
push_back
({
gluon
,
{
242
,
241
,
-
182
,
387
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
243
,
238
,
-
190
,
409
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
218
,
-
215
,
-
74
,
315
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
224
,
-
224
,
112
,
336
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
241
,
182
,
154
,
339
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
53
,
-
234
,
126
,
271
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
231
,
12
,
156
,
279
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
1117
,
1117
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
1219
,
1219
},
{}};
return
ev
;
case
2
:
ev
.
outgoing
.
push_back
({
gluon
,
{
151
,
102
,
-
42
,
187
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
86
,
-
46
,
-
17
,
99
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
152
,
153
,
0
,
249
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
60
,
-
135
,
64
,
161
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
150
,
123
,
110
,
223
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
154
,
-
49
,
98
,
189
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
153
,
-
148
,
144
,
257
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
504
,
504
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
861
,
861
},
{}};
return
ev
;
case
3
:
ev
.
outgoing
.
push_back
({
gluon
,
{
198
,
197
,
-
66
,
287
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
198
,
-
189
,
-
54
,
279
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
200
,
-
64
,
2
,
210
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
199
,
158
,
6
,
283
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
199
,
-
184
,
172
,
321
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
196
,
168
,
177
,
313
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
4
,
-
86
,
92
,
126
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
745
,
745
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
1074
,
1074
},
{}};
return
ev
;
case
4
:
ev
.
outgoing
.
push_back
({
gluon
,
{
151
,
102
,
-
42
,
187
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
86
,
-
133
,
-
14
,
159
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
154
,
-
104
,
-
8
,
186
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
60
,
11
,
0
,
61
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
152
,
153
,
0
,
249
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
150
,
125
,
90
,
215
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
153
,
-
154
,
126
,
251
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
578
,
578
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
730
,
730
},
{}};
return
ev
;
case
5
:
ev
.
outgoing
.
push_back
({
gluon
,
{
-
15
,
-
90
,
-
94
,
131
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
82
,
-
74
,
111
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
-
80
,
-
64
,
105
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
25
,
-
36
,
65
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
99
,
-
16
,
101
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
68
,
92
,
-
18
,
170
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
5
,
-
78
,
54
,
95
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
513
,
513
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
265
,
265
},
{}};
return
ev
;
case
6
:
ev
.
outgoing
.
push_back
({
gluon
,
{
198
,
197
,
-
66
,
287
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
4
,
-
84
,
-
18
,
86
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
198
,
-
60
,
-
36
,
210
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
196
,
-
78
,
-
36
,
214
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
200
,
45
,
0
,
205
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
199
,
-
178
,
2
,
267
},
{}});
ev
.
outgoing
.
push_back
({
higgs
,
{
199
,
158
,
6
,
283
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
850
,
850
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
702
,
702
},
{}};
return
ev
;
default
:
ev
.
outgoing
.
push_back
({
gluon
,
{
-
350
,
-
112
,
-
280
,
462
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
347
,
266
,
-
322
,
543
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
349
,
-
314
,
-
38
,
471
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
349
,
348
,
12
,
493
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
342
,
-
54
,
23
,
347
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
345
,
-
134
,
138
,
395
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
1589
,
1589
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
1122
,
1122
},
{}};
return
ev
;
}
}
if
(
njet
==
7
){
switch
(
pos_boson
){
case
-
1
:
// jet idx: -1 0 1 2 3 4 5
ev
.
outgoing
.
push_back
({
gluon
,
{
-
15
,
-
18
,
-
54
,
59
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
98
,
-
70
,
121
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
-
100
,
-
64
,
121
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
93
,
-
20
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
5
,
-
92
,
-
12
,
93
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
76
,
-
2
,
90
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
95
,
56
,
111
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
439
,
439
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
273
,
273
},
{}};
return
ev
;
case
-
2
:
// jet idx: 0 1 2 3 4 -1 -1
ev
.
outgoing
.
push_back
({
gluon
,
{
-
5
,
-
86
,
-
82
,
119
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
93
,
20
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
14
,
20
,
54
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
-
50
,
26
,
61
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
95
,
56
,
111
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
15
,
-
18
,
54
,
59
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
-
20
,
88
,
91
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
215
,
215
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
397
,
397
},
{}};
return
ev
;
case
-
3
:
// jet idx: 0 0 1 2 3 4 5
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
98
,
-
70
,
121
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
95
,
-
56
,
111
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
15
,
-
58
,
-
34
,
69
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
-
76
,
-
40
,
89
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
5
,
-
52
,
8
,
53
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
93
,
20
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
100
,
82
,
138
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
394
,
394
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
304
,
304
},
{}};
return
ev
;
case
-
4
:
// jet idx: 0 1 2 3 4 5 5
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
-
52
,
-
76
,
95
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
15
,
-
98
,
-
62
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
93
,
-
20
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
44
,
-
10
,
66
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
5
,
-
92
,
-
12
,
93
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
95
,
56
,
111
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
98
,
70
,
121
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
387
,
387
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
333
,
333
},
{}};
return
ev
;
case
-
5
:
// jet idx: 0 1 -1 -1 2 3 4
ev
.
outgoing
.
push_back
({
gluon
,
{
-
15
,
-
26
,
-
62
,
69
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
60
,
-
54
,
94
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
10
,
-
14
,
29
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
5
,
-
20
,
0
,
21
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
93
,
20
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
-
92
,
40
,
101
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
95
,
56
,
111
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
278
,
278
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
264
,
264
},
{}};
return
ev
;
case
-
6
:
// jet idx: 0 0 0 1 2 2 3
ev
.
outgoing
.
push_back
({
gluon
,
{
-
15
,
-
62
,
-
26
,
69
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
88
,
-
31
,
105
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
5
,
-
38
,
-
6
,
39
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
93
,
20
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
95
,
56
,
111
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
98
,
70
,
121
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
-
98
,
74
,
125
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
265
,
265
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
422
,
422
},
{}};
return
ev
;
case
-
7
:
// jet idx: 0 1 1 2 2 3 4
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
-
70
,
-
66
,
99
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
98
,
-
70
,
121
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
95
,
-
56
,
111
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
5
,
-
38
,
-
14
,
41
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
100
,
-
37
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
93
,
-
20
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
15
,
-
78
,
30
,
85
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
462
,
462
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
229
,
229
},
{}};
return
ev
;
case
-
8
:
// jet idx: 0 1 2 2 2 3 4
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
40
,
-
56
,
84
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
92
,
-
68
,
115
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
-
94
,
-
62
,
115
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
15
,
-
98
,
-
62
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
5
,
-
48
,
-
16
,
51
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
93
,
20
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
95
,
56
,
111
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
449
,
449
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
261
,
261
},
{}};
return
ev
;
case
-
9
:
// jet idx: 0 1 2 1 3 0 4
ev
.
outgoing
.
push_back
({
gluon
,
{
-
15
,
-
96
,
-
72
,
121
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
95
,
-
56
,
111
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
72
,
-
39
,
95
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
92
,
-
40
,
101
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
-
20
,
-
12
,
33
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
5
,
-
92
,
-
36
,
99
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
93
,
-
20
,
117
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
476
,
476
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
201
,
201
},
{}};
return
ev
;
case
-
10
:
// jet idx: 0 1 3 2 4 3 1
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
93
,
-
20
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
5
,
-
48
,
16
,
51
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
95
,
56
,
111
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
-
76
,
52
,
95
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
60
,
54
,
94
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
92
,
68
,
115
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
15
,
-
96
,
72
,
121
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
203
,
203
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
501
,
501
},
{}};
return
ev
;
case
-
11
:
// jet idx: 0 1 2 3 3 4 2
ev
.
outgoing
.
push_back
({
gluon
,
{
-
15
,
-
98
,
-
62
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
93
,
20
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
95
,
56
,
111
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
5
,
-
28
,
20
,
35
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
96
,
75
,
131
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
-
62
,
50
,
83
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
96
,
76
,
123
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
241
,
241
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
476
,
476
},
{}};
return
ev
;
case
-
12
:
// jet idx: 0 1 0 2 3 4 5
ev
.
outgoing
.
push_back
({
gluon
,
{
-
5
,
-
72
,
-
92
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
44
,
-
62
,
90
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
15
,
-
100
,
-
80
,
129
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
95
,
-
56
,
111
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
93
,
20
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
98
,
70
,
121
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
-
70
,
66
,
99
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
459
,
459
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
325
,
325
},
{}};
return
ev
;
case
-
13
:
// jet idx: 0 1 2 0 1 3 0
ev
.
outgoing
.
push_back
({
gluon
,
{
-
15
,
-
98
,
-
62
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
12
,
95
,
-
56
,
111
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
23
,
-
40
,
-
16
,
49
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
48
,
-
100
,
-
37
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
11
,
88
,
-
20
,
91
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
68
,
93
,
-
20
,
117
},
{}});
ev
.
outgoing
.
push_back
({
gluon
,
{
-
5
,
-
38
,
-
6
,
39
},
{}});
ev
.
incoming
[
0
]
=
{
gluon
,
{
0
,
0
,
-
429
,
429
},
{}};
ev
.
incoming
[
1
]
=
{
gluon
,
{
0
,
0
,
212
,
212
},
{}};
return
ev
;
}
}
throw
HEJ
::
unknown_option
{
"unkown process"
};
}
bool
couple_quark
(
std
::
string
const
&
boson
,
std
::
string
&
quark
){
if
(
abs
(
HEJ
::
to_ParticleID
(
boson
))
==
HEJ
::
ParticleID
::
Wp
){
auto
qflav
{
HEJ
::
to_ParticleID
(
quark
)
};
if
(
!
HEJ
::
is_anyquark
(
qflav
))
return
false
;
const
int
W_charge
=
HEJ
::
to_ParticleID
(
boson
)
>
0
?
1
:-
1
;
if
(
W_charge
*
qflav
<
0
&&
!
(
abs
(
qflav
)
%
2
))
return
false
;
// not anti-down
if
(
W_charge
*
qflav
>
0
&&
(
abs
(
qflav
)
%
2
))
return
false
;
// not up
quark
=
std
::
to_string
(
qflav
-
W_charge
);
}
return
true
;
}
std
::
vector
<
HEJ
::
Particle
>
decay_W
(
HEJ
::
Particle
const
&
parent
){
if
(
parent
.
m
()
==
0.
)
// we can't decay massless partons
return
{};
std
::
array
<
HEJ
::
ParticleID
,
2
>
decays
;
if
(
parent
.
type
==
HEJ
::
ParticleID
::
Wp
){
decays
[
0
]
=
HEJ
::
ParticleID
::
e_bar
;
decays
[
1
]
=
HEJ
::
ParticleID
::
nu_e
;
}
else
{
decays
[
0
]
=
HEJ
::
ParticleID
::
e
;
decays
[
1
]
=
HEJ
::
ParticleID
::
nu_e_bar
;
}
std
::
vector
<
HEJ
::
Particle
>
decay_products
(
decays
.
size
());
for
(
size_t
i
=
0
;
i
<
decays
.
size
();
++
i
){
decay_products
[
i
].
type
=
decays
[
i
];
}
// choose polar and azimuth angle in parent rest frame
const
double
E
=
parent
.
m
()
/
2
;
const
double
theta
=
0.
;
const
double
cos_phi
=
1.
;
const
double
sin_phi
=
sqrt
(
1.
-
cos_phi
*
cos_phi
);
// Know 0 < phi < pi
const
double
px
=
E
*
cos
(
theta
)
*
sin_phi
;
const
double
py
=
E
*
sin
(
theta
)
*
sin_phi
;
const
double
pz
=
E
*
cos_phi
;
decay_products
[
0
].
p
.
reset
(
px
,
py
,
pz
,
E
);
decay_products
[
1
].
p
.
reset
(
-
px
,
-
py
,
-
pz
,
E
);
for
(
auto
&
particle
:
decay_products
)
particle
.
p
.
boost
(
parent
.
p
);
return
decay_products
;
}
// create event corresponding from given Configuration
// overwrite_boson to force a specific boson position, indepentent from input
// (useful for njet == 7)
HEJ
::
Event
parse_configuration
(
std
::
array
<
std
::
string
,
2
>
const
&
in
,
std
::
vector
<
std
::
string
>
const
&
out
,
int
const
overwrite_boson
=
0
){
auto
boson
=
std
::
find_if
(
out
.
cbegin
(),
out
.
cend
(),
[](
std
::
string
id
){
return
!
HEJ
::
is_parton
(
HEJ
::
to_ParticleID
(
id
));
});
int
const
pos_boson
=
(
overwrite_boson
!=
0
)
?
overwrite_boson
:
((
boson
==
out
.
cend
())
?-
1
:
std
::
distance
(
out
.
cbegin
(),
boson
));
size_t
njets
=
out
.
size
();
if
(
(
overwrite_boson
==
0
)
&&
boson
!=
out
.
cend
())
--
njets
;
HEJ
::
Event
::
EventData
ev
{
get_process
(
njets
,
pos_boson
)};
ASSERT
((
pos_boson
<
0
)
||
(
ev
.
outgoing
[
pos_boson
].
type
==
HEJ
::
ParticleID
::
higgs
));
for
(
size_t
i
=
0
;
i
<
out
.
size
();
++
i
){
ev
.
outgoing
[
i
].
type
=
HEJ
::
to_ParticleID
(
out
[
i
]);
// decay W
if
(
std
::
abs
(
ev
.
outgoing
[
i
].
type
)
==
HEJ
::
ParticleID
::
Wp
)
ev
.
decays
[
i
]
=
decay_W
(
ev
.
outgoing
[
i
]);
}
for
(
size_t
i
=
0
;
i
<
in
.
size
();
++
i
){
ev
.
incoming
[
i
].
type
=
HEJ
::
to_ParticleID
(
in
[
i
]);
}
shuffle_particles
(
ev
);
return
ev
.
cluster
(
jet_def
,
min_jet_pt
);
}
bool
match_expectation
(
HEJ
::
event_type
::
EventType
expected
,
std
::
array
<
std
::
string
,
2
>
const
&
in
,
std
::
vector
<
std
::
string
>
const
&
out
,
int
const
overwrite_boson
=
0
){
HEJ
::
Event
ev
{
parse_configuration
(
in
,
out
,
overwrite_boson
)};
if
(
ev
.
type
()
!=
expected
){
std
::
cerr
<<
"Expected type "
<<
HEJ
::
event_type
::
name
(
expected
)
<<
" but found "
<<
HEJ
::
event_type
::
name
(
ev
.
type
())
<<
"
\n
"
<<
ev
;
auto
jet_idx
{
ev
.
particle_jet_indices
(
ev
.
jets
())
};
std
::
cout
<<
"Particle Jet indices: "
;
for
(
int
const
i
:
jet_idx
)
std
::
cout
<<
i
<<
" "
;
std
::
cout
<<
std
::
endl
;
return
false
;
}
return
true
;
}
//! test FKL configurations
//! if implemented==false : check processes that are not in HEJ yet
bool
check_fkl
(
bool
const
implemented
=
true
){
using
namespace
HEJ
;
auto
const
type
{
implemented
?
event_type
::
FKL
:
event_type
::
non_resummable
};
std
::
vector
<
std
::
string
>
bosons
;
if
(
implemented
)
bosons
=
all_bosons
;
else
{
bosons
=
all_gZ
;
}
for
(
std
::
string
const
&
first
:
all_partons
)
// all quark flavours
for
(
std
::
string
const
&
last
:
all_partons
){
for
(
int
njet
=
2
;
njet
<=
6
;
++
njet
){
// all multiplicities
if
(
njet
==
5
)
continue
;
std
::
array
<
std
::
string
,
2
>
base_in
{
first
,
last
};
std
::
vector
<
std
::
string
>
base_out
(
njet
,
"g"
);
base_out
.
front
()
=
first
;
base_out
.
back
()
=
last
;
if
(
implemented
&&
!
match_expectation
(
type
,
base_in
,
base_out
))
return
false
;
for
(
auto
const
&
boson
:
bosons
)
// any boson
for
(
int
pos
=
0
;
pos
<=
njet
;
++
pos
){
// at any position
auto
in
{
base_in
};
auto
out
{
base_out
};
// change quark flavours for W
const
bool
couple_idx
=
std
::
uniform_int_distribution
<
int
>
{
0
,
1
}(
ran
);
if
(
!
couple_quark
(
boson
,
couple_idx
?
out
.
back
()
:
out
.
front
()))
continue
;
out
.
insert
(
out
.
begin
()
+
pos
,
boson
);
if
(
!
match_expectation
(
type
,
in
,
out
))
return
false
;
}
}
if
(
implemented
){
for
(
int
i
=-
3
;
i
>-
13
;
--
i
){
// extremal parton inside jet
std
::
array
<
std
::
string
,
2
>
base_in
{
first
,
last
};
std
::
vector
<
std
::
string
>
base_out
(
7
,
"g"
);
base_out
.
front
()
=
first
;
base_out
.
back
()
=
last
;
if
(
!
match_expectation
(
type
,
base_in
,
base_out
,
i
))
return
false
;
}
if
(
!
match_expectation
(
type
,{
first
,
last
},{
"h"
,
first
,
"g"
,
"g"
,
"g"
,
"g"
,
last
},
-
13
)
&&
match_expectation
(
type
,{
first
,
last
},{
first
,
"g"
,
"g"
,
"g"
,
"g"
,
last
,
"h"
},
-
13
)
&&
match_expectation
(
type
,{
"2"
,
last
},
{
"1"
,
"g"
,
"g"
,
"g"
,
"g"
,
last
,
"Wp"
},
-
13
)
&&
match_expectation
(
type
,{
first
,
"1"
},
{
"Wp"
,
first
,
"g"
,
"g"
,
"g"
,
"g"
,
"2"
},
-
13
)
)
return
false
;
}
}
return
true
;
}
//! test unordered configurations
//! if implemented==false : check processes that are not in HEJ yet
bool
check_uno
(
bool
const
implemented
=
true
){
using
namespace
HEJ
;
auto
const
b
{
implemented
?
event_type
::
unob
:
event_type
::
non_resummable
};
auto
const
f
{
implemented
?
event_type
::
unof
:
event_type
::
non_resummable
};
std
::
vector
<
std
::
string
>
bosons
;
if
(
implemented
)
bosons
=
all_bosons
;
else
{
bosons
=
all_gZ
;
}
for
(
std
::
string
const
&
uno
:
all_quarks
)
// all quark flavours
for
(
std
::
string
const
&
fkl
:
all_partons
){
for
(
int
njet
=
3
;
njet
<=
6
;
++
njet
){
// all multiplicities >2
if
(
njet
==
5
)
continue
;
for
(
int
i
=
0
;
i
<
2
;
++
i
){
// forward & backwards
std
::
array
<
std
::
string
,
2
>
base_in
;
std
::
vector
<
std
::
string
>
base_out
(
njet
,
"g"
);
const
int
uno_pos
=
i
?
1
:
(
njet
-
2
);
const
int
fkl_pos
=
i
?
(
njet
-
1
)
:
0
;
base_in
[
i
?
0
:
1
]
=
uno
;
base_in
[
i
?
1
:
0
]
=
fkl
;
base_out
[
uno_pos
]
=
uno
;
base_out
[
fkl_pos
]
=
fkl
;
auto
expectation
{
i
?
b
:
f
};
if
(
implemented
&&
!
match_expectation
(
expectation
,
base_in
,
base_out
)
)
return
false
;
for
(
auto
const
&
boson
:
bosons
){
// any boson
// at any position (higgs only inside FKL chain)
int
start
=
0
;
int
end
=
njet
;
if
(
to_ParticleID
(
boson
)
==
pid
::
higgs
){
start
=
i
?
(
uno_pos
+
1
)
:
fkl_pos
;
end
=
i
?
(
fkl_pos
+
1
)
:
uno_pos
;
}
for
(
int
pos
=
start
;
pos
<=
end
;
++
pos
){
auto
in
{
base_in
};
auto
out
{
base_out
};
// change quark flavours for W
const
bool
couple_idx
=
std
::
uniform_int_distribution
<
int
>
{
0
,
1
}(
ran
);
if
(
!
couple_quark
(
boson
,
couple_idx
?
out
[
fkl_pos
]
:
out
[
uno_pos
]))
continue
;
out
.
insert
(
out
.
begin
()
+
pos
,
boson
);
if
(
!
match_expectation
(
expectation
,
in
,
out
))
return
false
;
}
}
}
}
// test allowed jet configurations
if
(
implemented
&&
!
(
match_expectation
(
f
,{
fkl
,
uno
},{
"h"
,
fkl
,
"g"
,
"g"
,
"g"
,
uno
,
"g"
},
-
1
)
&&
match_expectation
(
b
,{
uno
,
"2"
},{
"Wp"
,
"g"
,
uno
,
"g"
,
"g"
,
"g"
,
"1"
},
-
1
)
&&
match_expectation
(
b
,{
"1"
,
fkl
},{
"Wm"
,
"g"
,
"2"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
1
)
&&
match_expectation
(
f
,{
fkl
,
uno
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
uno
,
"g"
},
-
3
)
&&
match_expectation
(
b
,{
uno
,
fkl
},{
"g"
,
uno
,
"g"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
4
)
&&
match_expectation
(
f
,{
fkl
,
uno
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
uno
,
"g"
},
-
5
)
&&
match_expectation
(
b
,{
uno
,
fkl
},{
"g"
,
uno
,
"g"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
5
)
&&
match_expectation
(
f
,{
fkl
,
uno
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
uno
,
"g"
},
-
6
)
&&
match_expectation
(
f
,{
fkl
,
uno
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
uno
,
"g"
},
-
7
)
&&
match_expectation
(
b
,{
uno
,
fkl
},{
"g"
,
uno
,
"g"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
7
)
&&
match_expectation
(
f
,{
fkl
,
uno
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
uno
,
"g"
},
-
8
)
&&
match_expectation
(
b
,{
uno
,
fkl
},{
"g"
,
uno
,
"g"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
8
)
&&
match_expectation
(
b
,{
uno
,
fkl
},{
"g"
,
uno
,
"g"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
9
)
&&
match_expectation
(
f
,{
fkl
,
uno
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
uno
,
"g"
},
-
10
)
&&
match_expectation
(
f
,{
fkl
,
uno
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
uno
,
"g"
},
-
11
)
&&
match_expectation
(
b
,{
uno
,
fkl
},{
"g"
,
uno
,
"g"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
11
)
&&
match_expectation
(
f
,{
fkl
,
uno
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
uno
,
"g"
},
-
12
)
&&
match_expectation
(
b
,{
uno
,
fkl
},{
"g"
,
uno
,
"g"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
12
)
&&
match_expectation
(
f
,{
fkl
,
uno
},{
"h"
,
fkl
,
"g"
,
"g"
,
"g"
,
uno
,
"g"
},
-
13
)
&&
match_expectation
(
b
,{
uno
,
fkl
},{
"g"
,
uno
,
"g"
,
"g"
,
"g"
,
fkl
,
"h"
},
-
13
)
&&
match_expectation
(
f
,{
"2"
,
uno
},{
"1"
,
"g"
,
"g"
,
"g"
,
uno
,
"g"
,
"Wp"
},
-
13
)
&&
match_expectation
(
f
,{
fkl
,
"1"
},{
"Wm"
,
fkl
,
"g"
,
"g"
,
"g"
,
"2"
,
"g"
},
-
13
)
&&
match_expectation
(
b
,{
uno
,
"1"
},{
"Wm"
,
"g"
,
uno
,
"g"
,
"g"
,
"g"
,
"2"
},
-
13
)
))
return
false
;
}
return
true
;
}
//! test extremal qqx configurations
//! if implemented==false : check processes that are not in HEJ yet
bool
check_extremal_qqx
(
bool
const
implemented
=
true
){
using
namespace
HEJ
;
auto
const
b
{
implemented
?
event_type
::
qqxexb
:
event_type
::
non_resummable
};
auto
const
f
{
implemented
?
event_type
::
qqxexf
:
event_type
::
non_resummable
};
std
::
vector
<
std
::
string
>
bosons
;
if
(
implemented
)
bosons
=
all_w
;
else
{
bosons
=
all_gZ
;
bosons
.
push_back
(
"h"
);
}
for
(
std
::
string
const
&
qqx
:
all_quarks
)
// all quark flavours
for
(
std
::
string
const
&
fkl
:
all_partons
){
std
::
string
const
qqx2
{
std
::
to_string
(
HEJ
::
to_ParticleID
(
qqx
)
*-
1
)
};
for
(
int
njet
=
3
;
njet
<=
6
;
++
njet
){
// all multiplicities >2
if
(
njet
==
5
)
continue
;
for
(
int
i
=
0
;
i
<
2
;
++
i
){
// forward & backwards
std
::
array
<
std
::
string
,
2
>
base_in
;
std
::
vector
<
std
::
string
>
base_out
(
njet
,
"g"
);
const
int
qqx_pos
=
i
?
0
:
(
njet
-
2
);
const
int
fkl_pos
=
i
?
(
njet
-
1
)
:
0
;
base_in
[
i
?
0
:
1
]
=
"g"
;
base_in
[
i
?
1
:
0
]
=
fkl
;
base_out
[
fkl_pos
]
=
fkl
;
base_out
[
qqx_pos
]
=
qqx
;
base_out
[
qqx_pos
+
1
]
=
qqx2
;
auto
expectation
{
i
?
b
:
f
};
if
(
!
implemented
&&
!
match_expectation
(
expectation
,
base_in
,
base_out
)
)
return
false
;
for
(
auto
const
&
boson
:
bosons
){
// all bosons
// at any position (higgs only inside FKL chain)
int
start
=
0
;
int
end
=
njet
;
if
(
to_ParticleID
(
boson
)
==
pid
::
higgs
){
start
=
i
?
(
qqx_pos
+
2
)
:
fkl_pos
;
end
=
i
?
(
fkl_pos
+
1
)
:
qqx_pos
;
}
for
(
int
pos
=
start
;
pos
<=
end
;
++
pos
){
auto
in
{
base_in
};
auto
out
{
base_out
};
// change quark flavours for W
const
bool
couple_idx
=
std
::
uniform_int_distribution
<
int
>
{
0
,
1
}(
ran
);
if
(
couple_idx
||
!
couple_quark
(
boson
,
out
[
fkl_pos
])
){
// (randomly) try couple to FKL, else fall-back to qqx
if
(
!
couple_quark
(
boson
,
out
[
qqx_pos
]))
couple_quark
(
boson
,
out
[
qqx_pos
+
1
]);
}
out
.
insert
(
out
.
begin
()
+
pos
,
boson
);
if
(
!
match_expectation
(
expectation
,
in
,
out
))
return
false
;
}
}
}
}
// test allowed jet configurations
if
(
!
implemented
){
if
(
!
(
match_expectation
(
f
,{
fkl
,
"g"
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
},
-
3
)
&&
match_expectation
(
b
,{
"g"
,
fkl
},{
qqx
,
qqx2
,
"g"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
4
)
&&
match_expectation
(
f
,{
fkl
,
"g"
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
},
-
5
)
&&
match_expectation
(
b
,{
"g"
,
fkl
},{
qqx
,
qqx2
,
"g"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
5
)
&&
match_expectation
(
f
,{
fkl
,
"g"
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
},
-
6
)
&&
match_expectation
(
f
,{
fkl
,
"g"
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
},
-
7
)
&&
match_expectation
(
b
,{
"g"
,
fkl
},{
qqx
,
qqx2
,
"g"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
7
)
&&
match_expectation
(
f
,{
fkl
,
"g"
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
},
-
8
)
&&
match_expectation
(
b
,{
"g"
,
fkl
},{
qqx
,
qqx2
,
"g"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
8
)
&&
match_expectation
(
b
,{
"g"
,
fkl
},{
qqx
,
qqx2
,
"g"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
9
)
&&
match_expectation
(
f
,{
fkl
,
"g"
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
},
-
10
)
&&
match_expectation
(
f
,{
fkl
,
"g"
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
},
-
11
)
&&
match_expectation
(
b
,{
"g"
,
fkl
},{
qqx
,
qqx2
,
"g"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
11
)
&&
match_expectation
(
f
,{
fkl
,
"g"
},{
fkl
,
"g"
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
},
-
12
)
&&
match_expectation
(
b
,{
"g"
,
fkl
},{
qqx
,
qqx2
,
"g"
,
"g"
,
"g"
,
"g"
,
fkl
},
-
12
)
))
return
false
;
}
else
if
(
fkl
==
"2"
)
{
if
(
!
(
match_expectation
(
f
,{
"2"
,
"g"
},{
"1"
,
"Wp"
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
},
-
3
)
&&
match_expectation
(
b
,{
"g"
,
"2"
},{
qqx
,
qqx2
,
"g"
,
"Wp"
,
"g"
,
"g"
,
"1"
},
-
4
)
&&
match_expectation
(
f
,{
"2"
,
"g"
},{
"1"
,
"Wp"
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
},
-
5
)
&&
match_expectation
(
b
,{
"g"
,
"2"
},{
qqx
,
qqx2
,
"g"
,
"Wp"
,
"g"
,
"g"
,
"1"
},
-
5
)
&&
match_expectation
(
f
,{
"2"
,
"g"
},{
"1"
,
"g"
,
"Wp"
,
"g"
,
"g"
,
qqx
,
qqx2
},
-
6
)
&&
match_expectation
(
f
,{
"2"
,
"g"
},{
"1"
,
"g"
,
"g"
,
"g"
,
"Wp"
,
qqx
,
qqx2
},
-
7
)
&&
match_expectation
(
b
,{
"g"
,
"2"
},{
qqx
,
qqx2
,
"g"
,
"g"
,
"g"
,
"Wp"
,
"1"
},
-
7
)
&&
match_expectation
(
f
,{
"2"
,
"g"
},{
"1"
,
"Wp"
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
},
-
8
)
&&
match_expectation
(
b
,{
"g"
,
"2"
},{
qqx
,
qqx2
,
"Wp"
,
"g"
,
"g"
,
"g"
,
"1"
},
-
8
)
&&
match_expectation
(
b
,{
"g"
,
"2"
},{
qqx
,
qqx2
,
"g"
,
"Wp"
,
"g"
,
"g"
,
"1"
},
-
9
)
&&
match_expectation
(
f
,{
"2"
,
"g"
},{
"1"
,
"g"
,
"g"
,
"g"
,
"Wp"
,
qqx
,
qqx2
},
-
10
)
&&
match_expectation
(
f
,{
"2"
,
"g"
},{
"1"
,
"g"
,
"g"
,
"g"
,
"Wp"
,
qqx
,
qqx2
},
-
11
)
&&
match_expectation
(
b
,{
"g"
,
"2"
},{
qqx
,
qqx2
,
"g"
,
"g"
,
"g"
,
"Wp"
,
"1"
},
-
11
)
&&
match_expectation
(
f
,{
"2"
,
"g"
},{
"1"
,
"g"
,
"g"
,
"g"
,
"Wp"
,
qqx
,
qqx2
},
-
12
)
&&
match_expectation
(
b
,{
"g"
,
"2"
},{
qqx
,
qqx2
,
"g"
,
"Wp"
,
"g"
,
"g"
,
"1"
},
-
12
)
))
return
false
;
}
}
return
true
;
}
//! test central qqx configurations
//! if implemented==false : check processes that are not in HEJ yet
bool
check_central_qqx
(
bool
const
implemented
=
true
){
using
namespace
HEJ
;
auto
const
t
{
implemented
?
event_type
::
qqxmid
:
event_type
::
non_resummable
};
std
::
vector
<
std
::
string
>
bosons
;
if
(
implemented
)
bosons
=
all_w
;
else
{
bosons
=
all_gZ
;
bosons
.
push_back
(
"h"
);
}
for
(
std
::
string
const
&
qqx
:
all_quarks
)
// all quark flavours
for
(
std
::
string
const
&
fkl1
:
all_partons
)
for
(
std
::
string
const
&
fkl2
:
all_partons
){
std
::
string
const
qqx2
{
std
::
to_string
(
HEJ
::
to_ParticleID
(
qqx
)
*-
1
)
};
for
(
int
njet
=
4
;
njet
<=
6
;
++
njet
){
// all multiplicities >3
if
(
njet
==
5
)
continue
;
for
(
int
qqx_pos
=
1
;
qqx_pos
<
njet
-
2
;
++
qqx_pos
){
// any qqx position
std
::
array
<
std
::
string
,
2
>
base_in
;
std
::
vector
<
std
::
string
>
base_out
(
njet
,
"g"
);
base_in
[
0
]
=
fkl1
;
base_in
[
1
]
=
fkl2
;
base_out
.
front
()
=
fkl1
;
base_out
.
back
()
=
fkl2
;
base_out
[
qqx_pos
]
=
qqx
;
base_out
[
qqx_pos
+
1
]
=
qqx2
;
if
(
!
implemented
&&
!
match_expectation
(
t
,
base_in
,
base_out
)
)
return
false
;
for
(
auto
const
&
boson
:
bosons
)
// any boson
for
(
int
pos
=
0
;
pos
<=
njet
;
++
pos
){
// at any position
if
(
to_ParticleID
(
boson
)
==
pid
::
higgs
&&
(
pos
==
qqx_pos
||
pos
==
qqx_pos
+
1
)
)
continue
;
auto
in
{
base_in
};
auto
out
{
base_out
};
// change quark flavours for W
const
int
couple_idx
{
std
::
uniform_int_distribution
<
int
>
{
0
,
2
}(
ran
)
};
// (randomly) try couple to FKL, else fall-back to qqx
if
(
couple_idx
==
0
&&
couple_quark
(
boson
,
out
.
front
())
){}
else
if
(
couple_idx
==
1
&&
couple_quark
(
boson
,
out
.
back
())
){}
else
{
if
(
!
couple_quark
(
boson
,
out
[
qqx_pos
]))
couple_quark
(
boson
,
out
[
qqx_pos
+
1
]);
}
out
.
insert
(
out
.
begin
()
+
pos
,
boson
);
if
(
!
match_expectation
(
t
,
in
,
out
))
return
false
;
}
}
}
// test allowed jet configurations (non exhaustive collection)
if
(
!
implemented
){
if
(
!
(
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
"g"
,
qqx
,
qqx2
,
"g"
,
"g"
,
fkl2
},
-
3
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
"g"
,
"g"
,
qqx
,
qqx2
,
"g"
,
fkl2
},
-
3
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
"g"
,
"g"
,
qqx
,
qqx2
,
"g"
,
fkl2
},
-
4
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
qqx
,
qqx2
,
"g"
,
"g"
,
"g"
,
fkl2
},
-
4
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
,
fkl2
},
-
5
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
"g"
,
"g"
,
qqx
,
qqx2
,
"g"
,
fkl2
},
-
6
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
"g"
,
qqx
,
qqx2
,
"g"
,
"g"
,
fkl2
},
-
7
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
,
fkl2
},
-
7
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
qqx
,
qqx2
,
"g"
,
"g"
,
"g"
,
fkl2
},
-
8
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
,
fkl2
},
-
8
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
qqx
,
qqx2
,
"g"
,
"g"
,
"g"
,
fkl2
},
-
9
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
"g"
,
qqx
,
qqx2
,
"g"
,
"g"
,
fkl2
},
-
9
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
"g"
,
"g"
,
qqx
,
qqx2
,
"g"
,
fkl2
},
-
10
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
,
fkl2
},
-
10
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
,
fkl2
},
-
11
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
"g"
,
"g"
,
qqx
,
qqx2
,
"g"
,
fkl2
},
-
12
)
&&
match_expectation
(
t
,{
fkl1
,
fkl2
},{
fkl1
,
"g"
,
"g"
,
"g"
,
qqx
,
qqx2
,
fkl2
},
-
12
)
))
return
false
;
}
else
if
(
fkl1
==
"1"
)
{
if
(
!
(
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
"Wm"
,
qqx
,
qqx2
,
"g"
,
"g"
,
fkl2
},
-
3
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
"g"
,
"Wm"
,
qqx
,
qqx2
,
"g"
,
fkl2
},
-
3
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
"g"
,
"g"
,
qqx
,
qqx2
,
"Wm"
,
fkl2
},
-
4
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
qqx
,
qqx2
,
"g"
,
"Wm"
,
"g"
,
fkl2
},
-
4
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
"g"
,
"g"
,
"Wm"
,
qqx
,
qqx2
,
fkl2
},
-
5
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
"g"
,
"Wm"
,
qqx
,
qqx2
,
"g"
,
fkl2
},
-
6
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
"Wm"
,
qqx
,
qqx2
,
"g"
,
"g"
,
fkl2
},
-
7
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
"g"
,
"Wm"
,
"g"
,
qqx
,
qqx2
,
fkl2
},
-
7
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
qqx
,
qqx2
,
"Wm"
,
"g"
,
"g"
,
fkl2
},
-
8
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
"g"
,
"g"
,
"Wm"
,
qqx
,
qqx2
,
fkl2
},
-
8
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
qqx
,
qqx2
,
"g"
,
"Wm"
,
"g"
,
fkl2
},
-
9
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
"g"
,
qqx
,
qqx2
,
"g"
,
"Wm"
,
fkl2
},
-
9
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
"g"
,
"g"
,
qqx
,
qqx2
,
"Wm"
,
fkl2
},
-
10
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
"g"
,
"g"
,
"Wm"
,
qqx
,
qqx2
,
fkl2
},
-
10
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
"g"
,
"Wm"
,
"g"
,
qqx
,
qqx2
,
fkl2
},
-
11
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
"Wm"
,
"g"
,
qqx
,
qqx2
,
"g"
,
fkl2
},
-
12
)
&&
match_expectation
(
t
,{
"1"
,
fkl2
},{
"2"
,
"g"
,
"Wm"
,
"g"
,
qqx
,
qqx2
,
fkl2
},
-
12
)
))
return
false
;
}
}
return
true
;
}
// this checks a (non excessive) list of non-resummable states
bool
check_non_resummable
(){
auto
type
{
HEJ
::
event_type
::
non_resummable
};
return
// 2j - crossing lines
match_expectation
(
type
,
{
"g"
,
"2"
},
{
"2"
,
"g"
})
&&
match_expectation
(
type
,
{
"-1"
,
"g"
},
{
"g"
,
"-1"
})
&&
match_expectation
(
type
,
{
"1"
,
"-1"
},
{
"-1"
,
"1"
})
&&
match_expectation
(
type
,
{
"g"
,
"2"
},
{
"2"
,
"g"
,
"h"
})
&&
match_expectation
(
type
,
{
"1"
,
"2"
},
{
"2"
,
"h"
,
"1"
})
&&
match_expectation
(
type
,
{
"1"
,
"-1"
},
{
"h"
,
"-1"
,
"1"
})
&&
match_expectation
(
type
,
{
"g"
,
"2"
},
{
"Wp"
,
"1"
,
"g"
})
&&
match_expectation
(
type
,
{
"1"
,
"-1"
},
{
"-2"
,
"Wp"
,
"1"
})
&&
match_expectation
(
type
,
{
"4"
,
"g"
},
{
"g"
,
"3"
,
"Wp"
})
&&
match_expectation
(
type
,
{
"1"
,
"-2"
},
{
"-1"
,
"Wm"
,
"1"
})
&&
match_expectation
(
type
,
{
"g"
,
"3"
},
{
"4"
,
"g"
,
"Wm"
})
&&
match_expectation
(
type
,
{
"1"
,
"3"
},
{
"Wm"
,
"4"
,
"1"
})
// 2j - qqx
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"1"
,
"-1"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"-2"
,
"2"
,
"h"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"-4"
,
"Wp"
,
"3"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"Wm"
,
"-1"
,
"2"
})
// 3j - crossing lines
&&
match_expectation
(
type
,
{
"g"
,
"4"
},
{
"4"
,
"g"
,
"g"
})
&&
match_expectation
(
type
,
{
"-1"
,
"g"
},
{
"g"
,
"g"
,
"-1"
})
&&
match_expectation
(
type
,
{
"1"
,
"3"
},
{
"3"
,
"g"
,
"1"
})
&&
match_expectation
(
type
,
{
"-2"
,
"2"
},
{
"2"
,
"g"
,
"-2"
,
"h"
})
&&
match_expectation
(
type
,
{
"-3"
,
"g"
},
{
"g"
,
"g"
,
"Wp"
,
"-4"
})
&&
match_expectation
(
type
,
{
"1"
,
"-2"
},
{
"Wm"
,
"-1"
,
"g"
,
"1"
})
&&
match_expectation
(
type
,
{
"-1"
,
"g"
},
{
"1"
,
"-1"
,
"-1"
})
// higgs inside uno
&&
match_expectation
(
type
,
{
"-1"
,
"g"
},
{
"g"
,
"h"
,
"-1"
,
"g"
})
&&
match_expectation
(
type
,
{
"-1"
,
"1"
},
{
"g"
,
"h"
,
"-1"
,
"1"
})
&&
match_expectation
(
type
,
{
"g"
,
"2"
},
{
"g"
,
"2"
,
"h"
,
"g"
})
&&
match_expectation
(
type
,
{
"-1"
,
"1"
},
{
"-1"
,
"1"
,
"h"
,
"g"
})
// higgs outside uno
&&
match_expectation
(
type
,
{
"-1"
,
"g"
},
{
"h"
,
"g"
,
"-1"
,
"g"
})
&&
match_expectation
(
type
,
{
"-1"
,
"1"
},
{
"-1"
,
"1"
,
"g"
,
"h"
})
// higgs inside qqx
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"-1"
,
"h"
,
"1"
,
"g"
,
"g"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"-1"
,
"h"
,
"1"
,
"g"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"g"
,
"2"
,
"h"
,
"-2"
})
// higgs outside qqx
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"h"
,
"-1"
,
"1"
,
"g"
,
"g"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"g"
,
"2"
,
"-2"
,
"h"
})
// 4j - two uno
&&
match_expectation
(
type
,
{
"-2"
,
"2"
},
{
"g"
,
"-2"
,
"2"
,
"g"
})
&&
match_expectation
(
type
,
{
"1"
,
"3"
},
{
"g"
,
"1"
,
"h"
,
"3"
,
"g"
})
&&
match_expectation
(
type
,
{
"1"
,
"2"
},
{
"g"
,
"1"
,
"3"
,
"Wp"
,
"g"
})
&&
match_expectation
(
type
,
{
"1"
,
"-2"
},
{
"g"
,
"Wm"
,
"1"
,
"-1"
,
"g"
})
// 4j - two gluon outside
&&
match_expectation
(
type
,
{
"g"
,
"4"
},
{
"g"
,
"4"
,
"g"
,
"g"
})
&&
match_expectation
(
type
,
{
"1"
,
"3"
},
{
"1"
,
"3"
,
"h"
,
"g"
,
"g"
})
&&
match_expectation
(
type
,
{
"1"
,
"2"
},
{
"1"
,
"3"
,
"g"
,
"Wp"
,
"g"
})
&&
match_expectation
(
type
,
{
"1"
,
"-2"
},
{
"1"
,
"Wm"
,
"-1"
,
"g"
,
"g"
})
&&
match_expectation
(
type
,
{
"-1"
,
"g"
},
{
"g"
,
"g"
,
"-1"
,
"g"
})
&&
match_expectation
(
type
,
{
"1"
,
"3"
},
{
"g"
,
"g"
,
"1"
,
"3"
,
"h"
})
&&
match_expectation
(
type
,
{
"1"
,
"2"
},
{
"g"
,
"g"
,
"1"
,
"Wp"
,
"3"
})
&&
match_expectation
(
type
,
{
"1"
,
"-2"
},
{
"Wm"
,
"g"
,
"g"
,
"1"
,
"-1"
})
// 4j - ggx+uno
&&
match_expectation
(
type
,
{
"g"
,
"4"
},
{
"1"
,
"-1"
,
"4"
,
"g"
})
&&
match_expectation
(
type
,
{
"2"
,
"g"
},
{
"g"
,
"2"
,
"-3"
,
"3"
})
&&
match_expectation
(
type
,
{
"g"
,
"4"
},
{
"1"
,
"-1"
,
"h"
,
"4"
,
"g"
})
&&
match_expectation
(
type
,
{
"2"
,
"g"
},
{
"g"
,
"2"
,
"-3"
,
"3"
,
"h"
})
&&
match_expectation
(
type
,
{
"g"
,
"4"
},
{
"Wp"
,
"1"
,
"-1"
,
"3"
,
"g"
})
&&
match_expectation
(
type
,
{
"2"
,
"g"
},
{
"g"
,
"2"
,
"-4"
,
"Wp"
,
"3"
})
&&
match_expectation
(
type
,
{
"g"
,
"4"
},
{
"2"
,
"Wm"
,
"-1"
,
"4"
,
"g"
})
&&
match_expectation
(
type
,
{
"2"
,
"g"
},
{
"g"
,
"2"
,
"Wp"
,
"-3"
,
"4"
})
// 3j - crossing+uno
&&
match_expectation
(
type
,
{
"1"
,
"4"
},
{
"g"
,
"4"
,
"1"
})
&&
match_expectation
(
type
,
{
"1"
,
"4"
},
{
"4"
,
"1"
,
"g"
})
&&
match_expectation
(
type
,
{
"1"
,
"4"
},
{
"g"
,
"h"
,
"4"
,
"1"
})
&&
match_expectation
(
type
,
{
"-1"
,
"-3"
},{
"Wm"
,
"g"
,
"-4"
,
"-1"
})
&&
match_expectation
(
type
,
{
"1"
,
"4"
},
{
"3"
,
"1"
,
"Wp"
,
"g"
})
&&
match_expectation
(
type
,
{
"1"
,
"4"
},
{
"3"
,
"1"
,
"g"
,
"h"
})
// 3j - crossing+qqx
&&
match_expectation
(
type
,
{
"1"
,
"g"
},
{
"-1"
,
"1"
,
"g"
,
"1"
})
&&
match_expectation
(
type
,
{
"1"
,
"g"
},
{
"-1"
,
"1"
,
"1"
,
"g"
})
&&
match_expectation
(
type
,
{
"g"
,
"1"
},
{
"1"
,
"g"
,
"1"
,
"-1"
})
&&
match_expectation
(
type
,
{
"g"
,
"1"
},
{
"g"
,
"1"
,
"1"
,
"-1"
})
&&
match_expectation
(
type
,
{
"1"
,
"g"
},
{
"2"
,
"-2"
,
"g"
,
"1"
})
&&
match_expectation
(
type
,
{
"1"
,
"g"
},
{
"2"
,
"-2"
,
"1"
,
"g"
})
&&
match_expectation
(
type
,
{
"g"
,
"1"
},
{
"1"
,
"g"
,
"-2"
,
"2"
})
&&
match_expectation
(
type
,
{
"g"
,
"1"
},
{
"g"
,
"1"
,
"-2"
,
"2"
})
&&
match_expectation
(
type
,
{
"1"
,
"g"
},
{
"-1"
,
"1"
,
"h"
,
"g"
,
"1"
})
&&
match_expectation
(
type
,
{
"1"
,
"g"
},
{
"-1"
,
"h"
,
"1"
,
"1"
,
"g"
})
&&
match_expectation
(
type
,
{
"g"
,
"1"
},
{
"1"
,
"g"
,
"1"
,
"h"
,
"-1"
})
&&
match_expectation
(
type
,
{
"g"
,
"1"
},
{
"h"
,
"g"
,
"1"
,
"1"
,
"-1"
})
&&
match_expectation
(
type
,
{
"1"
,
"g"
},
{
"2"
,
"-2"
,
"1"
,
"g"
,
"h"
})
&&
match_expectation
(
type
,
{
"g"
,
"1"
},
{
"g"
,
"h"
,
"1"
,
"-2"
,
"2"
})
&&
match_expectation
(
type
,
{
"1"
,
"g"
},
{
"Wp"
,
"3"
,
"-4"
,
"g"
,
"1"
})
&&
match_expectation
(
type
,
{
"3"
,
"g"
},
{
"-2"
,
"Wm"
,
"1"
,
"3"
,
"g"
})
&&
match_expectation
(
type
,
{
"g"
,
"1"
},
{
"1"
,
"g"
,
"Wm"
,
"-3"
,
"4"
})
&&
match_expectation
(
type
,
{
"g"
,
"-3"
},
{
"g"
,
"-3"
,
"-1"
,
"Wp"
,
"2"
})
// 4j- gluon in qqx
&&
match_expectation
(
type
,
{
"g"
,
"1"
},
{
"1"
,
"g"
,
"-1"
,
"1"
})
&&
match_expectation
(
type
,
{
"1"
,
"g"
},
{
"1"
,
"-1"
,
"g"
,
"1"
})
&&
match_expectation
(
type
,
{
"g"
,
"1"
},
{
"1"
,
"g"
,
"Wm"
,
"-2"
,
"1"
})
&&
match_expectation
(
type
,
{
"2"
,
"g"
},
{
"2"
,
"-2"
,
"g"
,
"Wp"
,
"1"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"Wp"
,
"3"
,
"g"
,
"-4"
,
"g"
})
&&
match_expectation
(
type
,
{
"1"
,
"g"
},
{
"1"
,
"h"
,
"-1"
,
"g"
,
"1"
})
// 6j - two qqx
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"1"
,
"-1"
,
"g"
,
"g"
,
"1"
,
"-1"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"1"
,
"-1"
,
"g"
,
"1"
,
"-1"
,
"g"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"1"
,
"-1"
,
"g"
,
"1"
,
"-1"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"1"
,
"-1"
,
"1"
,
"-1"
,
"g"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"1"
,
"1"
,
"-1"
,
"-1"
,
"g"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"h"
,
"1"
,
"-1"
,
"g"
,
"g"
,
"1"
,
"-1"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"1"
,
"Wp"
,
"-2"
,
"g"
,
"1"
,
"-1"
,
"g"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"1"
,
"Wp"
,
"-1"
,
"g"
,
"1"
,
"-2"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"1"
,
"-1"
,
"Wm"
,
"2"
,
"-1"
,
"g"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"1"
,
"2"
,
"-1"
,
"Wm"
,
"-1"
,
"g"
})
// random stuff (can be non-physical)
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"1"
,
"-2"
,
"2"
,
"-1"
})
// != 2 qqx
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"1"
,
"-2"
,
"2"
,
"g"
})
// could be qqx
&&
match_expectation
(
type
,
{
"e+"
,
"e-"
},{
"1"
,
"-1"
})
// bad initial state
&&
match_expectation
(
type
,
{
"1"
,
"e-"
},
{
"g"
,
"1"
,
"Wm"
})
// bad initial state
&&
match_expectation
(
type
,
{
"h"
,
"g"
},
{
"g"
,
"g"
})
// bad initial state
&&
match_expectation
(
type
,
{
"-1"
,
"g"
},
{
"-1"
,
"1"
,
"1"
})
// bad qqx
&&
match_expectation
(
type
,
{
"-1"
,
"g"
},
{
"1"
,
"1"
,
"-1"
})
// crossing in bad qqx
&&
match_expectation
(
type
,
{
"-1"
,
"g"
},
{
"-2"
,
"1"
,
"1"
,
"Wp"
})
// bad qqx
&&
match_expectation
(
type
,
{
"1"
,
"2"
},
{
"1"
,
"-1"
,
"g"
,
"g"
,
"g"
,
"2"
})
// bad qqx
&&
match_expectation
(
type
,
{
"1"
,
"2"
},
{
"1"
,
"-1"
,
"-2"
,
"g"
,
"g"
,
"2"
})
// gluon in bad qqx
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"-1"
,
"2"
,
"g"
,
"g"
})
// wrong back qqx
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"g"
,
"2"
,
"1"
})
// wrong forward qqx
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"-2"
,
"1"
,
"g"
})
// wrong central qqx
;
}
// Events failing the jet requirements, e.g. qqx inside one jet
bool
check_illegal_jets
(){
auto
type
{
HEJ
::
event_type
::
non_resummable
};
return
true
// uno backward not in jet
&&
match_expectation
(
type
,
{
"1"
,
"g"
},
{
"g"
,
"1"
,
"g"
,
"g"
,
"g"
,
"g"
,
"g"
},
-
1
)
// & also legal uno on other side
&&
match_expectation
(
type
,
{
"1"
,
"1"
},
{
"g"
,
"1"
,
"g"
,
"g"
,
"g"
,
"1"
,
"g"
},
-
1
)
// qqx backward not in jet
&&
match_expectation
(
type
,
{
"g"
,
"2"
},
{
"-1"
,
"1"
,
"g"
,
"g"
,
"g"
,
"g"
,
"2"
},
-
1
)
// uno forward not in jet
&&
match_expectation
(
type
,
{
"3"
,
"3"
},
{
"3"
,
"g"
,
"g"
,
"g"
,
"g"
,
"3"
,
"g"
},
-
2
)
// qqx backward not in jet
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"g"
,
"g"
,
"g"
,
"g"
,
"-2"
,
"2"
},
-
2
)
// uno backward in same jet
&&
match_expectation
(
type
,
{
"1"
,
"g"
},
{
"g"
,
"1"
,
"g"
,
"g"
,
"g"
,
"g"
,
"g"
},
-
3
)
// & also legal uno on other side
&&
match_expectation
(
type
,
{
"1"
,
"1"
},
{
"g"
,
"1"
,
"g"
,
"g"
,
"g"
,
"1"
,
"g"
},
-
3
)
// qqx backward in same jet
&&
match_expectation
(
type
,
{
"g"
,
"2"
},
{
"-4"
,
"4"
,
"g"
,
"g"
,
"g"
,
"g"
,
"2"
},
-
3
)
// uno forward in same jet
&&
match_expectation
(
type
,
{
"3"
,
"2"
},
{
"3"
,
"g"
,
"g"
,
"g"
,
"g"
,
"2"
,
"g"
},
-
4
)
// qqx backward in same jet
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"g"
,
"g"
,
"g"
,
"g"
,
"-2"
,
"2"
},
-
4
)
// central qqx not in jet
&&
match_expectation
(
type
,
{
"1"
,
"2"
},
{
"1"
,
"g"
,
"-1"
,
"1"
,
"g"
,
"g"
,
"2"
},
-
5
)
// central qqx in same jet
&&
match_expectation
(
type
,
{
"1"
,
"2"
},
{
"1"
,
"-1"
,
"1"
,
"g"
,
"g"
,
"g"
,
"2"
},
-
6
)
// central qqx in same jet
&&
match_expectation
(
type
,
{
"1"
,
"2"
},
{
"1"
,
"g"
,
"g"
,
"g"
,
"2"
,
"-2"
,
"2"
},
-
6
)
// central qqx in same jet
&&
match_expectation
(
type
,
{
"1"
,
"2"
},
{
"1"
,
"-1"
,
"1"
,
"g"
,
"g"
,
"g"
,
"2"
},
-
7
)
// central qqx in same jet
&&
match_expectation
(
type
,
{
"1"
,
"2"
},
{
"1"
,
"g"
,
"g"
,
"3"
,
"-3"
,
"g"
,
"2"
},
-
7
)
// central qqx in same jet
&&
match_expectation
(
type
,
{
"g"
,
"3"
},
{
"g"
,
"g"
,
"-2"
,
"2"
,
"g"
,
"g"
,
"3"
},
-
8
)
// central qqx in same jet
&&
match_expectation
(
type
,
{
"g"
,
"-2"
},
{
"g"
,
"g"
,
"g"
,
"2"
,
"-2"
,
"g"
,
"-2"
},
-
8
)
// FKL not in own jet
&&
match_expectation
(
type
,
{
"1"
,
"1"
},
{
"1"
,
"g"
,
"g"
,
"g"
,
"g"
,
"g"
,
"1"
},
-
1
)
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"g"
,
"g"
,
"g"
,
"g"
,
"g"
,
"g"
},
-
2
)
&&
match_expectation
(
type
,
{
"1"
,
"-3"
},
{
"1"
,
"g"
,
"g"
,
"g"
,
"g"
,
"-3"
,
"g"
},
-
1
)
&&
match_expectation
(
type
,
{
"2"
,
"g"
},
{
"g"
,
"2"
,
"g"
,
"g"
,
"g"
,
"g"
,
"g"
},
-
2
)
&&
match_expectation
(
type
,
{
"2"
,
"g"
},
{
"2"
,
"g"
,
"g"
,
"g"
,
"g"
,
"2"
,
"-2"
},
-
1
)
&&
match_expectation
(
type
,
{
"g"
,
"-2"
},
{
"4"
,
"-4"
,
"g"
,
"g"
,
"g"
,
"g"
,
"-2"
},
-
2
)
&&
match_expectation
(
type
,
{
"-1"
,
"g"
},
{
"-1"
,
"1"
,
"-1"
,
"g"
,
"g"
,
"g"
,
"g"
},
-
1
)
&&
match_expectation
(
type
,
{
"4"
,
"-3"
},
{
"4"
,
"g"
,
"g"
,
"1"
,
"-1"
,
"g"
,
"-3"
},
-
2
)
// FKL in same jet
&&
match_expectation
(
type
,
{
"1"
,
"1"
},
{
"1"
,
"g"
,
"g"
,
"g"
,
"g"
,
"g"
,
"1"
},
-
13
)
// uno in same jet as FKL
&&
match_expectation
(
type
,
{
"-1"
,
"1"
},
{
"-1"
,
"g"
,
"g"
,
"g"
,
"g"
,
"1"
,
"g"
},
-
9
)
&&
match_expectation
(
type
,
{
"-1"
,
"1"
},
{
"g"
,
"-1"
,
"g"
,
"g"
,
"g"
,
"g"
,
"1"
},
-
10
)
&&
match_expectation
(
type
,
{
"-1"
,
"1"
},
{
"-1"
,
"g"
,
"g"
,
"g"
,
"g"
,
"1"
,
"g"
},
-
13
)
&&
match_expectation
(
type
,
{
"-1"
,
"1"
},
{
"g"
,
"-1"
,
"g"
,
"g"
,
"g"
,
"g"
,
"1"
},
-
13
)
// extremal qqx in same jet as FKL
&&
match_expectation
(
type
,
{
"-1"
,
"g"
},
{
"-1"
,
"g"
,
"g"
,
"g"
,
"g"
,
"1"
,
"-1"
},
-
9
)
&&
match_expectation
(
type
,
{
"g"
,
"1"
},
{
"1"
,
"-1"
,
"g"
,
"g"
,
"g"
,
"g"
,
"1"
},
-
10
)
&&
match_expectation
(
type
,
{
"-1"
,
"g"
},
{
"-1"
,
"g"
,
"g"
,
"g"
,
"g"
,
"-1"
,
"1"
},
-
13
)
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"g"
,
"g"
,
"g"
,
"g"
,
"-1"
,
"1"
},
-
13
)
// central qqx in same jet as FKL
&&
match_expectation
(
type
,{
"2"
,
"2"
},
{
"2"
,
"-2"
,
"2"
,
"g"
,
"g"
,
"g"
,
"2"
},
-
3
)
&&
match_expectation
(
type
,{
"-1"
,
"g"
},
{
"-1"
,
"g"
,
"g"
,
"g"
,
"2"
,
"-2"
,
"g"
},
-
4
)
&&
match_expectation
(
type
,{
"g"
,
"4"
},
{
"g"
,
"g"
,
"-4"
,
"4"
,
"g"
,
"g"
,
"4"
},
-
6
)
&&
match_expectation
(
type
,{
"g"
,
"g"
},
{
"g"
,
"3"
,
"-3"
,
"g"
,
"g"
,
"g"
,
"g"
},
-
6
)
&&
match_expectation
(
type
,{
"g"
,
"1"
},
{
"g"
,
"g"
,
"g"
,
"g"
,
"-2"
,
"2"
,
"1"
},
-
9
)
&&
match_expectation
(
type
,{
"g"
,
"g"
},
{
"g"
,
"1"
,
"-1"
,
"g"
,
"g"
,
"g"
,
"g"
},
-
10
)
&&
match_expectation
(
type
,{
"g"
,
"1"
},
{
"g"
,
"g"
,
"-2"
,
"2"
,
"g"
,
"g"
,
"1"
},
-
11
)
&&
match_expectation
(
type
,{
"g"
,
"1"
},
{
"g"
,
"-2"
,
"2"
,
"g"
,
"g"
,
"g"
,
"1"
},
-
11
)
&&
match_expectation
(
type
,{
"3"
,
"2"
},
{
"3"
,
"g"
,
"-1"
,
"1"
,
"g"
,
"g"
,
"2"
},
-
12
)
&&
match_expectation
(
type
,{
"3"
,
"-2"
},
{
"3"
,
"-1"
,
"1"
,
"g"
,
"g"
,
"g"
,
"-2"
},
-
12
)
&&
match_expectation
(
type
,{
"3"
,
"-2"
},
{
"3"
,
"-1"
,
"1"
,
"g"
,
"g"
,
"g"
,
"-2"
},
-
13
)
;
}
// Two boson states, that are currently not implemented
bool
check_bad_FS
(){
auto
type
{
HEJ
::
event_type
::
bad_final_state
};
return
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
,
"h"
,
"h"
,
"g"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"h"
,
"g"
,
"h"
,
"g"
})
&&
match_expectation
(
type
,
{
"g"
,
"-1"
},
{
"g"
,
"h"
,
"Wp"
,
"-2"
})
&&
match_expectation
(
type
,
{
"-3"
,
"-1"
},{
"-4"
,
"g"
,
"Wp"
,
"Wp"
,
"-2"
})
&&
match_expectation
(
type
,
{
"-4"
,
"-1"
},{
"-3"
,
"Wp"
,
"g"
,
"Wm"
,
"-2"
})
&&
match_expectation
(
type
,
{
"-4"
,
"-1"
},{
"g"
,
"-3"
,
"Wp"
,
"Wm"
,
"-2"
})
&&
match_expectation
(
type
,
{
"-4"
,
"-1"
},{
"-4"
,
"g"
,
"11"
,
"-11"
,
"-2"
})
&&
match_expectation
(
type
,
{
"-4"
,
"-1"
},{
"-4"
,
"g"
,
"-13"
,
"g"
,
"-2"
})
&&
match_expectation
(
type
,
{
"3"
,
"-2"
},
{
"Wp"
,
"3"
,
"Wm"
,
"g"
,
"g"
,
"g"
,
"-2"
},
-
13
)
;
}
// not 2 jets
bool
check_not_2_jets
(){
auto
type
{
HEJ
::
event_type
::
no_2_jets
};
return
match_expectation
(
type
,
{
"g"
,
"g"
},
{})
&&
match_expectation
(
type
,
{
"1"
,
"-1"
},
{})
&&
match_expectation
(
type
,
{
"g"
,
"-1"
},
{
"-1"
})
&&
match_expectation
(
type
,
{
"g"
,
"g"
},
{
"g"
})
;
}
// not implemented processes
bool
check_not_implemented
(){
return
check_fkl
(
false
)
&&
check_uno
(
false
)
&&
check_extremal_qqx
(
false
)
&&
check_central_qqx
(
false
);
}
}
int
main
()
{
// tests for "no false negatives"
// i.e. all HEJ-configurations get classified correctly
if
(
!
check_fkl
())
return
EXIT_FAILURE
;
if
(
!
check_uno
())
return
EXIT_FAILURE
;
if
(
!
check_extremal_qqx
())
return
EXIT_FAILURE
;
if
(
!
check_central_qqx
())
return
EXIT_FAILURE
;
// test for "no false positive"
// i.e. non-resummable gives non-resummable
if
(
!
check_non_resummable
())
return
EXIT_FAILURE
;
if
(
!
check_illegal_jets
())
return
EXIT_FAILURE
;
if
(
!
check_bad_FS
())
return
EXIT_FAILURE
;
if
(
!
check_not_2_jets
())
return
EXIT_FAILURE
;
if
(
!
check_not_implemented
())
return
EXIT_FAILURE
;
return
EXIT_SUCCESS
;
}
File Metadata
Details
Attached
Mime Type
text/x-c
Expires
Tue, Sep 30, 4:43 AM (15 h, 36 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
6533099
Default Alt Text
test_classify.cc (58 KB)
Attached To
Mode
rHEJ HEJ
Attached
Detach File
Event Timeline
Log In to Comment