-
Notifications
You must be signed in to change notification settings - Fork 0
/
lhe2root_radion.py
281 lines (248 loc) · 9.86 KB
/
lhe2root_radion.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
#!/usr/bin/env python
# Python modules
import argparse
import numpy
import xml.etree.ElementTree as ET
# Homemade modules
from particles import *
# Argument parser setup
parser = argparse.ArgumentParser()
parser.add_argument("--infile", help="File in LHE format to be read", nargs='?', type=str, default="MR_3000.lhe")
parser.add_argument("--outfile", help="File in ROOT format for output", nargs='?', type=str, default="MR_3000.root")
parser.add_argument("--outtree", help="output TTree name", nargs='?', type=str, default="test")
args = parser.parse_args()
# ROOT setup
import ROOT
from ROOT import gROOT
from ROOT import TTree, TFile, TLorentzVector
# ROOT initialization
gROOT.Reset()
gROOT.SetBatch()
########################################################################################
######
# Let's go inefficient but human-readable :
# - first get the relevant data out of the file (ie particle gen info)
# - then loop over the data to store stuff into ROOT format
#####
########################################################################################
########################################################################################
##### READ THE LHE FILE
########################################################################################
LHEeventlist = ET.parse(args.infile)
root = LHEeventlist.getroot()
eventlist = []
#print root, root.tag, root.attrib, len(root)
for ichild, child in enumerate(root):
if child.tag != "event":
continue
# if ichild > 10:
# break
if ichild % 10000 == 0:
print ichild
#print ichild, child.tag, child.attrib, child.text
# print type(child.text)
# Get the different lines
LHEparticlelist = child.text.split("\n")
# List cleanup
LHEparticlelist = filter(None, LHEparticlelist)
LHEparticlelist.pop(0)
# Get the different particles
particlelist = []
for iLHEp, LHEp in enumerate(LHEparticlelist):
# cleanup the particles and prepare the TLorentzVector construction
LHEp = LHEp.strip()
LHEp = LHEp.split()
LHEp = map(int, LHEp[:6]) + map(float, LHEp[6:])
#print LHEp
particlelist.append( particle(iLHEp, *LHEp) )
eventlist.append(particlelist)
########################################################################################
# WRITE THE ROOT FILE
########################################################################################
outfile = TFile(args.outfile, "recreate")
outtree = TTree(args.outtree, args.outtree)
# Prepare the output variables
gr_g1_p4_pt = numpy.zeros(1, dtype=float)
gr_g1_p4_eta = numpy.zeros(1, dtype=float)
gr_g1_p4_phi = numpy.zeros(1, dtype=float)
gr_g1_p4_mass = numpy.zeros(1, dtype=float)
gr_g2_p4_pt = numpy.zeros(1, dtype=float)
gr_g2_p4_eta = numpy.zeros(1, dtype=float)
gr_g2_p4_phi = numpy.zeros(1, dtype=float)
gr_g2_p4_mass = numpy.zeros(1, dtype=float)
gr_b1_p4_pt = numpy.zeros(1, dtype=float)
gr_b1_p4_eta = numpy.zeros(1, dtype=float)
gr_b1_p4_phi = numpy.zeros(1, dtype=float)
gr_b1_p4_mass = numpy.zeros(1, dtype=float)
gr_b2_p4_pt = numpy.zeros(1, dtype=float)
gr_b2_p4_eta = numpy.zeros(1, dtype=float)
gr_b2_p4_phi = numpy.zeros(1, dtype=float)
gr_b2_p4_mass = numpy.zeros(1, dtype=float)
gr_hgg_p4_pt = numpy.zeros(1, dtype=float)
gr_hgg_p4_eta = numpy.zeros(1, dtype=float)
gr_hgg_p4_phi = numpy.zeros(1, dtype=float)
gr_hgg_p4_mass = numpy.zeros(1, dtype=float)
gr_hbb_p4_pt = numpy.zeros(1, dtype=float)
gr_hbb_p4_eta = numpy.zeros(1, dtype=float)
gr_hbb_p4_phi = numpy.zeros(1, dtype=float)
gr_hbb_p4_mass = numpy.zeros(1, dtype=float)
gr_radion_p4_pt = numpy.zeros(1, dtype=float)
gr_radion_p4_eta = numpy.zeros(1, dtype=float)
gr_radion_p4_phi = numpy.zeros(1, dtype=float)
gr_radion_p4_mass = numpy.zeros(1, dtype=float)
# Create the branch to store the variable in the tree
outtree.Branch('gr_g1_p4_pt', gr_g1_p4_pt, 'gr_g1_p4_pt/D')
outtree.Branch('gr_g1_p4_eta', gr_g1_p4_eta, 'gr_g1_p4_eta/D')
outtree.Branch('gr_g1_p4_phi', gr_g1_p4_phi, 'gr_g1_p4_phi/D')
outtree.Branch('gr_g1_p4_mass', gr_g1_p4_mass, 'gr_g1_p4_mass/D')
outtree.Branch('gr_g2_p4_pt', gr_g2_p4_pt, 'gr_g2_p4_pt/D')
outtree.Branch('gr_g2_p4_eta', gr_g2_p4_eta, 'gr_g2_p4_eta/D')
outtree.Branch('gr_g2_p4_phi', gr_g2_p4_phi, 'gr_g2_p4_phi/D')
outtree.Branch('gr_g2_p4_mass', gr_g2_p4_mass, 'gr_g2_p4_mass/D')
outtree.Branch('gr_b1_p4_pt', gr_b1_p4_pt, 'gr_b1_p4_pt/D')
outtree.Branch('gr_b1_p4_eta', gr_b1_p4_eta, 'gr_b1_p4_eta/D')
outtree.Branch('gr_b1_p4_phi', gr_b1_p4_phi, 'gr_b1_p4_phi/D')
outtree.Branch('gr_b1_p4_mass', gr_b1_p4_mass, 'gr_b1_p4_mass/D')
outtree.Branch('gr_b2_p4_pt', gr_b2_p4_pt, 'gr_b2_p4_pt/D')
outtree.Branch('gr_b2_p4_eta', gr_b2_p4_eta, 'gr_b2_p4_eta/D')
outtree.Branch('gr_b2_p4_phi', gr_b2_p4_phi, 'gr_b2_p4_phi/D')
outtree.Branch('gr_b2_p4_mass', gr_b2_p4_mass, 'gr_b2_p4_mass/D')
outtree.Branch('gr_hgg_p4_pt', gr_hgg_p4_pt, 'gr_hgg_p4_pt/D')
outtree.Branch('gr_hgg_p4_eta', gr_hgg_p4_eta, 'gr_hgg_p4_eta/D')
outtree.Branch('gr_hgg_p4_phi', gr_hgg_p4_phi, 'gr_hgg_p4_phi/D')
outtree.Branch('gr_hgg_p4_mass', gr_hgg_p4_mass, 'gr_hgg_p4_mass/D')
outtree.Branch('gr_hbb_p4_pt', gr_hbb_p4_pt, 'gr_hbb_p4_pt/D')
outtree.Branch('gr_hbb_p4_eta', gr_hbb_p4_eta, 'gr_hbb_p4_eta/D')
outtree.Branch('gr_hbb_p4_phi', gr_hbb_p4_phi, 'gr_hbb_p4_phi/D')
outtree.Branch('gr_hbb_p4_mass', gr_hbb_p4_mass, 'gr_hbb_p4_mass/D')
outtree.Branch('gr_radion_p4_pt', gr_radion_p4_pt, 'gr_radion_p4_pt/D')
outtree.Branch('gr_radion_p4_eta', gr_radion_p4_eta, 'gr_radion_p4_eta/D')
outtree.Branch('gr_radion_p4_phi', gr_radion_p4_phi, 'gr_radion_p4_phi/D')
outtree.Branch('gr_radion_p4_mass', gr_radion_p4_mass, 'gr_radion_p4_mass/D')
# Loop over events
for event in eventlist:
pt_tempb1 = 0
eta_tempb1 = 0
phi_tempb1 = 0
mass_tempb1 = 0
pt_tempb2 = 0
eta_tempb2 = 0
phi_tempb2 = 0
mass_tempb2 = 0
pt_tempg1 = 0
eta_tempg1 = 0
phi_tempg1 = 0
mass_tempg1 = 0
pt_tempg2 = 0
eta_tempg2 = 0
phi_tempg2 = 0
mass_tempg2 = 0
isFirst = True
for ip, p in enumerate(event):
# print ip, p
#print p.index, p.pid, p.pt
#gr_radion_p4_pt[0] = p.pt
#gr_radion_p4_eta[0] = p.eta
#gr_radion_p4_phi[0] = p.phi
#gr_radion_p4_mass[0] = p.mass
if ip == 0 or ip == 1:
# This is a gluon, we don't care
continue
if ip == 2:
gr_radion_p4_pt[0] = p.pt
gr_radion_p4_eta[0] = p.eta
gr_radion_p4_phi[0] = p.phi
gr_radion_p4_mass[0] = p.mass
if ip == 3:
# This is hbb
gr_hbb_p4_pt[0] = p.pt
gr_hbb_p4_eta[0] = p.eta
gr_hbb_p4_phi[0] = p.phi
gr_hbb_p4_mass[0] = p.mass
if p.pid == 5 or p.pid == -5:
if isFirst == True :
pt_tempb1 = p.pt
eta_tempb1 = p.eta
phi_tempb1 = p.phi
mass_tempb1 = p.mass
isFirst = False
else:
pt_tempb2 = p.pt
eta_tempb2 = p.eta
phi_tempb2 = p.phi
mass_tempb2 = p.mass
isFirst = True
if ip == 4:
# This is hgg
gr_hgg_p4_pt[0] = p.pt
gr_hgg_p4_eta[0] = p.eta
gr_hgg_p4_phi[0] = p.phi
gr_hgg_p4_mass[0] = p.mass
if p.pid == 22 :
if isFirst == True :
pt_tempg1 = p.pt
eta_tempg1 = p.eta
phi_tempg1 = p.phi
mass_tempg1 = p.mass
isFirst = False
else:
pt_tempg2 = p.pt
eta_tempg2 = p.eta
phi_tempg2 = p.phi
mass_tempg2 = p.mass
if pt_tempb1 >= pt_tempb2 :
gr_b1_p4_pt[0] = pt_tempb1
gr_b1_p4_eta[0] = eta_tempb1
gr_b1_p4_phi[0] = phi_tempb1
gr_b1_p4_mass[0] = mass_tempb1
gr_b2_p4_pt[0] = pt_tempb2
gr_b2_p4_eta[0] = eta_tempb2
gr_b2_p4_phi[0] = phi_tempb2
gr_b2_p4_mass[0] = mass_tempb2
else :
gr_b2_p4_pt[0] = pt_tempb1
gr_b2_p4_eta[0] = eta_tempb1
gr_b2_p4_phi[0] = phi_tempb1
gr_b2_p4_mass[0] = mass_tempb1
gr_b1_p4_pt[0] = pt_tempb2
gr_b1_p4_eta[0] = eta_tempb2
gr_b1_p4_phi[0] = phi_tempb2
gr_b1_p4_mass[0] = mass_tempb2
if pt_tempg1 >= pt_tempg2 :
gr_g1_p4_pt[0] = pt_tempg1
gr_g1_p4_eta[0] = eta_tempg1
gr_g1_p4_phi[0] = phi_tempg1
gr_g1_p4_mass[0] = mass_tempg1
gr_g2_p4_pt[0] = pt_tempg2
gr_g2_p4_eta[0] = eta_tempg2
gr_g2_p4_phi[0] = phi_tempg2
gr_g2_p4_mass[0] = mass_tempg2
else :
gr_g2_p4_pt[0] = pt_tempg1
gr_g2_p4_eta[0] = eta_tempg1
gr_g2_p4_phi[0] = phi_tempg1
gr_g2_p4_mass[0] = mass_tempg1
gr_g1_p4_pt[0] = pt_tempg2
gr_g1_p4_eta[0] = eta_tempg2
gr_g1_p4_phi[0] = phi_tempg2
gr_g1_p4_mass[0] = mass_tempg2
# Since we are dealing with LO, hbb + hgg is exactly 0
hgg = TLorentzVector()
hgg.SetPtEtaPhiM(gr_hgg_p4_pt[0], gr_hgg_p4_eta[0], gr_hgg_p4_phi[0], gr_hgg_p4_mass[0])
hbb = TLorentzVector()
hbb.SetPtEtaPhiM(gr_hbb_p4_pt[0], gr_hbb_p4_eta[0], gr_hbb_p4_phi[0], gr_hbb_p4_mass[0])
radion = hbb + hgg
# print type(radion), radion.Pt(), radion.M()
# print "real radion", gr_radion_p4_pt[0], gr_radion_p4_mass[0]
# print "hbb pt ", hbb.Pt(), " real hbb ", gr_hbb_p4_pt[0]
# print "hgg pt ", hgg.Pt(), " real hgg ", gr_hgg_p4_pt[0]
# print "hbb phi ", hbb.Phi(), " real hbb ", gr_hbb_p4_phi[0]
# print "hgg phi ", hgg.Phi(), " real hgg ", gr_hgg_p4_phi[0]
## gr_radion_p4_pt[0] = radion.Pt(
## gr_radion_p4_eta[0] = radion.Eta()
## gr_radion_p4_phi[0] = radion.Phi()
## gr_radion_p4_mass[0] = radion.M()
outtree.Fill()
# write the tree into the output file and close the file
outfile.Write()
outfile.Close()