ATLAS Offline Software
Loading...
Searching...
No Matches
gg4l.py
Go to the documentation of this file.
1# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
2
3import os
4from AthenaCommon import Logging
5from ..powheg_RES import PowhegRES
6
7
8logger = Logging.logging.getLogger("PowhegControl")
9
11 """! Default Powheg configuration for
12 NLO QCD corrections to 4 lepton production in gluon fusion,
13 including the Higgs-mediated contribution, the diboson background and their interference.
14
15 Create a configurable object with all applicable Powheg options.
16
17 @author Andrej Saibel <Andrej.Saibel@cern.ch>
18 """
19
20 def __init__(self, base_directory, **kwargs):
21 """! Constructor: all process options are set here.
22
23 @param base_directory: path to PowhegBox code.
24 @param kwargs dictionary of arguments from Generate_tf.
25 """
26
27 # list of message patterns to be treated as warnings
28 warnings = [
29 "ggvvamp: increasing precision to"
30 ]
31 super(gg4l, self).__init__(base_directory, "gg4l", **kwargs)
32 self.warning_output = warnings
33
34 # defining gg4l environment variable to bypass file path issues in QCDLoop-*/ff/ffinit.f
35 os.environ['gg4lPATH'] = os.path.dirname(self.executable)
36 logger.info("gg4lPATH defined as = {0}".format(os.getenv('gg4lPATH')))
37
38
39 # Add parameter validation functions
40 self.validation_functions.append("validate_process_contrib")
41
42
43 self.allowed_process_modes = ["\'WW\'", "\'ZZ\'"]
44 self.allowed_contrib_modes = ["\'full\'", "\'only_h\'", "\'no_h\'", "\'interf_h\'"]
45
46 # Add all keywords for this process, overriding defaults if required
47 self.add_keyword("allrad", 1)
48 self.add_keyword("alpha")
49 self.add_keyword("bmass")
50 self.add_keyword("bornktmin")
51 self.add_keyword("bornonly")
52 self.add_keyword("bornsuppfact")
53 self.add_keyword("bornzerodamp")
54 self.add_keyword("bottommass")
55 self.add_keyword("bottomthr")
56 self.add_keyword("bottomthrpdf")
57 self.add_keyword("btildeborn")
58 self.add_keyword("btildecoll")
59 self.add_keyword("btildereal")
60 self.add_keyword("btildevirt")
61 self.add_keyword("btlscalect")
62 self.add_keyword("btlscalereal")
63 self.add_keyword("charmthr")
64 self.add_keyword("charmthrpdf")
65 self.add_keyword("check_bad_st1")
66 self.add_keyword("check_bad_st2")
67 self.add_keyword("chklimseed")
68 self.add_keyword("clobberlhe")
69 self.add_keyword("colltest")
70 self.add_keyword("complexGFermi")
71 self.add_keyword("compress_lhe")
72 self.add_keyword("compress_upb")
73 self.add_keyword("compute_rwgt")
74 self.add_keyword("contr", "\'full\'") # 'full', 'only_h', 'no_h' or 'interf_h'
75 self.add_keyword("dorwgt", 1)
76 self.add_keyword("doublefsr")
77 self.add_keyword("enhancereg")
78 self.add_keyword("evenmaxrat")
79 self.add_keyword("ewscheme")
80 self.add_keyword("facscfact", self.default_scales[0])
81 self.add_keyword("fastbtlbound")
82 self.add_keyword("fixedscale")
83 self.add_keyword("flg_debug")
84 self.add_keyword("foldcsi", 2)
85 self.add_keyword("foldphi", 5)
86 self.add_keyword("foldy", 5)
87 self.add_keyword("for_reweighting")
88 self.add_keyword("fullrwgt")
89 self.add_keyword("gamcut", 60)
90 self.add_keyword("hdamp", 172.5)
91 self.add_keyword("hfact")
92 self.add_keyword("hmass")
93 self.add_keyword("hwidth")
94 self.add_keyword("icsimax")
95 self.add_keyword("ih1")
96 self.add_keyword("ih2")
97 self.add_keyword("itmx1")
98 self.add_keyword("itmx1btl")
99 self.add_keyword("itmx1btlbrn")
100 self.add_keyword("itmx1rm")
101 self.add_keyword("itmx2", 6)
102 self.add_keyword("itmx2btl")
103 self.add_keyword("itmx2btlbrn")
104 self.add_keyword("itmx2rm")
105 self.add_keyword("iupperfsr")
106 self.add_keyword("iupperisr")
107 self.add_keyword("iymax")
108 self.add_keyword("lhans1", self.default_PDFs)
109 self.add_keyword("lhans2", self.default_PDFs)
110 self.add_keyword("lhrwgt_descr")
111 self.add_keyword("lhrwgt_group_combine")
112 self.add_keyword("lhrwgt_group_name")
113 self.add_keyword("lhrwgt_id")
114 self.add_keyword("LOevents")
115 self.add_keyword("m4l_sampling", 2) # 0: flat 1: exponential 2:Breit-Wigner
116 self.add_keyword("m4lmax", 100)
117 self.add_keyword("m4lmin", 1)
118 self.add_keyword("m4lwindow", 4)
119 self.add_keyword("manyseeds")
120 self.add_keyword("massiveloops", 0)
121 self.add_keyword("mass_rwg_frac", 0.) # gg4l treatment of heavy-flavour
122 self.add_keyword("max_io_bufsize")
123 self.add_keyword("maxseeds")
124 self.add_keyword("minlo")
125 self.add_keyword("mint_density_map")
126 self.add_keyword("mintupbratlim")
127 self.add_keyword("mllmax", 100) # default 0.1 GeV this is maximum invar mass for Z leptons
128 self.add_keyword("mllmin", 0.) # default 0.1 GeV this is minimum invar mass for Z leptons
129 self.add_keyword("MSbarscheme")
130 self.add_keyword("mt_expansion", 1)
131 self.add_keyword("ncall1", 10000)
132 self.add_keyword("ncall1btl")
133 self.add_keyword("ncall1btlbrn", 50000)
134 self.add_keyword("ncall1rm")
135 self.add_keyword("ncall2", 10000)
136 self.add_keyword("ncall2btl")
137 self.add_keyword("ncall2btlbrn",100000)
138 self.add_keyword("ncall2rm")
139 self.add_keyword("ncallfrominput")
140 self.add_keyword("noevents")
141 self.add_keyword("nores")
142 self.add_keyword("novirtual")
143 self.add_keyword("nubound", 50000)
144 self.add_keyword("ol_nf", 6)
145 self.add_keyword("ol_verbose", 1)
146 self.add_keyword("ol_preset", 3)
147 self.add_keyword("ol_notri", 0)
148 self.add_keyword("ol_stability_kill", 0.01)
149 self.add_keyword("olpreset")
150 self.add_keyword("olverbose")
151 self.add_keyword("openloops-stability")
152 self.add_keyword("openloopsreal")
153 self.add_keyword("openloopsvirtual")
154 self.add_keyword("par_2gsupp")
155 self.add_keyword("par_diexp")
156 self.add_keyword("par_dijexp")
157 self.add_keyword("parallelstage")
158 self.add_keyword("pdfreweight")
159 self.add_keyword("proc","\'WW\'" ) # 'ZZ' or 'WW'
160 self.add_keyword("ptllmin", 0.1) # this is hard-coded for virtual corrections with massive loops
161 self.add_keyword("ptsqmin")
162 self.add_keyword("ptsupp")
163 self.add_keyword("ptVVcut_CT")
164 self.add_keyword("ptVVcut")
165 self.add_keyword("radregion")
166 self.add_keyword("rand1")
167 self.add_keyword("rand2")
168 self.add_keyword("regridfix")
169 self.add_keyword("renscfact", self.default_scales[1])
170 self.add_keyword("rwl_add")
171 self.add_keyword("rwl_file")
172 self.add_keyword("rwl_format_rwgt")
173 self.add_keyword("rwl_group_events")
174 self.add_keyword("select_real", 0) #do gg qg qq channels
175 self.add_keyword("smartsig")
176 self.add_keyword("softmismch")
177 self.add_keyword("softonly")
178 self.add_keyword("softtest")
179 self.add_keyword("stage2init")
180 self.add_keyword("storeinfo_rwgt")
181 self.add_keyword("storemintupb")
182 self.add_keyword("testplots")
183 self.add_keyword("testsuda")
184 self.add_keyword("tmass_phsp")
185 self.add_keyword("tmass")
186 self.add_keyword("twidth",-1)
187 self.add_keyword("twidth_phsp",-1)
188 self.add_keyword("ubexcess_correct")
189 self.add_keyword("ubsigmadetails", -1) # disable cross-section output to avoid Fortran crash
190 self.add_keyword("use-old-grid")
191 self.add_keyword("use-old-ubound")
192 self.add_keyword("useoldphsp", 0) # use the old phase space parametrization from ggZZ
193 self.add_keyword("user_reshists_sep")
194 self.add_keyword("vdecaymodeV1") # decay mode of first vector boson
195 self.add_keyword("vdecaymodeV2") # decay mode of second vector boson
196 self.add_keyword("verytinypars")
197 self.add_keyword("virtonly")
198 self.add_keyword("which_as",2)
199 self.add_keyword("whichpwhgevent")
200 self.add_keyword("withbtilde")
201 self.add_keyword("withdamp", 1)
202 self.add_keyword("withnegweights")
203 self.add_keyword("withremnants")
204 self.add_keyword("withsubtr")
205 self.add_keyword("wmass")
206 self.add_keyword("wwidth")
207 self.add_keyword("xgriditeration")
208 self.add_keyword("xupbound", 2)
209 self.add_keyword("zerowidth")
210 self.add_keyword("zmass")
211 self.add_keyword("zwidth")
212
213
215 """! Validate Process and Contribution modes"""
216 self.expose() # convenience call to simplify syntax
217
218 #adding char qualication to input
219 if "\'" not in self.proc:
220 self.proc = "\'"+self.proc+"\'"
221 if "\'" not in self.contr:
222 self.contr = "\'"+self.contr+"\'"
223
224 #Modify unsupported decay configuration in ZZ production
225 if (self.proc == "'ZZ'" and ((self.vdecaymodeV1 == self.vdecaymodeV2) or self.vdecaymodeV1 == 15 or self.vdecaymodeV2 == 15)):
226 logger.warning("Powheg/gg4l does support directly 4e, 4mu or tau final states.")
227 if(self.vdecaymodeV1 == 11 and self.vdecaymodeV2 == 11):
228 logger.warning("Ask to generate 2e2mu decays and hack the LHE files to have 4e final states - make sure to validate!")
229 self.add_algorithm("mu2e")
230 elif(self.vdecaymodeV1 == 13 and self.vdecaymodeV2 == 13):
231 logger.warning("Ask to generate 2e2mu decays and hack the LHE files to have 4mu final states - make sure to validate!")
232 self.add_algorithm("e2mu")
233 elif(self.vdecaymodeV1 == 15 and self.vdecaymodeV2 == 15):
234 logger.warning("Ask to generate 2e2mu decays and hack the LHE files to have 4tau final states - make sure to validate!")
235 self.add_algorithm("e2tau")
236 self.add_algorithm("mu2tau")
237 elif(self.vdecaymodeV1 == 11 and self.vdecaymodeV2 == 15) or (self.vdecaymodeV1 == 15 and self.vdecaymodeV2 == 11):
238 logger.warning("Ask to generate 2e2mu decays and hack the LHE files to have 2e2tau final states - make sure to validate!")
239 self.add_algorithm("mu2tau")
240 elif(self.vdecaymodeV1 == 13 and self.vdecaymodeV2 == 15) or (self.vdecaymodeV1 == 15 and self.vdecaymodeV2 == 13):
241 logger.warning("Ask to generate 2e2mu decays and hack the LHE files to have 2mu2tau final states - make sure to validate!")
242 self.add_algorithm("e2tau")
243 elif(self.vdecaymodeV1 == 'll' and self.vdecaymodeV2 == 'll'):
244 logger.warning("Ask to generate 2e2mu decays and hack the LHE files to have inclusive 4l decays - make sure to validate!")
245 self.add_algorithm("gg4l_emu2all")
246
247 self.vdecaymodeV1 = 11
248 self.vdecaymodeV2 = 13
249 self.parameters_by_keyword("vdecaymodeV1")[0].value = self.vdecaymodeV1
250 self.parameters_by_keyword("vdecaymodeV2")[0].value = self.vdecaymodeV2
251
252 #check if the setting is allowed
253 if self.proc not in self.allowed_process_modes:
254 logger.warning("Process mode {} not recognised!".format(self.proc))
255 raise ValueError("Process mode {} not recognised!".format(self.proc))
256
257 if self.contr not in self.allowed_contrib_modes:
258 logger.warning("Contribution mode {} not recognised!".format(self.contr))
259 raise ValueError("Contribution mode {} not recognised!".format(self.contr))
260
261 self.parameters_by_keyword("proc")[0].value = self.proc
262 self.parameters_by_keyword("contr")[0].value = self.contr
263
if(febId1==febId2)
add_keyword(self, keyword, value=None, name=None, frozen=None, hidden=None, description=None, **kwargs)
Register configurable parameter that is exposed to the user.
expose(self)
Add all names to the interface of this object.
parameters_by_keyword(self, keyword)
Retrieve all parameters that use a given keyword.
Default Powheg configuration for NLO QCD corrections to 4 lepton production in gluon fusion,...
Definition gg4l.py:10
validate_process_contrib(self)
Validate Process and Contribution modes.
Definition gg4l.py:214
__init__(self, base_directory, **kwargs)
Constructor: all process options are set here.
Definition gg4l.py:20
Base class for PowhegBox RES processes.
Definition powheg_RES.py:7
executable
Powheg executable that will be used.
list validation_functions
List of validation functions to run before preparing runcard.
add_algorithm(self, alg_or_process)
Add an algorithm or external process to the sequence.
default_scales(self)
Default scale variations for this process.