################################################################################
#
# Copyright (c) 2012 The MadGraph5_aMC@NLO Development team and Contributors
#
# This file is a part of the MadGraph5_aMC@NLO project, an application which
# automatically generates Feynman diagrams and matrix elements for arbitrary
# high-energy processes in the Standard Model and beyond.
#
# It is subject to the MadGraph5_aMC@NLO license which should accompany this
# distribution.
#
# For more information, visit madgraph.phys.ucl.ac.be and amcatnlo.web.cern.ch
#
################################################################################
"""Test the validity of the LHE parser"""
import unittest
import madgraph.various.lhe_parser as lhe_parser
import madgraph .various.misc as misc
import tempfile
import os
import shutil
pjoin = os.path.join
from madgraph import MG5DIR
class TESTLHEParser(unittest.TestCase):
def setUp(self):
debugging = False
if debugging:
self.path = pjoin(MG5DIR, "tmp_lhe_test")
if os.path.exists(self.path):
shutil.rmtree(self.path)
os.mkdir(pjoin(MG5DIR, "tmp_test"))
else:
self.path = tempfile.mkdtemp(prefix='test_mg5')
def tearDown(self):
if self.path != pjoin(MG5DIR, "tmp_lhe_test"):
shutil.rmtree(self.path)
def test_parsing_lo_weight(self):
"""test that our parser can handle a large range of lo_weight format"""
def parse_lo_weight_old(evt):
"""parsing for unittest onlyx"""
start, stop = evt.tag.find(''), evt.tag.find('')
if start != -1 != stop :
text = evt.tag[start+8:stop]
# 3 0.29765919e+03
#0
# 1 21 0.15134321e+00 0.29765919e+03
# 1 21 0.38683649e-01 0.29765919e+03
# 0.17315115e+03
evt.loweight={}
for line in text.split('\n'):
line = line.replace('<', ' <').replace("'",'"')
if 'rscale' in line:
_, nqcd, scale, _ = line.split()
evt.loweight['n_qcd'] = int(nqcd)
evt.loweight['ren_scale'] = float(scale)
elif '' in line:
args = line.replace('>','> ').split()
nalps = int(args[1])
evt.loweight['asrwt'] = [float(a) for a in args[2:2+nalps]]
elif 'totfact' in line:
args = line.replace('>','> ').split()
evt.loweight['tot_fact'] = float(args[1])
else:
return None
return evt.loweight
events=["""
4 0 +1.7208000e-01 1.00890300e+02 7.95774700e-02 1.27947900e-01
-1 -1 0 0 0 501 +0.0000000e+00 +0.0000000e+00 +1.1943355e+01 1.19433546e+01 0.00000000e+00 0.0000e+00 1.0000e+00
2 -1 0 0 501 0 +0.0000000e+00 +0.0000000e+00 -1.0679326e+03 1.06793262e+03 0.00000000e+00 0.0000e+00 -1.0000e+00
24 1 1 2 0 0 +6.0417155e+00 +4.2744556e+01 -7.9238049e+02 7.97619997e+02 8.04190073e+01 3.4933e-25 -1.0000e+00
23 1 1 2 0 0 -6.0417155e+00 -4.2744556e+01 -2.6360878e+02 2.82255979e+02 9.11880035e+01 1.8975e-26 1.0000e+00
""","""
4 0 +1.7208000e-01 1.00890300e+02 7.95774700e-02 1.27947900e-01
-1 -1 0 0 0 501 +0.0000000e+00 +0.0000000e+00 +1.1943355e+01 1.19433546e+01 0.00000000e+00 0.0000e+00 1.0000e+00
2 -1 0 0 501 0 +0.0000000e+00 +0.0000000e+00 -1.0679326e+03 1.06793262e+03 0.00000000e+00 0.0000e+00 -1.0000e+00
24 1 1 2 0 0 +6.0417155e+00 +4.2744556e+01 -7.9238049e+02 7.97619997e+02 8.04190073e+01 3.4933e-25 -1.0000e+00
23 1 1 2 0 0 -6.0417155e+00 -4.2744556e+01 -2.6360878e+02 2.82255979e+02 9.11880035e+01 1.8975e-26 1.0000e+00
2 0.12500000E+03
0
1 4 0.11319990E+00 0.12500000E+03
1 -1 0.59528052E+00 0.12500000E+03
-0.27352270E-03
""",
"""
4 0 +1.7208000e-01 1.00890300e+02 7.95774700e-02 1.27947900e-01
-1 -1 0 0 0 501 +0.0000000e+00 +0.0000000e+00 +1.1943355e+01 1.19433546e+01 0.00000000e+00 0.0000e+00 1.0000e+00
2 -1 0 0 501 0 +0.0000000e+00 +0.0000000e+00 -1.0679326e+03 1.06793262e+03 0.00000000e+00 0.0000e+00 -1.0000e+00
24 1 1 2 0 0 +6.0417155e+00 +4.2744556e+01 -7.9238049e+02 7.97619997e+02 8.04190073e+01 3.4933e-25 -1.0000e+00
23 1 1 2 0 0 -6.0417155e+00 -4.2744556e+01 -2.6360878e+02 2.82255979e+02 9.11880035e+01 1.8975e-26 1.0000e+00
2 0.12500000E+03
1 0.11
1 4 0.11319990E+00 0.12500000E+03
2 1 -1 0.2 0.11e-02 0.59528052E+00 0.12500000E+03
115
""",
"""
4 0 +1.7208000e-01 1.00890300e+02 7.95774700e-02 1.27947900e-01
-1 -1 0 0 0 501 +0.0000000e+00 +0.0000000e+00 +1.1943355e+01 1.19433546e+01 0.00000000e+00 0.0000e+00 1.0000e+00
2 -1 0 0 501 0 +0.0000000e+00 +0.0000000e+00 -1.0679326e+03 1.06793262e+03 0.00000000e+00 0.0000e+00 -1.0000e+00
24 1 1 2 0 0 +6.0417155e+00 +4.2744556e+01 -7.9238049e+02 7.97619997e+02 8.04190073e+01 3.4933e-25 -1.0000e+00
23 1 1 2 0 0 -6.0417155e+00 -4.2744556e+01 -2.6360878e+02 2.82255979e+02 9.11880035e+01 1.8975e-26 1.0000e+00
2 0.12500000E+03
1 0.11
1 4 0.11319990E+00 0.12500000e+03
2 1 -1 0.2 0.11e-02 0.59528052E+00 0.12500000E+03
115.001
""",
"""
4 0 +1.7208000e-01 1.00890300e+02 7.95774700e-02 1.27947900e-01
-1 -1 0 0 0 501 +0.0000000e+00 +0.0000000e+00 +1.1943355e+01 1.19433546e+01 0.00000000e+00 0.0000e+00 1.0000e+00
2 -1 0 0 501 0 +0.0000000e+00 +0.0000000e+00 -1.0679326e+03 1.06793262e+03 0.00000000e+00 0.0000e+00 -1.0000e+00
24 1 1 2 0 0 +6.0417155e+00 +4.2744556e+01 -7.9238049e+02 7.97619997e+02 8.04190073e+01 3.4933e-25 -1.0000e+00
23 1 1 2 0 0 -6.0417155e+00 -4.2744556e+01 -2.6360878e+02 2.82255979e+02 9.11880035e+01 1.8975e-26 1.0000e+00
2 0.12500000E+03
1 0.11
1 4 0.11319990E+00 0.12500000e+03
2 1 -1 0.2 0.11e-02 0.59528052E+00 0.12500000E+03
115.001
""",
"""
4 0 +1.7208000e-01 1.00890300e+02 7.95774700e-02 1.27947900e-01
-1 -1 0 0 0 501 +0.0000000e+00 +0.0000000e+00 +1.1943355e+01 1.19433546e+01 0.00000000e+00 0.0000e+00 1.0000e+00
2 -1 0 0 501 0 +0.0000000e+00 +0.0000000e+00 -1.0679326e+03 1.06793262e+03 0.00000000e+00 0.0000e+00 -1.0000e+00
24 1 1 2 0 0 +6.0417155e+00 +4.2744556e+01 -7.9238049e+02 7.97619997e+02 8.04190073e+01 3.4933e-25 -1.0000e+00
23 1 1 2 0 0 -6.0417155e+00 -4.2744556e+01 -2.6360878e+02 2.82255979e+02 9.11880035e+01 1.8975e-26 1.0000e+00
2 0.26956472E+02
1 0.46373112E+02
1 21 0.13689253E-01 0.52142986E+01
1 21 0.29841683E-01 0.46373112E+02
0.15951072E+03
"""]
solutions = [None,
{'pdf_pdg_code1': [4], 'asrwt': [], 'pdf_pdg_code2': [-1], 'pdf_q1': [125.0], 'pdf_q2': [125.0], 'n_pdfrw1': 1, 'n_pdfrw2': 1, 'tot_fact': -0.0002735227, 'pdf_x2': [0.59528052], 'pdf_x1': [0.1131999], 'n_qcd': 2, 'ren_scale': 125.0},
{'pdf_pdg_code1': [4], 'asrwt': [0.11], 'pdf_pdg_code2': [1, -1], 'pdf_q1': [125.0], 'pdf_q2': [0.59528052, 125.0], 'ren_scale': 125.0, 'n_pdfrw1': 1, 'n_pdfrw2': 2, 'pdf_x2': [0.2, 0.0011], 'pdf_x1': [0.1131999], 'n_qcd': 2, 'tot_fact': 115.0},
{'pdf_pdg_code1': [4], 'asrwt': [0.11], 'pdf_pdg_code2': [1, -1], 'pdf_q1': [125.0], 'pdf_q2': [0.59528052, 125.0], 'ren_scale': 125.0, 'n_pdfrw1': 1, 'n_pdfrw2': 2, 'pdf_x2': [0.2, 0.0011], 'pdf_x1': [0.1131999], 'n_qcd': 2, 'tot_fact': 115.001},
{'pdf_pdg_code1': [4], 'asrwt': [0.11], 'pdf_pdg_code2': [1, -1], 'pdf_q1': [125.0], 'pdf_q2': [0.59528052, 125.0], 'ren_scale': 125.0, 'n_pdfrw1': 1, 'n_pdfrw2': 2, 'pdf_x2': [0.2, 0.0011], 'pdf_x1': [0.1131999], 'n_qcd': 2, 'tot_fact': 115.001},
{'pdf_pdg_code1': [21], 'asrwt': [46.373112], 'pdf_pdg_code2': [21], 'pdf_q1': [5.2142986], 'pdf_q2': [46.373112], 'ren_scale': 26.956472, 'n_pdfrw1': 1, 'n_pdfrw2': 1, 'pdf_x2': [0.029841683], 'pdf_x1': [0.013689253], 'n_qcd': 2, 'tot_fact': 159.51072},
None]
for i,evt in enumerate(events):
evt1 = lhe_parser.Event(evt)
evt2 = lhe_parser.Event(evt)
lo = evt1.parse_lo_weight()
try:
lo2 = parse_lo_weight_old(evt2)
except:
pass
else:
if lo:
for key in lo2:
self.assertEqual(lo[key], lo2[key])
self.assertEqual(lo, solutions[i])
def test_read_write_lhe(self):
"""test that we can read/write an lhe event file"""
input= """
2212 2212 0.70000000000E+04 0.70000000000E+04 0 0 10042 10042 3 1
0.16531958660E+02 0.18860728290E+00 0.17208000000E+00 0
4 0 +1.7208000e-01 1.00890300e+02 7.95774700e-02 1.27947900e-01
-1 -1 0 0 0 501 +0.0000000e+00 +0.0000000e+00 +1.1943355e+01 1.19433546e+01 0.00000000e+00 0.0000e+00 1.0000e+00
2 -1 0 0 501 0 +0.0000000e+00 +0.0000000e+00 -1.0679326e+03 1.06793262e+03 0.00000000e+00 0.0000e+00 -1.0000e+00
24 1 1 2 0 0 +6.0417155e+00 +4.2744556e+01 -7.9238049e+02 7.97619997e+02 8.04190073e+01 3.4933e-25 -1.0000e+00
23 1 1 2 0 0 -6.0417155e+00 -4.2744556e+01 -2.6360878e+02 2.82255979e+02 9.11880035e+01 1.8975e-26 1.0000e+00
4 0 +1.7208000e-01 1.00890300e+02 7.95774700e-02 1.27947900e-01
-1 -1 0 0 0 501 +0.0000000e+00 +0.0000000e+00 +1.1943355e+01 1.19433546e+01 0.00000000e+00 0.0000e+00 1.0000e+00
2 -1 0 0 501 0 +0.0000000e+00 +0.0000000e+00 -1.0679326e+03 1.06793262e+03 0.00000000e+00 0.0000e+00 -1.0000e+00
24 1 1 2 0 0 +6.0417155e+00 +4.2744556e+01 -7.9238049e+02 7.97619997e+02 8.04190073e+01 3.4933e-25 -1.0000e+00
23 1 1 2 0 0 -6.0417155e+00 -4.2744556e+01 -2.6360878e+02 2.82255979e+02 9.11880035e+01 1.8975e-26 1.0000e+00
# balbalblb
#bbbb3
7 66 +1.5024446e-03 3.15138740e+02 7.95774720e-02 9.66701260e-02
21 -1 0 0 502 501 +0.0000000e+00 +0.0000000e+00 -6.4150959e+01 6.41553430e+01 7.49996552e-01 0.0000e+00 0.0000e+00
2 -1 0 0 501 0 +0.0000000e+00 +0.0000000e+00 +8.1067989e+02 8.10679950e+02 3.11899968e-01 0.0000e+00 0.0000e+00
24 2 1 2 0 0 -1.5294533e+02 +1.0783429e+01 +4.5796553e+02 4.89600040e+02 8.04190039e+01 0.0000e+00 0.0000e+00
2 1 3 3 503 0 -1.5351296e+02 +1.2743130e+01 +4.6093709e+02 4.85995489e+02 0.00000000e+00 0.0000e+00 0.0000e+00
-1 1 3 3 0 503 +5.6763429e-01 -1.9597014e+00 -2.9715566e+00 3.60455091e+00 0.00000000e+00 0.0000e+00 0.0000e+00
23 1 1 2 0 0 +4.4740095e+01 +3.2658177e+01 +4.6168760e+01 1.16254200e+02 9.11880036e+01 0.0000e+00 0.0000e+00
1 1 1 2 502 0 +1.0820523e+02 -4.3441605e+01 +2.4239464e+02 2.68981060e+02 3.22945297e-01 0.0000e+00 0.0000e+00
# 2 5 2 2 1 0.11659994e+03 0.11659994e+03 8 0 0 0.10000000e+01 0.88172677e+00 0.11416728e+01 0.00000000e+00 0.00000000e+00
+9.1696000e+03
+1.1264000e+04
+6.9795000e+03
+9.1513000e+03
+1.1253000e+04
"""
open(pjoin(self.path,'event.lhe'),'w').write(input)
input = lhe_parser.EventFile(pjoin(self.path,'event.lhe'))
self.assertEqual(input.banner, """
2212 2212 0.70000000000E+04 0.70000000000E+04 0 0 10042 10042 3 1
0.16531958660E+02 0.18860728290E+00 0.17208000000E+00 0
""")
nb_event = 0
txt = ""
for event in input:
nb_event +=1
new = lhe_parser.Event(text=str(event))
for part1,part2 in zip(event, new):
self.assertEqual(part1, part2)
self.assertEqual(new, event, '%s \n !=\n %s' % (new, event))
txt += str(event)
self.assertEqual(nb_event, 3)
target = """
4 0 +1.7208000e-01 1.00890300e+02 7.95774700e-02 1.27947900e-01
-1 -1 0 0 0 501 +0.0000000000e+00 +0.0000000000e+00 +1.1943355000e+01 1.1943354600e+01 0.0000000000e+00 0.0000e+00 1.0000e+00
2 -1 0 0 501 0 +0.0000000000e+00 +0.0000000000e+00 -1.0679326000e+03 1.0679326200e+03 0.0000000000e+00 0.0000e+00 -1.0000e+00
24 1 1 2 0 0 +6.0417155000e+00 +4.2744556000e+01 -7.9238049000e+02 7.9761999700e+02 8.0419007300e+01 3.4933e-25 -1.0000e+00
23 1 1 2 0 0 -6.0417155000e+00 -4.2744556000e+01 -2.6360878000e+02 2.8225597900e+02 9.1188003500e+01 1.8975e-26 1.0000e+00
4 0 +1.7208000e-01 1.00890300e+02 7.95774700e-02 1.27947900e-01
-1 -1 0 0 0 501 +0.0000000000e+00 +0.0000000000e+00 +1.1943355000e+01 1.1943354600e+01 0.0000000000e+00 0.0000e+00 1.0000e+00
2 -1 0 0 501 0 +0.0000000000e+00 +0.0000000000e+00 -1.0679326000e+03 1.0679326200e+03 0.0000000000e+00 0.0000e+00 -1.0000e+00
24 1 1 2 0 0 +6.0417155000e+00 +4.2744556000e+01 -7.9238049000e+02 7.9761999700e+02 8.0419007300e+01 3.4933e-25 -1.0000e+00
23 1 1 2 0 0 -6.0417155000e+00 -4.2744556000e+01 -2.6360878000e+02 2.8225597900e+02 9.1188003500e+01 1.8975e-26 1.0000e+00
# balbalblb
#bbbb3
7 66 +1.5024446e-03 3.15138740e+02 7.95774720e-02 9.66701260e-02
21 -1 0 0 502 501 +0.0000000000e+00 +0.0000000000e+00 -6.4150959000e+01 6.4155343000e+01 7.4999655200e-01 0.0000e+00 0.0000e+00
2 -1 0 0 501 0 +0.0000000000e+00 +0.0000000000e+00 +8.1067989000e+02 8.1067995000e+02 3.1189996800e-01 0.0000e+00 0.0000e+00
24 2 1 2 0 0 -1.5294533000e+02 +1.0783429000e+01 +4.5796553000e+02 4.8960004000e+02 8.0419003900e+01 0.0000e+00 0.0000e+00
2 1 3 3 503 0 -1.5351296000e+02 +1.2743130000e+01 +4.6093709000e+02 4.8599548900e+02 0.0000000000e+00 0.0000e+00 0.0000e+00
-1 1 3 3 0 503 +5.6763429000e-01 -1.9597014000e+00 -2.9715566000e+00 3.6045509100e+00 0.0000000000e+00 0.0000e+00 0.0000e+00
23 1 1 2 0 0 +4.4740095000e+01 +3.2658177000e+01 +4.6168760000e+01 1.1625420000e+02 9.1188003600e+01 0.0000e+00 0.0000e+00
1 1 1 2 502 0 +1.0820523000e+02 -4.3441605000e+01 +2.4239464000e+02 2.6898106000e+02 3.2294529700e-01 0.0000e+00 0.0000e+00
# 2 5 2 2 1 0.11659994e+03 0.11659994e+03 8 0 0 0.10000000e+01 0.88172677e+00 0.11416728e+01 0.00000000e+00 0.00000000e+00
+9.1696000e+03
+1.1264000e+04
+6.9795000e+03
+9.1513000e+03
+1.1253000e+04
"""
self.assertEqual(target.split('\n'), txt.split('\n'))
def test_read_write_gzip(self):
""" """
input= """
2212 2212 0.70000000000E+04 0.70000000000E+04 0 0 10042 10042 3 1
0.16531958660E+02 0.18860728290E+00 0.17208000000E+00 0
4 0 +1.7208000e-01 1.00890300e+02 7.95774700e-02 1.27947900e-01
-1 -1 0 0 0 501 +0.0000000e+00 +0.0000000e+00 +1.1943355e+01 1.19433546e+01 0.00000000e+00 0.0000e+00 1.0000e+00
2 -1 0 0 501 0 +0.0000000e+00 +0.0000000e+00 -1.0679326e+03 1.06793262e+03 0.00000000e+00 0.0000e+00 -1.0000e+00
24 1 1 2 0 0 +6.0417155e+00 +4.2744556e+01 -7.9238049e+02 7.97619997e+02 8.04190073e+01 3.4933e-25 -1.0000e+00
23 1 1 2 0 0 -6.0417155e+00 -4.2744556e+01 -2.6360878e+02 2.82255979e+02 9.11880035e+01 1.8975e-26 1.0000e+00
4 0 +1.7208000e-01 1.00890300e+02 7.95774700e-02 1.27947900e-01
-1 -1 0 0 0 501 +0.0000000e+00 +0.0000000e+00 +1.1943355e+01 1.19433546e+01 0.00000000e+00 0.0000e+00 1.0000e+00
2 -1 0 0 501 0 +0.0000000e+00 +0.0000000e+00 -1.0679326e+03 1.06793262e+03 0.00000000e+00 0.0000e+00 -1.0000e+00
24 1 1 2 0 0 +6.0417155e+00 +4.2744556e+01 -7.9238049e+02 7.97619997e+02 8.04190073e+01 3.4933e-25 -1.0000e+00
23 1 1 2 0 0 -6.0417155e+00 -4.2744556e+01 -2.6360878e+02 2.82255979e+02 9.11880035e+01 1.8975e-26 1.0000e+00
# balbalblb
#bbbb3
7 66 +1.5024446e-03 3.15138740e+02 7.95774720e-02 9.66701260e-02
21 -1 0 0 502 501 +0.0000000e+00 +0.0000000e+00 -6.4150959e+01 6.41553430e+01 7.49996552e-01 0.0000e+00 0.0000e+00
2 -1 0 0 501 0 +0.0000000e+00 +0.0000000e+00 +8.1067989e+02 8.10679950e+02 3.11899968e-01 0.0000e+00 0.0000e+00
24 2 1 2 0 0 -1.5294533e+02 +1.0783429e+01 +4.5796553e+02 4.89600040e+02 8.04190039e+01 0.0000e+00 0.0000e+00
2 1 3 3 503 0 -1.5351296e+02 +1.2743130e+01 +4.6093709e+02 4.85995489e+02 0.00000000e+00 0.0000e+00 0.0000e+00
-1 1 3 3 0 503 +5.6763429e-01 -1.9597014e+00 -2.9715566e+00 3.60455091e+00 0.00000000e+00 0.0000e+00 0.0000e+00
23 1 1 2 0 0 +4.4740095e+01 +3.2658177e+01 +4.6168760e+01 1.16254200e+02 9.11880036e+01 0.0000e+00 0.0000e+00
1 1 1 2 502 0 +1.0820523e+02 -4.3441605e+01 +2.4239464e+02 2.68981060e+02 3.22945297e-01 0.0000e+00 0.0000e+00
# 2 5 2 2 1 0.11659994e+03 0.11659994e+03 8 0 0 0.10000000e+01 0.88172677e+00 0.11416728e+01 0.00000000e+00 0.00000000e+00
+9.1696000e+03
+1.1264000e+04
+6.9795000e+03
+9.1513000e+03
+1.1253000e+04
"""
open(pjoin(self.path, 'event.lhe'),'w').write(input)
input_lhe = lhe_parser.EventFile(pjoin(self.path, 'event.lhe.gz'))
output_lhe = lhe_parser.EventFile(pjoin(self.path, 'event2.lhe.gz'),'w')
output_lhe.write(input_lhe.banner)
for event in input_lhe:
output_lhe.write(str(event))
output_lhe.close()
self.assertTrue(pjoin(self.path,'event2.lhe.gz'))
text = open(pjoin(self.path, 'event2.lhe.gz')).read()
self.assertFalse(text.startswith(''))
misc.gunzip(pjoin(self.path,'event2.lhe.gz'))
self.assertTrue(pjoin(self.path,'event2.lhe'))
input_lhe = lhe_parser.EventFile(pjoin(self.path, 'event.lhe'))