35 def __init__(self, process='generate p p > t t~\noutput -f', plugin=None, keepJpegs=False, usePMGSettings=False):
36 """ Generate a new process in madgraph.
37 Pass a process string.
38 Optionally request JPEGs to be kept and request for PMG settings to be used in the param card
39 Return the name of the process directory.
41 self.mglog = Logging.logging.getLogger(
'MadGraphUtils')
42 self.process = process
44 self.keepJpegs = keepJpegs
45 self.usePMGSettings = usePMGSettings
46 self.run_card_params = []
48 self.is_gen_from_gridpack = os.access(MADGRAPH_GRIDPACK_LOCATION,os.R_OK)
50 if self.is_gen_from_gridpack:
51 self.process_dir = MADGRAPH_GRIDPACK_LOCATION
54 card_loc=
'proc_card_mg5.dat'
55 mglog.info(
'Writing process card to '+card_loc)
56 a_card =
open( card_loc ,
'w' )
57 for l
in process.split(
'\n'):
63 if '-nojpeg' not in l
and not keepJpegs:
66 outline = outline.split(
'#')[0]+
' -nojpeg #'+outline.split(
'#')[1]
68 outline = outline +
' -nojpeg'
70 if MADGRAPH_DEVICES
is not None:
71 if MADGRAPH_DEVICES.lower()
in [
'madevent_simd',
'madevent_gpu']:
72 outline =
'output '+MADGRAPH_DEVICES.lower()+
' '+outline.split(
'output')[1]
73 elif MADGRAPH_DEVICES.lower() ==
'max':
74 self.mglog.warning(
'Not fully implemented yet; setting avx')
75 outline =
'output madevent_simd '+outline.split(
'output')[1]
76 a_card.write(outline+
'\n')
79 madpath=os.environ[
'MADPATH']
85 for l
in process.split(
'\n'):
87 if 'output' not in l.split(
'#')[0].
split():
90 tmplist = l.split(
'#')[0].
split(
' -')[0]
92 if len(tmplist.split())==2:
93 process_dir = tmplist.split()[1]
95 elif len(tmplist.split())==3:
96 process_dir = tmplist.split()[2]
99 mglog.info(
'Saw that you asked for a special output directory: '+
str(process_dir))
102 mglog.info(
'Started process generation at '+
str(time.asctime()))
104 plugin_cmd =
'--mode='+plugin
if plugin
is not None else ''
107 self.MADGRAPH_COMMAND_STACK = []
108 self.MADGRAPH_COMMAND_STACK += [
'# All jobs should start in a clean directory']
109 self.MADGRAPH_COMMAND_STACK += [
'mkdir standalone_test; cd standalone_test']
110 self.MADGRAPH_COMMAND_STACK += [
' '.
join([python,madpath+
'/bin/mg5_aMC '+plugin_cmd+
' << EOF\n'+process+
'\nEOF\n'])]
111 generate = subprocess.Popen([python,madpath+
'/bin/mg5_aMC',plugin_cmd,card_loc],stdin=subprocess.PIPE,stderr=subprocess.PIPE
if MADGRAPH_CATCH_ERRORS
else None)
112 (out,err) = generate.communicate()
115 mglog.info(
'Finished process generation at '+
str(time.asctime()))
118 if process_dir ==
'':
119 for adir
in sorted(glob.glob( os.getcwd()+
'/*PROC*' ),reverse=
True):
120 if os.access(
'%s/SubProcesses/subproc.mg'%adir,os.R_OK):
124 mglog.warning(
'Additional possible process directory, '+adir+
' found. Had '+process_dir)
125 mglog.warning(
'Likely this is because you did not run from a clean directory, and this may cause errors later.')
127 if not os.access(
'%s/SubProcesses/subproc.mg'%process_dir,os.R_OK):
128 raise RuntimeError(
'No diagrams for this process in user-define dir='+
str(process_dir))
130 raise RuntimeError(
'No diagrams for this process from list: '+
str(
sorted(glob.glob(os.getcwd()+
'/*PROC*'),reverse=
True)))
133 needed_options = [
'ninja',
'collier',
'fastjet',
'lhapdf',
'syscalc_path']
134 in_config =
open(os.environ[
'MADPATH']+
'/input/mg5_configuration.txt',
'r')
136 for l
in in_config.readlines():
137 for o
in needed_options:
138 if o+
' =' in l.split(
'#')[0]
and 'MCGenerators' in l.split(
'#')[0]:
139 old_path = l.split(
'#')[0].
split(
'=')[1].strip().
split(
'MCGenerators')[1]
140 old_path = old_path[ old_path.find(
'/') : ]
141 if o ==
'lhapdf' and 'LHAPATH' in os.environ:
143 version = os.environ[
'LHAPATH'].
split(
'lhapdf/')[1].
split(
'/')[0]
144 old_version = old_path.split(
'lhapdf/')[1].
split(
'/')[0]
145 old_path = old_path.replace(old_version,version)
148 old_path.replace(
'gosam_contrib',
'gosam-contrib')
149 option_paths[o] = os.environ[
'MADPATH'].
split(
'madgraph5amc')[0]+old_path
151 if o+
' =' in l
and o+
' =' not in l.split(
'#')[0]:
152 mglog.info(
'Option '+o+
' appears commented out in the config file')
155 for o
in needed_options:
156 if o
not in option_paths:
157 mglog.info(
'Path for option '+o+
' not found in original config')
159 mglog.info(
'Modifying config paths to avoid use of afs:')
160 mglog.info(option_paths)
166 self.change_config_card(process_dir=process_dir,settings=option_paths,set_commented=
False)
175 mglog.info(
'Setting default sde_strategy to old default (1)')
176 self.runCardDict[
'sde_strategy']=1
179 self.change_config_card(process_dir=process_dir,settings={
'notification_center':
'False'})
182 if MADGRAPH_DEVICES
is not None:
183 if MADGRAPH_DEVICES.lower()==
'madevent_simd':
184 self.runCardDict[
'cudacpp_backend'] =
'cppauto'
185 elif MADGRAPH_DEVICES.lower()==
'madevent_gpu':
186 self.runCardDict[
'cudacpp_backend'] =
'cuda'
189 os.environ[
'ALLOW_UNSUPPORTED_COMPILER_IN_CUDA'] =
'Y'
190 elif MADGRAPH_DEVICES.lower() ==
'max':
191 self.mglog.warning(
'Not fully implemented yet; setting avx')
192 self.runCardDict[
'cudacpp_backend'] =
'cppauto'
195 self.MADGRAPH_COMMAND_STACK += [
'export MGaMC_PROCESS_DIR='+os.path.basename(process_dir)]
196 self.process_dir = process_dir