ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Generators
Hto4lControl
python
Hto4lConfig.py
Go to the documentation of this file.
1
# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
2
3
import
os, subprocess, time
4
from
.DecoratorFactory
import
decorate
5
from
AthenaCommon
import
Logging
6
from
PowhegControl.utility
import
HeartbeatTimer, RepeatingTimer
7
import
collections
8
9
12
class
Hto4lConfig
(object) :
13
14
__run_directory = os.environ[
'PWD'
]
15
16
# for local copy of Hto4l use:
17
# __hto4l_directory = os.environ['TestArea']
18
# For the lcg version of Hto4l use:
19
# __hto4l_directory = os.environ['HTO4LPATH']
20
21
22
23
__logger = Logging.logging.getLogger(
'Hto4lControl'
)
24
25
31
32
# define Hto4l executable
33
_hto4l_executable =
'Hto4l'
34
35
def
__init__
( self, runArgs=None, opts=None ) :
36
37
38
self.
__output_events_file_name
=
'Hto4lOTF._1.events'
39
40
41
self.
__fixed_parameters
= []
42
# self.__configurable_parameters = {}
43
self.
__configurable_parameters
= collections.OrderedDict()
44
self.
__run_card_decorators
= []
45
46
47
self.
add_parameter_set
(
'fromDefault'
)
48
49
50
if
runArgs
is
None
:
51
self.
logger
.warning(
'No run arguments found! Using defaults.'
)
52
else
:
53
# Read values from runArgs
54
if
hasattr(runArgs,
'maxEvents'
)
and
runArgs.maxEvents > 0 :
55
self.
nEvents
= int( runArgs.maxEvents + 0.5 )
# should be overwritten in the jobOpt - depends on 4e/4mu/2e2mu mode
56
if
hasattr(runArgs,
'randomSeed'
) :
57
self.
random_seed
= runArgs.randomSeed
58
pass
59
pass
60
61
62
def
generate
( self, filter_name='', filter_args='' ) :
63
self.
generateRunCard
()
64
self.
generateEvents
()
65
66
67
def
generateRunCard
(self) :
68
69
70
for
run_card_decorator
in
self.
run_card_decorators
:
71
if
hasattr( run_card_decorator,
'finalise'
) : run_card_decorator.finalise()
72
73
74
self.
logger
.info(
'** User configurable parameters for this process **'
)
75
self.
logger
.info(
': Configurable parameter : Current value : Description'
)
76
# for value_tuple in sorted( self.configurable_parameters.values(), key=lambda x: x[0].lower() ) :
77
# self.logger.info( ': {0:<22} : {1:>17} : {2}'.format( value_tuple[0], getattr(self, value_tuple[0]), value_tuple[1] ) )
78
for
value_tuple
in
self.
configurable_parameters
.values() :
79
self.
logger
.info(
': {0:<22} : {1:>17} : {2}'
.format( value_tuple[0], getattr(self, value_tuple[0]), value_tuple[1] ) )
80
81
82
[ self.
fix_parameter
(parameter=value_tuple[0], desc=value_tuple[1])
for
value_tuple
in
list(self.
configurable_parameters
.values()) ]
83
84
85
self.
logger
.info(
'Writing Hto4l runcard to {0}'
.format( self.
run_card_path
) )
86
with
open( self.
run_card_path
,
'w'
)
as
f :
87
# for parameter_tuple in sorted( self.fixed_parameters, key=lambda x: x[0].lower() ) :
88
for
parameter_tuple
in
self.
fixed_parameters
:
89
name, value, desc = parameter_tuple
90
# Set starting value to first in list when multiple values are provided
91
if
isinstance(value,list) :
92
value = value[0]
93
self.
__enable_reweighting
=
True
94
# output_line = '{0:<30}! {1}'.format( '{0}={1}'.format( name, value ), desc )
95
output_line =
'{0:<30}! {1}'
.format(
'{0}'
.format( value ), desc )
96
f.write(
'{0}\n'
.format(output_line) )
97
self.
logger
.info(
'Wrote {0}'
.format( output_line ) )
98
99
100
self.
logger
.info(
'Using executable: {0}'
.format( self.
_hto4l_executable
) )
101
102
103
104
def
generateEvents
(self) :
105
106
time_start = time.time()
107
self.
logger
.info(
'Starting Hto4l LHEF event generation at {0}'
.format( time.ctime( time_start ) ) )
108
self.
logger
.info(
'Number of events: {0}.'
.format( self.
nEvents
) )
109
110
# Setup heartbeat thread
111
heartbeat = HeartbeatTimer(600.,
"{}/eventLoopHeartBeat.txt"
.format(self.
__run_directory
))
112
heartbeat.setName(
"heartbeat thread"
)
113
heartbeat.daemon =
True
# Allow program to exit if this is the only live thread
114
heartbeat.start()
115
116
117
118
self.
running_process
= []
119
120
self.
runHto4l
()
121
122
123
heartbeat.cancel()
124
125
126
generation_end = time.time()
127
elapsed_time = generation_end - time_start
128
self.
logger
.info(
'Running nominal Hto4l took {0} for {1} events => {2:6.3f} Hz'
.format( HeartbeatTimer.readable_duration(elapsed_time), self.
nEvents
, self.
nEvents
/ elapsed_time ) )
129
130
# self.logger.info( 'Removing Hto4l born LHE file' )
131
# try :
132
# os.remove( 'plot_unweighted_born.lhe' )
133
# except OSError :
134
# pass
135
136
# ## Move output to correctly named file
137
# try :
138
# os.rename( 'plot_unweighted.lhe', self.output_events_file_name )
139
# self.logger.info( 'Moved plot_unweighted.lhe to {0}'.format(self.output_events_file_name) )
140
# except OSError :
141
# self.logger.warning( 'No output LHEF file found! Probably because the Hto4l process was killed before finishing.' )
142
143
144
self.
logger
.info(
'Finished at {0}'
.format( time.asctime() ) )
145
return
146
147
148
149
def
add_parameter
( self, configurable_name, value, desc='', parameter=None ) :
150
setattr( self, configurable_name, value )
# add new attribute
151
hto4l_parameter = parameter
if
parameter
is
not
None
else
configurable_name
152
self.
configurable_parameters
[hto4l_parameter] = ( configurable_name, desc )
153
154
155
156
def
add_parameter_set
( self, parameter_set, **kwargs ) :
157
return
decorate( self, parameter_set, **kwargs )
158
159
160
161
def
emit_heartbeat
(self, duration) :
162
message =
'Heartbeat: Hto4l generation has been running for {0} in total'
.format( RepeatingTimer.human_readable_time_interval(duration) )
163
self.
logger
.info( message )
164
with
open(
'{0}/eventLoopHeartBeat.txt'
.format( self.
__run_directory
),
'w'
)
as
f : f.write( message )
165
166
167
168
def
fix_parameter
( self, parameter, value=None, desc='' ) :
169
# Get previously set value if not overwriting
170
if
value
is
None
: value = getattr( self, parameter )
171
# Remove it from the configurable list if it was there
172
for
hto4l_parameter, configurable_name_tuple
in
self.
configurable_parameters
.items() :
173
# Retrieve Hto4l parameter name and description if there is a match
174
if
parameter == configurable_name_tuple[0] :
175
parameter, desc = hto4l_parameter, configurable_name_tuple[1]
176
self.
configurable_parameters
.pop(hto4l_parameter)
177
break
178
self.
fixed_parameters
.append( (parameter, value, desc) )
179
180
def
runHto4l
(configurator) :
181
configurator.running_process.append(subprocess.Popen( [configurator._hto4l_executable,
''
], stdout=subprocess.PIPE, stdin=open(configurator.run_card_path), stderr=subprocess.STDOUT ) )
182
183
while
configurator.running_process :
184
# Write output buffer if any
185
for
process
in
configurator.running_process :
186
while
True
:
187
output = process.stdout.readline().rstrip()
188
if
len(output) == 0 :
break
189
configurator.logger.info(
'{0}'
.format(output) )
190
if
process.poll()
is
not
None
:
# process has ended
191
# Flush buffer and print final output (if any) to screen
192
process.stdout.flush()
193
while
True
:
194
output = process.stdout.readline().rstrip()
195
if
len(output) == 0 :
break
196
configurator.logger.info(
'{0}'
.format(output) )
197
# Close output stream and remove process from list
198
process.stdout.close()
199
configurator.running_process.remove( process )
200
configurator.logger.info(
'Hto4l finished - all done.'
)
201
202
203
@property
204
def
run_directory
(self) :
205
return
self.
__run_directory
206
207
208
209
@property
210
def
configurable_parameters
(self) :
211
return
self.
__configurable_parameters
212
213
214
215
@property
216
def
fixed_parameters
(self) :
217
return
self.
__fixed_parameters
218
219
220
@property
221
def
logger(self) :
222
return
self.
__logger
223
224
# ## Get Hto4l directory
225
# @property
226
# def hto4l_directory(self) :
227
# return self.__hto4l_directory
228
229
230
231
@property
232
def
run_card_decorators
(self) :
233
return
self.
__run_card_decorators
234
235
236
237
@property
238
def
run_card_path
(self) :
239
return
'{0}/hto4l.input'
.format( self.
run_directory
)
240
python.Hto4lConfig.Hto4lConfig
Base class for configurable objects in the jobOptions.
Definition
Hto4lConfig.py:12
python.Hto4lConfig.Hto4lConfig.__output_events_file_name
str __output_events_file_name
This needs to be set so that Generate_trf finds an appropriate file format for showering.
Definition
Hto4lConfig.py:38
python.Hto4lConfig.Hto4lConfig.__init__
__init__(self, runArgs=None, opts=None)
Definition
Hto4lConfig.py:35
python.Hto4lConfig.Hto4lConfig.__run_directory
__run_directory
Set up run directory and path to Hto4l.
Definition
Hto4lConfig.py:14
python.Hto4lConfig.Hto4lConfig.random_seed
random_seed
Definition
Hto4lConfig.py:57
python.Hto4lConfig.Hto4lConfig.__enable_reweighting
bool __enable_reweighting
Definition
Hto4lConfig.py:93
python.Hto4lConfig.Hto4lConfig.run_card_path
run_card_path
Write out final runcard.
Definition
Hto4lConfig.py:85
python.Hto4lConfig.Hto4lConfig.running_process
list running_process
Initialise generation process tracker.
Definition
Hto4lConfig.py:118
python.Hto4lConfig.Hto4lConfig.__logger
__logger
Setup athena-compatible logger.
Definition
Hto4lConfig.py:23
python.Hto4lConfig.Hto4lConfig.runHto4l
runHto4l(configurator)
Definition
Hto4lConfig.py:180
python.Hto4lConfig.Hto4lConfig.__run_card_decorators
list __run_card_decorators
Definition
Hto4lConfig.py:44
python.Hto4lConfig.Hto4lConfig.logger
logger(self)
Get handle to logger.
Definition
Hto4lConfig.py:221
python.Hto4lConfig.Hto4lConfig.fix_parameter
fix_parameter(self, parameter, value=None, desc='')
Register non-configurable parameter.
Definition
Hto4lConfig.py:168
python.Hto4lConfig.Hto4lConfig.emit_heartbeat
emit_heartbeat(self, duration)
Output a heartbeat message.
Definition
Hto4lConfig.py:161
python.Hto4lConfig.Hto4lConfig.run_card_decorators
run_card_decorators
Finalise registered decorators.
Definition
Hto4lConfig.py:70
python.Hto4lConfig.Hto4lConfig.configurable_parameters
configurable_parameters(self)
Get dictionary of configurable parameters.
Definition
Hto4lConfig.py:210
python.Hto4lConfig.Hto4lConfig.__configurable_parameters
__configurable_parameters
Definition
Hto4lConfig.py:43
python.Hto4lConfig.Hto4lConfig.generateRunCard
generateRunCard(self)
Initialise runcard with generic options.
Definition
Hto4lConfig.py:67
python.Hto4lConfig.Hto4lConfig.add_parameter_set
add_parameter_set(self, parameter_set, **kwargs)
Alias to DecoratorFactory.decorate.
Definition
Hto4lConfig.py:156
python.Hto4lConfig.Hto4lConfig.fixed_parameters
fixed_parameters
Write out final runcard.
Definition
Hto4lConfig.py:88
python.Hto4lConfig.Hto4lConfig.generateEvents
generateEvents(self)
Run normal event generation.
Definition
Hto4lConfig.py:104
python.Hto4lConfig.Hto4lConfig.__fixed_parameters
list __fixed_parameters
Set up lists of parameters and decorators.
Definition
Hto4lConfig.py:41
python.Hto4lConfig.Hto4lConfig.run_directory
run_directory
Definition
Hto4lConfig.py:239
python.Hto4lConfig.Hto4lConfig.nEvents
nEvents
Add universal functionality.
Definition
Hto4lConfig.py:55
python.Hto4lConfig.Hto4lConfig._hto4l_executable
str _hto4l_executable
This must be defined by each derived class - don't change it in the jobOptions!
Definition
Hto4lConfig.py:33
python.Hto4lConfig.Hto4lConfig.add_parameter
add_parameter(self, configurable_name, value, desc='', parameter=None)
Register configurable parameter.
Definition
Hto4lConfig.py:149
generate
Definition
generate.cxx:28
Generated on
for ATLAS Offline Software by
1.17.0