ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Generators
MadGraphControl
python
MadGraphTopUpAlg.py
Go to the documentation of this file.
1
# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
2
3
from
AthenaCommon.AppMgr
import
ServiceMgr
as
svcMgr
4
from
GeneratorModules.EvgenAlg
import
EvgenAlg
5
from
AthenaPython.PyAthena
import
StatusCode
6
import
glob,subprocess,os,time,shutil
7
8
__author__ =
'Zach Marshall <ZLMarshall@lbl.gov>'
9
10
class
MadGraphTopUpAlg
(EvgenAlg):
11
"""
12
A python-only algorithm for running more events in MadGraph
13
"""
14
15
def
__init__
(self, name="MG_TopUp", topUpSvcName="EvgenOTFTopUpSvc", threshold=50):
16
super(MadGraphTopUpAlg,self).
__init__
(name=name)
17
self.
topUpSvcName
= topUpSvcName
18
self.
topUpSvc
=
None
19
self.
threshold
= threshold
20
21
self.
njobs
= 1
22
if
'ATHENA_CORE_NUMBER'
in
os.environ:
23
self.
njobs
= os.environ[
'ATHENA_CORE_NUMBER'
]
24
self.
mode
= 0
if
self.
njobs
==1
else
2
25
self.
fileList
= []
26
27
def
initialize
(self):
28
self.
topUpSvc
= getattr(svcMgr, self.
topUpSvcName
,
None
)
29
if
self.
topUpSvc
is
not
None
:
30
self.msg.info(
'Got the top up service'
)
31
else
:
32
self.msg.warning(
'Could not get the top up service! Will be a null-op.'
)
33
if
self.
njobs
>1:
34
self.msg.info(
'Lucky you - you are running on a full node queue. Will re-configure for '
+str(self.
njobs
)+
' jobs.'
)
35
return
StatusCode.Success
36
37
def
execute
(self):
38
# If we did not manage to get the top up service, just get out of here
39
if
self.
topUpSvc
is
None
:
40
return
StatusCode.Success
41
42
# See if it's time to make more events
43
if
float(self.
topUpSvc
.getNPerFile()-self.
topUpSvc
.getNUsedSoFar())*self.
topUpSvc
.getEfficiency()>self.
threshold
:
44
# Plenty of events left - get out of here
45
return
StatusCode.Success
46
47
# Not enough events! Top it up!
48
a_dir =
None
49
# Call another generate - first find out where to go
50
if
os.access(
'madevent'
,os.R_OK):
51
self.msg.info(
'Found a grid pack at madevent/ - using it for generation'
)
52
a_dir =
'madevent'
53
elif
len( glob.glob(
'*PROC*'
) )==0:
54
self.msg.
error
(
'Need to re-run, but cannot find directory for running!'
)
55
return
StatusCode.Failure
56
else
:
57
a_dir = sorted( glob.glob(
'*PROC*'
) )[-1]
58
self.msg.info(
'Running from process directory '
+a_dir )
59
60
currdir=os.getcwd()
61
os.chdir(a_dir)
62
63
# Modify the random number seed - increment by 2M
64
oldcard_f = open(
'Cards/run_card.dat'
,
'r'
)
65
oldlines = oldcard_f.readlines()
66
oldcard_f.close()
67
newcard = open(
'Cards/run_card.dat'
,
'w'
)
68
for
line
in
oldlines:
69
if
' nevents '
in
line:
70
newcard.write(
' %i = nevents ! Number of unweighted events requested \n'
%(self.
topUpSvc
.getNPerFile()))
71
elif
' iseed '
in
line:
72
old_seed = int( line.split()[0] )
73
newcard.write(
' %i = iseed ! rnd seed (0=assigned automatically=default)) \n'
%(old_seed+2000000))
74
else
:
75
newcard.write(line)
76
newcard.close()
77
78
# Do the actual generation - should we use the generate* functions in MGC_Utils directly?
79
self.msg.info(
'Started generating at '
+str(time.asctime()) )
80
if
self.
njobs
>1:
81
self.msg.info(
'Running parallel generation. Should be nice and fast.'
)
82
generate = subprocess.Popen([
'bin/generate_events'
,str(self.
mode
),str(self.
njobs
),
'OTFTopUp'
],stdin=subprocess.PIPE)
83
else
:
84
self.msg.info(
'Running serial generation. This will take a bit more time than parallel generation.'
)
85
generate = subprocess.Popen([
'bin/generate_events'
,
'0'
,
'OTFTopUp'
],stdin=subprocess.PIPE)
86
generate.wait()
87
self.msg.info(
'Finished generating at'
+str(time.asctime()) )
88
89
# Move the events to something local...
90
a_new_file_name =
'otf_lhe.events'
91
if
len( glob.glob( currdir+
'/*events.[*0-9]'
) )>0:
92
a_new_file_name = sorted( glob.glob( currdir+
'/*events.[*0-9]'
) )[-1]
93
a_new_file_name = a_new_file_name[:a_new_file_name.rfind(
'.'
)]+str( int(a_new_file_name.split(
'.'
)[-1])+1 )
94
elif
len( glob.glob( currdir+
'/*events'
) )>0:
95
a_new_file_name = sorted( glob.glob( currdir+
'/*events'
) )[-1]+
'.1'
96
97
# Make sure we have trimmed off any directory names
98
if
'/'
in
a_new_file_name:
99
a_new_file_name = a_new_file_name.split(
'/'
)[-1]
100
101
# Unzip the files and move them in place
102
unzip = subprocess.Popen([
'gunzip'
,
'Events/OTFTopUp/unweighted_events.lhe.gz'
])
103
unzip.wait()
104
shutil.move(
'Events/OTFTopUp/unweighted_events.lhe'
,currdir+
'/'
+a_new_file_name)
105
106
# Go back
107
os.chdir(currdir)
108
109
# Remove the oldest file to save disk space
110
self.
fileList
+= [ a_new_file_name ]
111
if
len(self.
fileList
)>2:
112
# One old file, one new file, and delete the third
113
self.msg.info(
'Removing old file '
+self.
fileList
[-3])
114
if
os.access( currdir+
'/'
+self.
fileList
[-3] , os.R_OK ):
115
remove_old = subprocess.Popen([
'rm'
,(currdir+
'/'
+self.
fileList
[-3])])
116
remove_old.wait()
117
118
# Pass the information back to the top up service
119
self.
topUpSvc
.newFile( a_new_file_name )
120
121
return
StatusCode.Success
python.MadGraphTopUpAlg.MadGraphTopUpAlg
Definition
MadGraphTopUpAlg.py:10
python.MadGraphTopUpAlg.MadGraphTopUpAlg.topUpSvc
topUpSvc
Definition
MadGraphTopUpAlg.py:18
python.MadGraphTopUpAlg.MadGraphTopUpAlg.__init__
__init__(self, name="MG_TopUp", topUpSvcName="EvgenOTFTopUpSvc", threshold=50)
Definition
MadGraphTopUpAlg.py:15
python.MadGraphTopUpAlg.MadGraphTopUpAlg.fileList
list fileList
Definition
MadGraphTopUpAlg.py:25
python.MadGraphTopUpAlg.MadGraphTopUpAlg.mode
int mode
Definition
MadGraphTopUpAlg.py:24
python.MadGraphTopUpAlg.MadGraphTopUpAlg.topUpSvcName
topUpSvcName
Definition
MadGraphTopUpAlg.py:17
python.MadGraphTopUpAlg.MadGraphTopUpAlg.njobs
int njobs
Definition
MadGraphTopUpAlg.py:21
python.MadGraphTopUpAlg.MadGraphTopUpAlg.threshold
threshold
Definition
MadGraphTopUpAlg.py:19
python.MadGraphTopUpAlg.MadGraphTopUpAlg.execute
execute(self)
Definition
MadGraphTopUpAlg.py:37
error
Definition
IImpactPoint3dEstimator.h:72
initialize
void initialize()
Definition
run_EoverP.cxx:894
Generated on
for ATLAS Offline Software by
1.17.0