Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F7878562
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
14 KB
Subscribers
None
View Options
diff --git a/MatrixElement/Matchbox/External/MadGraph/mg2herwig.in b/MatrixElement/Matchbox/External/MadGraph/mg2herwig.in
--- a/MatrixElement/Matchbox/External/MadGraph/mg2herwig.in
+++ b/MatrixElement/Matchbox/External/MadGraph/mg2herwig.in
@@ -1,403 +1,401 @@
#! @PYTHON@
import os,sys,glob,errno,shutil,time,fnmatch,tempfile
from optparse import OptionParser
def mkdir_p(path):
"""Recursive mkdir"""
if not os.path.isdir(path):
os.makedirs(path)
def finddirs(pattern, path):
"""Find all paths which contain a filename matching 'pattern'"""
result = [
root
for root, _, files in os.walk(path)
if fnmatch.filter(files, pattern)
]
return result
# fill the proc.dat file from BornAmplitudes.dat and VirtAmplitudes.dat.
def fillprocs(model,oras,orew,MGVersion):
"""Fill proc.dat from BornAmplitudes.dat and VirtAmplitudes.dat"""
oras=int(oras)
orew=int(orew)
bornlist=[]
virtlist=[]
result = []
result.append('set fortran_compiler @FC@ --no_save')
result.append("import model "+model)
borns="BornAmplitudes.dat"
virts="VirtAmplitudes.dat"
procnr=0
virtlines=[]
- if MGVersion>2 :
- virtlines.append("set acknowledged_v3.1_syntax True --global")
bornlines=[]
# first pass to work out leg numbers
minlegs=100
legs=0
for i in [borns, virts]:
with open(i, "r") as f:
for line in f:
line = line.split(" ")
N = len(line)
if N < minlegs:
minlegs = N
for it in line:
if it.replace("-","").isdigit():
legs += 1
#conversion for heft model to go from (2QCD+1QED)->1HIG for each FS HIGGS.
if model=="heft":
HIG = oras+orew-legs+2
if HIG % 2 == 0:
HIG = HIG//2
else:
sys.stderr.write("Warning: No possible coupling power:(int(oras)+int(orew)-legs+2)%2!=0\n")
exit(1)
else:
HIG = 0
with open(borns, "r") as f:
for i, line in enumerate(f):
#this assumes extra QCD emmissions
addalphas = len(line.split(" ")) - minlegs
line = line.rstrip()
procnr += 1
bornlist.append(str(procnr))
cmd = "generate " if i==0 else "add process"
hig = ""
qcd = oras+addalphas
qed = orew
if HIG:
hig = "HIG=%s" % HIG
qcd -= 2*HIG
qed -= HIG
bornlines.append("{cmd} {line} {hig} QCD<={qcd} QED<={qed} @{procnr}".format(**locals()))
result.extend(bornlines)
with open(virts, "r") as f:
for i, line in enumerate(f):
addalphas = len(line.split(" ")) - minlegs
line = line.rstrip()
procnr += 1
virtlist.append(str(procnr))
cmd = "generate " if i==0 else "add process"
qcd = oras+addalphas
qed = orew
virtlines.append("{cmd} {line} QCD<={qcd} QED<={qed} [ virt=QCD ] @{procnr}".format(**locals()))
if virtlines and bornlines:
result.append("output matchbox MG5 --postpone_model")
result.extend(virtlines)
result.append("output matchbox MG5 -f\n")
with open("proc.dat","w") as f:
f.write('\n'.join(result))
return bornlist,virtlist
def build_matchbox_tmp(pwd,buildpath,absolute_links):
"""Create the working directories and link the required files from central MG"""
pwd = os.path.abspath(pwd)
if not os.path.isabs(buildpath):
buildpath = os.path.join(pwd,buildpath)
resources =glob.glob(os.path.join(buildpath,"MG5","SubProcesses","MadLoop5_resources","*"))
resources+=glob.glob(os.path.join(buildpath,"MG5","Cards","*"))
resources+=glob.glob(os.path.join(buildpath,"MG5","Cards","SubProcesses","*"))
for i in resources:
f = os.path.join(MG_TMP, os.path.basename(i))
if not os.path.isfile(f) and not os.path.islink(f):
if absolute_links:
os.symlink(i,f)
else:
os.symlink(os.path.relpath(i,MG_TMP), f)
parser = OptionParser()
parser.add_option("-a", "--buildpath", dest="buildpath",help="Do not use this script. Only for Herwig internal use. ")
parser.add_option("-b", "--build", action="store_true", dest="build", default=True,help="Do not use this script. Only for Herwig internal use.")
parser.add_option("-c", "--madgraph", dest="madgraph",help="Do not use this script. Only for Herwig internal use.")
parser.add_option("-d", "--runpath", dest="runpath",help="Do not use this script. Only for Herwig internal use.")
parser.add_option("-e", "--model", dest="model",help="Do not use this script. Only for Herwig internal use.")
parser.add_option("-f", "--orderas", dest="orderas",help="Do not use this script. Only for Herwig internal use.")
parser.add_option("-g", "--orderew", dest="orderew",help="Do not use this script. Only for Herwig internal use.")
parser.add_option("-i", "--datadir",dest="datadir",help="Do not use this script. Only for Herwig internal use.")
parser.add_option("-I", "--includedir",dest="includedir",help="Do not use this script. Only for Herwig internal use.")
parser.add_option("-l", "--absolute-links",action="store_true", dest="absolute_links", default=False,\
help="Do not use this script. Only for Herwig internal use.")
parser.add_option("--cacheprefix", dest="cacheprefix",help="Do not use this script. Only for Herwig internal use.")
(options, args) = parser.parse_args()
if not options.cacheprefix:
sys.stderr.write("Need a value for --cacheprefix\n")
exit(1)
cachedir = os.path.abspath(options.cacheprefix)
mkdir_p(cachedir)
#MG_TMP = tempfile.mkdtemp(prefix='MG_tmp_',dir=cachedir)
MG_TMP = os.path.join(cachedir, 'MG_tmp')
mkdir_p(MG_TMP)
pwd=os.getcwd()
param_card=""
if options.model=="loop_sm" or options.model=="heft":
if options.model=="loop_sm":
param_card="param_card.dat"
else:
param_card="param_card_"+options.model+".dat"
file = open("%s/MadGraphInterface/%s.in" % (options.datadir,param_card) , "r")
paramcard = file.read()
file.close()
file = open(options.runpath+"/"+param_card, "w")
params=open(options.runpath+"/MG-Parameter.dat", "r")
for line in params:
a=line.split()
paramcard=paramcard.replace(a[0],a[1])
params.close()
file.write(paramcard)
file.close()
elif options.model.startswith("/"):
os.system("python %s/write_param_card.py " % options.model)
else:
print("---------------------------------------------------------------")
print("---------------------------------------------------------------")
print("Warning: The model set for the MadGraph Interface ")
print(" needs a parameter setting by hand.")
print(" Please fill the param_card_"+options.model+".dat")
print(" with your favourite assumptions.")
print(" And make sure Herwig uses the same parameters.")
print("---------------------------------------------------------------")
print("---------------------------------------------------------------")
if os.path.isfile(options.buildpath +"/MG5/Cards/param_card.dat") and not os.path.isfile(options.runpath+"/"+"param_card_"+options.model+".dat"):
shutil.copyfile(options.buildpath +"/MG5/Cards/param_card.dat", options.runpath+"/"+"param_card_"+options.model+".dat")
time.sleep(1)
if not os.path.isdir(options.buildpath):
print("The MadGraph Install path did not exist. It has been created for you.")
print("Just start Herwig read again..")
mkdir_p(options.buildpath)
exit()
os.chdir(options.buildpath)
if os.path.isfile("InterfaceMadGraph.so"):
build_matchbox_tmp(pwd,options.buildpath,options.absolute_links)
exit()
if not options.madgraph and not os.path.isfile("InterfaceMadGraph.so"):
sys.stderr.write("*** MadGraph build failed, check logfile for details ***")
exit(1)
# find MG version from its address
MGV = options.madgraph.split("/")
MGVersion = 0
for term in MGV :
if "MG5_aMC_v" in term :
term = term.split("_")
MGVersion = term[2][1]
Bornlist,Virtlist=fillprocs(options.model,options.orderas,options.orderew,int(MGVersion))
if sys.version_info[0] == 2 and MGVersion == "3" :
os.system("python3 "+options.madgraph+"/mg5_aMC proc.dat")
else:
os.system("python "+options.madgraph+"/mg5_aMC proc.dat")
def make_case_stmts(func):
"""Create Fortran case statements for all processes"""
result = []
# add a case option for each item
for i in Bornlist + list(set(Virtlist) - set(Bornlist)):
if func == "SLOOPMATRIX(momenta,virt)" and i not in Virtlist:
continue
result.append(" CASE(%s)" % i)
result.append(" CALL MG5_%s_%s" % (i,func))
# if we have anything, add header and footer
if result:
result.insert(0,
" SELECT CASE (proc)")
result.append(" CASE DEFAULT")
result.append(" WRITE(*,*) '##W02A WARNING No id found '")
result.append(" END SELECT ")
return "\n".join(result)
else:
return ""
def write_interfaceMG():
"""Create the InterfaceMadGraph.f FORTRAN file"""
subs = {
"MG_CalculateBORNtxt" : make_case_stmts("BORN(momenta,hel)"),
"MG_CalculateVIRTtxt" : make_case_stmts("SLOOPMATRIX(momenta,virt)"),
"MG_Jamptxt" : make_case_stmts("GET_JAMP(color,Jamp)"),
"MG_LNJamptxt" : make_case_stmts("GET_LNJAMP(color,Jamp)"),
"MG_NColtxt" : make_case_stmts("GET_NCOL(color)"),
"MG_ColourMattxt" : make_case_stmts("GET_NCOLOR(i,j,color)"),
}
baseN = 5 if subs["MG_CalculateVIRTtxt"] else 3
subs["MG_vxxxxxtxt"] = """\
subroutine MG_vxxxxx(p, n,inc,VC)
$ bind(c, name='MG_vxxxxx')
IMPLICIT NONE
double precision p(0:3)
double precision n(0:3)
INTEGER inc
double precision VC(0:7)
double complex VCtmp({d})
call vxxxxx(p, 0d0,1,inc ,VCtmp)
VC(0)= real(VCtmp({a}))
VC(1)=aimag(VCtmp({a}))
VC(2)= real(VCtmp({b}))
VC(3)=aimag(VCtmp({b}))
VC(4)= real(VCtmp({c}))
VC(5)=aimag(VCtmp({c}))
VC(6)= real(VCtmp({d}))
VC(7)=aimag(VCtmp({d}))
END
""".format(a=baseN, b=baseN+1, c=baseN+2, d=baseN+3)
fname = os.path.join(
options.datadir,
"MadGraphInterface",
"InterfaceMadGraph.f.in"
)
with open(fname, 'r') as f:
tmp = f.read()
with open("InterfaceMadGraph.f", 'w') as f:
f.write(tmp.format(**subs))
write_interfaceMG()
make=" "
fortanfiles=glob.glob('*/*/*.f')+glob.glob('*/*/*/*.f')
for i in fortanfiles:
if "check_sa" not in i and "f2py_wrapper" not in i:
if not os.path.islink(i):
make += " "+i+"\\\n "
incfiles=glob.glob('*/*/*.inc')+glob.glob('*/*/*/*.inc')
coefdir=""
for i in incfiles:
if "nexternal.inc" in i:
coefdir+=" -I"+i.replace("nexternal.inc"," ")
file=open("makefile","w")
file.write("include MG5/Source/make_opts ")
if Virtlist!=[]:
collierlib=options.madgraph
collierlib=collierlib.replace("bin","HEPTools/collier")
onelooplib=options.madgraph
onelooplib=onelooplib.replace("bin","HEPTools/oneloop")
file.write("\nLIBDIR = MG5/lib")
file.write("\nLINKLIBS =-L$(LIBDIR) -lcts -liregi ")
if (os.path.exists("MG5/lib/ninja_lib")):
file.write("\nLINKLIBS += -L$(LIBDIR)/ninja_lib -lninja ")
if (os.path.exists(collierlib)):
file.write("\nLINKLIBS += -L%s -lcollier "%(collierlib))
if (os.path.exists(onelooplib)):
file.write("\nLINKLIBS += -L%s -lavh_olo "%(onelooplib))
if (os.path.exists("MG5/lib/golem95_lib")):
file.write("\nLINKLIBS += -L$(LIBDIR)/golem95_lib -lgolem")
file.write("\nPROCESS= InterfaceMadGraph.f "+make+"\n\nall: \n\t @FC@ @FFLAGS@ -w -fbounds-check -ffixed-line-length-none -fPIC -fno-f2c -shared -s -o InterfaceMadGraph.so -IMG5/SubProcesses/" )
if Virtlist!=[]:
if (os.path.exists("MG5/lib/golem95_include")):
file.write(" -IMG5/lib/golem95_include ")
if (os.path.exists("MG5/lib/ninja_include")):
file.write(" -IMG5/lib/ninja_include ")
incldir=options.madgraph.replace("bin","HEPTools/include")
file.write(" -I%s -I./ "%incldir)
# Find all .mod files also in /usr/include if golem was build there.
# There can be an error message in the MadGraph output to add the golem include path to the makefiles.
# Usually MadGraph finds the path if its Golem was build in an separate dictionary.
# Our bootstrap script installs golem with gosam beside boost. Here MadGraph creates a link (->errormessage).
# If we can find the modfiles easily the user doesn't need to change the makefiles.
moddirs=finddirs('*.mod',options.includedir)
for moddir in moddirs:
file.write(" -I%s " % moddir)
if os.path.isdir("/usr/include"):
moddirs=finddirs('*.mod',"/usr/include")
for moddir in moddirs:
file.write(" -I%s " % moddir)
if coefdir != "":
file.write(coefdir)
file.write(" $(PROCESS) $(LINKLIBS) ")
file.close()
def replacetext(filename, sourceText, replaceText):
"""Replace text in existing file."""
with open(filename, "r") as f:
text = f.read()
with open(filename, "w") as f:
f.write(text.replace(sourceText, replaceText))
os.chdir(pwd)
os.chdir(options.buildpath)
replacetext("MG5/Source/MODEL/lha_read.f", "ident_card.dat", os.path.join(options.cacheprefix,
"MG_tmp","ident_card.dat"))
replacetext("MG5/Source/MODEL/lha_read.f", "param.log", os.path.join(options.cacheprefix,
"MG_tmp","param.log"))
if Virtlist:
replacetext("MG5/SubProcesses/MadLoopCommons.f",
"PREFIX='./'",
"PREFIX='%s/'" % MG_TMP)
os.system("make")
if not os.path.isfile("InterfaceMadGraph.so"):
print("Second trial to make MadGraph Interface. ")
print("Needed if new .mod files are produced by make.")
os.system("make")
build_matchbox_tmp(pwd,options.buildpath,options.absolute_links)
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Nov 19, 6:18 PM (1 d, 20 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3805558
Default Alt Text
(14 KB)
Attached To
rHERWIGHG herwighg
Event Timeline
Log In to Comment