ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Generators
PowhegControl
python
processes
powheg
ttZ.py
Go to the documentation of this file.
1
# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
3
from
...
import
Logging
4
from
..powheg_V2
import
PowhegV2
5
from
..external
import
ExternalMadSpin
6
7
8
logger = Logging.logging.getLogger(
"PowhegControl"
)
9
10
11
12
# Dictionary to convert the PowhegControl decay mode names to the appropriate
13
# decay mode numbers understood by Powheg
14
_decay_mode_lookup = {
15
"t t~ z > all [MadSpin]"
:
"00000"
,
# switch off decays in Powheg and let MadSpin handle them!
16
't t~ z > all'
:
'22222'
,
17
't t~ z > b j j b~ j j emu+ emu-'
:
'00022'
,
18
't t~ z > b l+ vl b~ l- vl~ emu+ emu-'
:
'22200'
,
19
"t t~ z > b emu+ vemu b~ emu- vemu~ emu+ emu-"
:
"22000"
,
20
't t~ z > semileptonic + emu+ emu-'
:
'11111'
,
# additionally need to set the "semileptonic" parameter
21
't t~ z > undecayed'
:
'00000'
,
22
}
23
24
25
26
class
ttZ
(
PowhegV2
):
27
"""
28
Powheg interface for ttZ production.
29
30
Reference for this process: https://arxiv.org/abs/2112.08892
31
32
@author Timothee Theveneaux-Pelzer <tpelzer@cern.ch>
33
"""
34
35
def
__init__
(self, base_directory, **kwargs):
36
"""! Constructor: all process options are set here.
37
38
@param base_directory: path to PowhegBox code.
39
@param kwargs dictionary of arguments from Gen_tf.
40
"""
41
super(ttZ, self).
__init__
(base_directory,
"ttZ"
, **kwargs)
42
43
# List of allowed decay modes
44
# (The sorting of the list is just to increase readability when it's printed)
45
self.
allowed_decay_modes
= sorted(_decay_mode_lookup.keys())
46
47
# Add algorithms to the sequence
48
self.
add_algorithm
(
ExternalMadSpin
(process=
"generate p p > t t~ e+ e- [QCD]\nadd process p p > t t~ mu+ mu- [QCD]"
))
49
50
self.
validation_functions
.append(
"validate_decays"
)
51
self.
validation_functions
.append(
"get_nlox_params_file"
)
52
53
# Add all keywords for this process, overriding defaults if required
54
self.
add_keyword
(
"bornonly"
)
55
self.
add_keyword
(
"elbranching"
)
56
self.
add_keyword
(
"bmass"
)
57
self.
add_keyword
(
"CKM_Vcd"
)
58
self.
add_keyword
(
"CKM_Vcs"
)
59
self.
add_keyword
(
"CKM_Vud"
)
60
self.
add_keyword
(
"CKM_Vus"
)
61
self.
add_keyword
(
"clobberlhe"
)
62
self.
add_keyword
(
"colltest"
)
63
self.
add_keyword
(
"compress_lhe"
)
64
self.
add_keyword
(
"compress_upb"
)
65
self.
add_keyword
(
"compute_rwgt"
)
66
self.
add_keyword
(
"delta_mttmin"
)
67
self.
add_keyword
(
"dynamic_hdamp"
)
68
self.
add_keyword
(
"facscfact"
, self.
default_scales
[0])
69
self.
add_keyword
(
"fakevirt"
)
70
self.
add_keyword
(
"fastbtlbound"
)
71
self.
add_keyword
(
"foldcsi"
, 2)
72
self.
add_keyword
(
"foldphi"
, 2)
73
self.
add_keyword
(
"foldy"
, 2)
74
self.
add_keyword
(
"for_reweighting"
)
75
self.
add_keyword
(
"gfermi"
)
76
self.
add_keyword
(
"hbzd"
)
77
self.
add_keyword
(
"hdamp"
)
78
self.
add_keyword
(
"hmass"
)
79
self.
add_keyword
(
"hwidth"
)
80
self.
add_keyword
(
"icsimax"
, 3)
81
self.
add_keyword
(
"ih1"
)
82
self.
add_keyword
(
"ih2"
)
83
self.
add_keyword
(
"itmx1"
, 5)
84
self.
add_keyword
(
"itmx2"
, 5)
85
self.
add_keyword
(
"iymax"
, 3)
86
self.
add_keyword
(
"lhans1"
, self.
default_PDFs
)
87
self.
add_keyword
(
"lhans2"
, self.
default_PDFs
)
88
self.
add_keyword
(
"lhfm/bmass"
)
89
self.
add_keyword
(
"lhfm/cmass"
)
90
self.
add_keyword
(
"lhfm/emass"
)
91
self.
add_keyword
(
"lhfm/mumass"
)
92
self.
add_keyword
(
"lhfm/smass"
)
93
self.
add_keyword
(
"lhfm/taumass"
)
94
self.
add_keyword
(
"lhfm/umass"
)
95
self.
add_keyword
(
"lhrwgt_descr"
)
96
self.
add_keyword
(
"lhrwgt_group_combine"
)
97
self.
add_keyword
(
"lhrwgt_group_name"
)
98
self.
add_keyword
(
"lhrwgt_id"
)
99
self.
add_keyword
(
"LOevents"
)
100
self.
add_keyword
(
"manyseeds"
)
101
self.
add_keyword
(
"maxseeds"
, 1000)
102
self.
add_keyword
(
"ncall1"
, 100000)
103
self.
add_keyword
(
"ncall2"
, 100000)
104
self.
add_keyword
(
"ncall2rm"
)
105
self.
add_keyword
(
"nubound"
, 100000)
106
self.
add_keyword
(
"parallelstage"
)
107
self.
add_keyword
(
"renscfact"
, self.
default_scales
[1])
108
self.
add_keyword
(
"runningscales"
, 0)
# 0: no running scales; 1: use running scales
109
self.
add_keyword
(
"rwl_add"
)
110
self.
add_keyword
(
"rwl_file"
)
111
self.
add_keyword
(
"rwl_format_rwgt"
)
112
self.
add_keyword
(
"rwl_group_events"
)
113
self.
add_keyword
(
"semileptonic"
)
114
self.
add_keyword
(
"storeinfo_rwgt"
, 1)
115
self.
add_keyword
(
"storemintupb"
)
116
self.
add_keyword
(
"tmass"
)
117
self.
add_keyword
(
"topdecaymode"
,
"t t~ z > all"
, name=
"decay_mode"
)
118
self.
add_keyword
(
"twidth"
)
119
self.
add_keyword
(
"use-old-grid"
, 1)
120
self.
add_keyword
(
"use-old-ubound"
, 1)
121
self.
add_keyword
(
"withdamp"
, 1)
122
self.
add_keyword
(
"wmass"
)
123
self.
add_keyword
(
"wwidth"
)
124
self.
add_keyword
(
"xgriditeration"
)
125
self.
add_keyword
(
"xupbound"
, 2)
126
self.
add_keyword
(
"zerowidth"
)
127
self.
add_keyword
(
"zmass"
)
128
self.
add_keyword
(
"zwidth"
)
129
130
def
get_nlox_params_file
(self):
131
"""
132
Retrieve nlox parameters file, copy it into the local directory, and edit some of the parameters
133
"""
134
import
os
135
import
shutil
136
137
# First attempt: look in testrun under executable directory
138
original_path = os.path.join(os.path.dirname(self.
executable
),
'test'
,
'nlox_parameters.par'
)
139
140
# Fallback: try one directory above executable
141
fallback_path = os.path.join(os.path.dirname(os.path.dirname(self.
executable
)),
'test'
,
'nlox_parameters.par'
)
142
143
# Determine which file exists
144
if
os.path.exists(original_path):
145
source_file = original_path
146
elif
os.path.exists(fallback_path):
147
source_file = fallback_path
148
else
:
149
raise
FileNotFoundError(
"No valid nlox_parameters.par found in expected locations."
)
150
151
# Copy the file
152
shutil.copyfile(source_file,
'./nlox_parameters.par-old'
)
153
154
# edit some of the parameters
155
lines = []
156
with
open(
'./nlox_parameters.par-old'
)
as
f:
157
lines = f.readlines()
158
update_dict = {
159
'# mb ='
:
'mb = {}'
.format(self.
parameters_by_keyword
(
'bmass'
)[0].value),
160
'# mt ='
:
'mt = {}'
.format(self.
parameters_by_keyword
(
'tmass'
)[0].value),
161
'# wt ='
:
'wt = {}'
.format(self.
parameters_by_keyword
(
'twidth'
)[0].value),
162
'# mW ='
:
'mW = {}'
.format(self.
parameters_by_keyword
(
'wmass'
)[0].value),
163
'# wW ='
:
'wW = {}'
.format(self.
parameters_by_keyword
(
'wwidth'
)[0].value),
164
'# mZ ='
:
'mZ = {}'
.format(self.
parameters_by_keyword
(
'zmass'
)[0].value),
165
'# wZ ='
:
'wZ = {}'
.format(self.
parameters_by_keyword
(
'zwidth'
)[0].value),
166
'# mH ='
:
'mH = {}'
.format(self.
parameters_by_keyword
(
'hmass'
)[0].value),
167
'# wH ='
:
'wH = {}'
.format(self.
parameters_by_keyword
(
'hwidth'
)[0].value),
168
'# GF ='
:
'GF = {}'
.format(self.
parameters_by_keyword
(
'gfermi'
)[0].value),
169
}
170
with
open(
'./nlox_parameters.par'
,
'w'
)
as
f:
171
for
line
in
lines:
172
for
pattern, replacement
in
update_dict.items():
173
if
pattern
in
line:
174
line = replacement+
'\n'
175
break
176
f.write(line)
177
logger.info(
'New file ./nlox_parameters.par created locally with updated parameters'
)
178
179
def
validate_decays
(self):
180
"""
181
Validate decay_mode keywords and translate them from ATLAS input to Powheg input
182
"""
183
self.
expose
()
# convenience call to simplify syntax
184
if
self.
decay_mode
not
in
self.
allowed_decay_modes
:
185
error_message =
"Decay mode '{given}' not recognised, valid choices are: '{choices}'!"
.format(given=self.
decay_mode
, choices=
"', '"
.join(self.
allowed_decay_modes
))
186
logger.warning(error_message)
187
raise
ValueError(error_message)
188
189
# Check if MadSpin decays are requested.
190
# Accordingly, MadSpin will run or not run.
191
if
"MadSpin"
in
self.
decay_mode
:
192
self.
externals
[
"MadSpin"
].
parameters_by_keyword
(
"powheg_top_decays_enabled"
)[0].value =
False
193
self.
externals
[
"MadSpin"
].
parameters_by_keyword
(
"MadSpin_model"
)[0].value =
"loop_sm-no_b_mass"
194
self.
externals
[
"MadSpin"
].
parameters_by_keyword
(
"MadSpin_nFlavours"
)[0].value = 5
195
196
self.
parameters_by_keyword
(
"topdecaymode"
)[0].value = _decay_mode_lookup[self.
decay_mode
]
197
if
self.
decay_mode
==
't t~ z > semileptonic emu+ emu-'
:
198
# Parameter semileptonic must be set to 1
199
self.
parameters_by_keyword
(
"semileptonic"
)[0].value = 1
python.processes.configurable.Configurable.add_keyword
add_keyword(self, keyword, value=None, name=None, frozen=None, hidden=None, description=None, **kwargs)
Register configurable parameter that is exposed to the user.
Definition
configurable.py:21
python.processes.configurable.Configurable.expose
expose(self)
Add all names to the interface of this object.
Definition
configurable.py:46
python.processes.configurable.Configurable.parameters_by_keyword
parameters_by_keyword(self, keyword)
Retrieve all parameters that use a given keyword.
Definition
configurable.py:57
python.processes.external.external_madspin.ExternalMadSpin
Class for running external MadSpin process.
Definition
external_madspin.py:11
python.processes.powheg.ttZ.ttZ
Definition
ttZ.py:26
python.processes.powheg.ttZ.ttZ.__init__
__init__(self, base_directory, **kwargs)
Constructor: all process options are set here.
Definition
ttZ.py:35
python.processes.powheg.ttZ.ttZ.allowed_decay_modes
allowed_decay_modes
Definition
ttZ.py:45
python.processes.powheg.ttZ.ttZ.get_nlox_params_file
get_nlox_params_file(self)
Definition
ttZ.py:130
python.processes.powheg.ttZ.ttZ.validate_decays
validate_decays(self)
Definition
ttZ.py:179
python.processes.powheg.ttZ.ttZ.decay_mode
str decay_mode
Definition
ttZ.py:191
python.processes.powheg_V2.PowhegV2
Base class for PowhegBox V2 processes.
Definition
powheg_V2.py:6
python.processes.powheg_base.PowhegBase.executable
executable
Powheg executable that will be used.
Definition
powheg_base.py:72
python.processes.powheg_base.PowhegBase.externals
dict externals
List of external processes to schedule.
Definition
powheg_base.py:124
python.processes.powheg_base.PowhegBase.validation_functions
list validation_functions
List of validation functions to run before preparing runcard.
Definition
powheg_base.py:127
python.processes.powheg_base.PowhegBase.add_algorithm
add_algorithm(self, alg_or_process)
Add an algorithm or external process to the sequence.
Definition
powheg_base.py:156
python.processes.powheg_base.PowhegBase.default_scales
default_scales(self)
Default scale variations for this process.
Definition
powheg_base.py:194
Generated on
for ATLAS Offline Software by
1.17.0