ATLAS Offline Software
runHistoBuilders.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
2 
3 
4 # External dependencies
5 import ROOT
6 import sys
7 import re
8 import math
9 ROOT.gSystem.Load("libGenVector.so")
10 
11 
12 # Control switch
13 IsDebug = False
14 
15 
16 
17 
20 
21 treeNameJETMET = "qcd"
22 treeNameCOMMON = "physics"
23 writeBranchInformation = False
24 
25 if IsDebug:
26  fileNameJETMET="/afs/cern.ch/user/d/delsart/public/COMMON/NTUP_COMMON_ref.root"
27  treeNameJETMET="physics"
28  fileNameCOMMON="/afs/cern.ch/user/d/delsart/public/COMMON/NTUP_COMMON_new.root"
29 else:
30  if len(sys.argv) < 3:
31  print ("Too few arguments. Expected the following:")
32  print ("1. JETMET file (required)")
33  print ("2. COMMON file (required)")
34  print ("3. JETMET tree name (optional, default=\"qcd\")")
35  print ("4. COMMON tree name (optional, default=\"physics\")")
36  print ("5. Whether or not to write branch information to files (optional, default=False)")
37  exit(1)
38 
39  fileNameJETMET=sys.argv[1]
40  fileNameCOMMON=sys.argv[2]
41  if len(sys.argv) > 3:
42  treeNameJETMET = sys.argv[3]
43  if len(sys.argv) > 4:
44  treeNameCOMMON = sys.argv[4]
45  if len(sys.argv) > 5:
46  if "True" in sys.argv[5] or "true" in sys.argv[5]:
47  writeBranchInformation = True
48  elif "False" in sys.argv[5] or "false" in sys.argv[5]:
49  writeBranchInformation = False
50  else:
51  print ("Could not interpret the branch information control argument: ",sys.argv[5])
52  exit(2)
53 
54 
55 
58 
59 #fileNameJETMET="/afs/cern.ch/atlas/groups/JetEtmiss/COMMON_validation/JETMET/mc12_8TeV.147914.Pythia8_AU2CT10_jetjet_JZ4W.merge.JETMET.e1126_s1469_s1470_r3542_r3549_r17_2_7_5_3.000212.root"
60 #fileNameCOMMON="/afs/cern.ch/atlas/groups/JetEtmiss/COMMON_validation/COMMON/test162_mc12.aod.100evt.physics.12_04_2013.root"
61 #fileNameJETMET="/afs/cern.ch/user/t/toshi/public/NTUP_COMMON/test182_mc12.aod.100evt.qcd.root"
62 #fileNameJETMET="/afs/cern.ch/user/d/delsart/public/COMMON/NTUP_COMMON_ref.root"
63 
64 #fileNameCOMMON="/afs/cern.ch/atlas/groups/JetEtmiss/COMMON_validation/COMMON/latesttest_mc12.aod.100evt.physics.root "
65 #fileNameCOMMON="/afs/cern.ch/user/t/toshi/public/NTUP_COMMON/test173_mc12.aod.100evt.physics.root"
66 #fileNameCOMMON="/afs/cern.ch/user/t/toshi/public/NTUP_COMMON/test182_mc12.aod.100evt.physics.root"
67 #fileNameCOMMON="/afs/cern.ch/user/d/delsart/public/COMMON/NTUP_COMMON_new.root"
68 
69 
70 fileJETMET = ROOT.TFile(fileNameJETMET,"READ")
71 fileCOMMON = ROOT.TFile(fileNameCOMMON,"READ")
72 
73 treeJETMET = fileJETMET.Get(treeNameJETMET)
74 if not isinstance(treeJETMET,ROOT.TTree) :
75  print ("JETMET file does not contain the specified tree. Is the tree name correct?")
76  print ("File: ",fileNameJETMET)
77  print ("Tree: ",treeNameJETMET)
78  exit(3)
79 
80 treeCOMMON = fileCOMMON.Get(treeNameCOMMON)
81 if not isinstance(treeJETMET,ROOT.TTree):
82  print ("COMMON file does not contain the specified tree. Is the tree name correct?")
83  print ("File: ",fileNameCOMMON)
84  print ("Tree: ",treeNameCOMMON)
85  exit(4)
86 
87 
88 
89 
90 
93 from JetValidation.D3PDHistoBuildLib import MultipleHistoBuilderFromD3PD,JetType,JetVar
94 
95 
96 
99 
100 branchesJETMET = treeJETMET.GetSetOfTreeBranchNames()
101 branchesCOMMON = treeCOMMON.GetSetOfTreeBranchNames()
102 branchesBOTH = frozenset.intersection(branchesJETMET,branchesCOMMON)
103 brNotInCOMMON = branchesJETMET-branchesCOMMON
104 brNotInJETMET = branchesCOMMON-branchesJETMET
105 
106 if writeBranchInformation:
107  outFile = open('Branches_JETMET.txt','w')
108  outFile.write(str(sorted(branchesJETMET)))
109  outFile.close()
110 
111  outFile = open('Branches_COMMON.txt','w')
112  outFile.write(str(sorted(branchesCOMMON)))
113  outFile.close()
114 
115  outFile = open('Branches_BOTH.txt','w')
116  outFile.write(str(sorted(branchesBOTH)))
117  outFile.close()
118 
119  outFile = open('Branches_NotIn_COMMON.txt','w')
120  outFile.write(str(sorted(brNotInCOMMON)))
121  outFile.close()
122 
123  outFile = open('Branches_NotIn_JETMET.txt','w')
124  outFile.write(str(sorted(brNotInJETMET)))
125  outFile.close()
126 
127  # Write out in twiki-syntax
128  outFile = open('Twiki_Branches_NotIn_COMMON.txt','w')
129  outFile.write('| *Branch name* | *Expected* | *Confirmed by* ||\n')
130  for aBranch in sorted(brNotInCOMMON):
131  outFile.write('| !%s | ? | ? ||\n'%(aBranch))
132  outFile.close()
133 
134 
135 
138 
139 if writeBranchInformation:
140  jetTypesJETMET = set([])
141  jetVarsJETMET = set([])
142  for name in branchesJETMET:
143  if "jet_" in name:
144  type = JetType(name)
145  if type is not None:
146  jetTypesJETMET.add(type)
147  jetVarsJETMET.add(JetVar(name))
148 
149  jetTypesCOMMON = set([])
150  jetVarsCOMMON = set([])
151  for name in branchesCOMMON:
152  if "jet_" in name:
153  type = JetType(name)
154  if type is not None:
155  jetTypesCOMMON.add(type)
156  jetVarsCOMMON.add(JetVar(name))
157 
158  jetTypesBoth = set.intersection(jetTypesJETMET,jetTypesCOMMON)
159  jetVarsBoth = set.intersection(jetVarsJETMET,jetVarsCOMMON)
160 
161  # For each jet type, ensure that every variable is included
162  branchesNotExisting = []
163  for aType in jetTypesBoth:
164  for aVar in jetVarsBoth:
165  toCheck = aType + "_" + aVar
166  if toCheck not in branchesBOTH:
167  branchesNotExisting.append(toCheck)
168 
169  outFile = open('Branches_JetTypes_NotExisting.txt','w')
170  outFile.write(str(sorted(branchesNotExisting)))
171  outFile.close()
172 
173 
174 
177 
178 multiBuilder = MultipleHistoBuilderFromD3PD()
179 multiBuilder.addTrees(treeJETMET,treeCOMMON)
180 multiBuilder.createBuildersFromTrees()
181 
182 
183 #multiBuilder.addHistosWithDefaultSelectors(["jet_AntiKt4LCTopo_constscale_pt"], "jet_AntiKt4LCTopo_pt")
184 #multiBuilder.addHistosWithDefaultSelectors(["jet_AntiKt4LCTopo_constscale_pt",100,0,1000e3], "jet_AntiKt4LCTopo_pt")
185 #for aBranch in multiBuilder.getBranchIntersection() :
186 # if "jet_AntiKt4LC" in aBranch :
187 # multiBuilder.addHistosWithDefaultSelectors(aBranch)
188 # multiBuilder.addHistosWithHighPtDetscaleSelectors(aBranch)
189 
190 #multiBuilder.addAllHistosInBranchIntersection()
191 #multiBuilder.addAllLeadingJetHistosInBranchIntersection()
192 #multiBuilder.addHistosWithDefaultSelectors(*multiBuilder.getBranchIntersection())
193 #multiBuilder.addHistosWithHighPtDetscaleSelectors(*multiBuilder.getBranchIntersection())
194 
195 for aBranch in multiBuilder.getBranchIntersection() :
196 #for aBranch in ["jet_AntiKt4LCTopo_emscale_pt","jet_AntiKt4LCTopo_eta"] :
197  if "EventNumber" in aBranch:
198  multiBuilder.addHistos(aBranch)
199  if "jet_AntiKt4" in aBranch and ("LC" in aBranch or "EM" in aBranch) :
200  multiBuilder.addHistosWithLeadingJetSelectors(JetType(aBranch), aBranch)
201 
202 print ("\nRunning event loop...")
203 multiBuilder.eventLoop()
204 print ("Done event loop!")
205 
206 #multiBuilder.draw(0)
207 #multiBuilder.canvas.Print("test.pdf")
208 twikiLog = open('Twiki_ToleranceResults.log','w')
209 twikiLog.write('| *Variable* | *Passes tolerance* | *Num failed/total bins* | *Largest difference (%)* ||\n')
210 multiBuilder.writeAllHistoToFile("test.pdf",logFile="failsTolerance.log",twikiLogFile=twikiLog)
211 twikiLog.close()
212 
213 multiBuilder.close()
214 fileJETMET.Close()
215 fileCOMMON.Close()
216 
217 
218 
219 
DerivationFramework::TriggerMatchingUtils::sorted
std::vector< typename R::value_type > sorted(const R &r, PROJ proj={})
Helper function to create a sorted vector from an unsorted range.
JetVar
Definition: JetSelectorAttribute.h:15
calibdata.exit
exit
Definition: calibdata.py:235
CxxUtils::set
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition: bitmask.h:232
Trk::open
@ open
Definition: BinningType.h:40
str
Definition: BTagTrackIpAccessor.cxx:11