11 if evt.contains(typ, key):
12 return evt.retrieve(typ, key)
13 print(f
'WARNING: Cannot find object {typ}/{key}')
20 for i
in range(0, evt.getEntries()):
21 if (counter
and (i % 100) == 0):
22 print(
"Processing event %s" % i)
25 ei = evt.retrieve(
"xAOD::EventInfo",
"EventInfo")
26 runnbr = ei.runNumber()
27 evtnbr = ei.eventNumber()
30 evt,
"xAOD::CaloClusterContainer",
"CaloCalTopoClusters")
34 "xAOD::TrackParticleContainer",
"InDetTrackParticles")
35 nIdTracks = len(idTracks)
37 tautracks =
safeRetrieve(evt,
"xAOD::TauTrackContainer",
"TauTracks")
38 nTauTracks = len(tautracks)
39 taus =
safeRetrieve(evt,
"xAOD::TauJetContainer",
"TauJets")
43 tau1eta = taus[0].eta()
44 tau1phi = taus[0].phi()
46 tau1pt = tau1eta = tau1phi = 0
48 muons =
safeRetrieve(evt,
"xAOD::MuonContainer",
"Muons")
51 muon1pt = muons[0].
pt()
52 muon1eta = muons[0].eta()
53 muon1phi = muons[0].phi()
55 muon1pt = muon1eta = muon1phi = 0
57 electrons =
safeRetrieve(evt,
"xAOD::ElectronContainer",
"Electrons")
58 nElec = len(electrons)
60 elec1pt = electrons[0].
pt()
61 elec1eta = electrons[0].eta()
62 elec1phi = electrons[0].phi()
64 elec1pt = elec1eta = elec1phi = 0
66 photons =
safeRetrieve(evt,
"xAOD::PhotonContainer",
"Photons")
69 phot1pt = photons[0].
pt()
70 phot1eta = photons[0].eta()
71 phot1phi = photons[0].phi()
73 phot1pt = phot1eta = phot1phi = 0
76 jets =
safeRetrieve(evt,
"xAOD::JetContainer",
"AntiKt4EMPFlowJets")
80 jet1eta = jets[0].eta()
81 jet1phi = jets[0].phi()
83 jet1pt = jet1eta = jet1phi = 0
85 met =
safeRetrieve(evt,
"xAOD::MissingETContainer",
"MET_Reference_AntiKt4EMPFlow")
88 metx = met[nmet-1].mpx()
89 mety = met[nmet-1].mpy()
90 sumet = met[nmet-1].sumet()
92 metx = mety = sumet = 0
96 acc = ROOT.SG.ConstAccessor(
97 'ElementLink< xAOD::TruthParticleContainer>')(
'truthParticleLink')
99 if nElec > 0
and acc.isAvailable(electrons.at(0)):
100 for i
in range(nElec):
101 truthLink =
acc(electrons.at(i))
102 if(truthLink.isValid()):
103 pdgId = truthLink.pdgId()
107 if nPhot > 0
and acc.isAvailable(photons.at(0)):
108 for i
in range(nPhot):
109 truthLink =
acc(photons.at(i))
110 if(truthLink.isValid()):
111 pdgId = truthLink.pdgId()
115 nFakeElectrons = nElec - nTrueElectrons
116 nFakePhotons = nPhot - nTruePhotons
119 result.append((runnbr, evtnbr, nclus, nIdTracks,
120 nTauTracks, nTaus, tau1pt, tau1eta, tau1phi,
121 nMuons, muon1pt, muon1eta, muon1phi,
122 nElec, elec1pt, elec1eta, elec1phi, nTrueElectrons, nFakeElectrons,
123 nPhot, phot1pt, phot1eta, phot1phi ,nTruePhotons, nFakePhotons,
124 nJet, jet1pt, jet1eta, jet1phi, nmet, metx, mety, sumet))
126 result.append((runnbr, evtnbr, nclus, nIdTracks, nTauTracks, nTaus, nMuons,
127 nElec, nTrueElectrons, nFakeElectrons,
128 nPhot, nTruePhotons, nFakePhotons))
133 result.sort(key=
lambda er: er[0] << 32 | er[1])
138 parser = argparse.ArgumentParser(
139 description=
"Extracts a few basic quantities from the xAOD file and dumps them into a text file")
140 parser.add_argument(
"xAODFile", nargs=
'?', type=str,
141 help=
"xAOD filename", action=
"store")
142 parser.add_argument(
"outfilename", nargs=
'?',
143 help=
"output text file for results", action=
"store", default=
None)
145 "--outputfilename", help=
"output text file for results", action=
"store", default=
None)
146 parser.add_argument(
"--extravars", help=
"Extract extra variables: pt/eta/phi",
147 action=
"store_true", default=
False)
148 parser.add_argument(
"--counter", help=
"Print event counter mod 100",
149 action=
"store_true", default=
False)
150 parser.add_argument(
"--inputlist", help=
"Optional list of xAOD file instead of xAODFile parameter",
151 nargs=
'+', action=
"store", default=
False)
152 parser.add_argument(
"--inputisESD", help=
"Set if input is ESD",
153 action=
"store_true", default=
False)
155 args = parser.parse_args()
157 if len(sys.argv) < 2:
162 if not args.inputlist
and not os.access(args.xAODFile, os.R_OK):
163 print(
"ERROR, can't access file {}".
format(args.xAODFile))
169 outfilename = args.outfilename
170 elif args.outputfilename:
171 outfilename = args.outputfilename
174 print(
"Writing to file ", outfilename)
178 filelist = ROOT.TChain()
179 for filename
in args.inputlist:
180 filelist.AddFile(filename)
182 filelist = args.xAODFile
185 evt = ROOT.POOL.TEvent(
186 ROOT.POOL.TEvent.kPOOLAccess
if args.inputisESD
else ROOT.POOL.TEvent.kClassAccess)
187 stat = evt.readFrom(filelist)
189 print(
"ERROR, failed to open file {} with POOL.TEvent".
format(
194 digest =
xAODDigest(evt, args.counter, args.extravars)
197 outstr =
open(outfilename,
"w")
202 header = (
"run",
"event",
"nTopo",
"nIdTracks",
203 "nTauTracks",
"nTaus",
"tau1pt",
"tau1eta",
"tau1phi",
204 "nMuons",
"muon1pt",
"muon1eta",
"muon1phi",
205 "nElec",
"elec1pt",
"elec1eta",
"elec1phi",
"nTrueElec",
"nFakeElec",
206 "nPhot",
"phot1pt",
"phot1eta",
"phot1phi",
"nTruePhot",
"nFakePhot",
207 "nJet",
"jet1pt",
"jet1eta",
"jet1phi",
"nmet",
"metx",
"mety",
"sumet" )
208 row_format_header =
"{:>20}" * len(header)
209 row_format_header += os.linesep
210 row_format_data =
"{:d} {:d} " +
"{:20.4f}" * (len(header)-2)
211 row_format_data += os.linesep
213 header = (
"run",
"event",
"nTopo",
"nIdTracks",
"nTauTracks",
"nTaus",
"nMuons",
214 "nElec",
"nTrueElec",
"nFakeElec",
215 "nPhot",
"nTruePhot",
"nFakePhot")
216 row_format_header =
"{:>12}" * len(header)
217 row_format_header += os.linesep
218 row_format_data =
"{:>12}" * len(header)
219 row_format_data += os.linesep
221 outstr.write(row_format_header.format(*header))
223 outstr.write(row_format_data.format(*evt))
231 if __name__ ==
"__main__":