ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/VHbb/python/addingSamples.py
Revision: 1.6
Committed: Tue Mar 5 12:48:33 2013 UTC (12 years, 2 months ago) by nmohr
Content type: text/x-python
Branch: MAIN
Changes since 1.5: +10 -7 lines
Log Message:
Fix validation

File Contents

# Content
1 #!/usr/bin/env python
2
3 import sys,hashlib,ROOT
4 ROOT.gROOT.SetBatch(True)
5 from array import array
6 from optparse import OptionParser
7
8 def getTotal( bin, fileList ):
9 total = 0.
10 for i in range(0,len(fileList)):
11 total = total + fileList[i][2][bin]
12 return total
13
14
15 argv = sys.argv
16 parser = OptionParser()
17
18 parser.add_option("-C", "--config", dest="config", default=[], action="append",
19 help="configuration defining bins")
20 parser.add_option("-A", "--apply", dest="apply", default=False, action="store_true",
21 help="configuration defining the")
22 parser.add_option("-W", "--weight", dest="weights", default=True, action="store_false",
23 help="Calculate the weights")
24 parser.add_option("-V", "--validate", dest="validate", default=True, action="store_false",
25 help="Make validation plot the weights")
26 (opts, args) = parser.parse_args(argv)
27 if opts.config =="":
28 opts.config = "config"
29
30 from myutils import BetterConfigParser
31
32 print opts.config
33 config = BetterConfigParser()
34 config.read(opts.config)
35 prefix = config.get('LHEWeights','prefix')
36 newpostfix = config.get('LHEWeights','newpostfix')
37 inclusive = config.get('LHEWeights','inclusive')
38 files = eval(config.get('LHEWeights','fileList'))
39 lheBin = eval(config.get('LHEWeights','lheBin'))
40 fileList = []
41 for file in files:
42 new_entry = [prefix+file+'.root',files[file],[]]
43 if file == inclusive:
44 fileList.insert(0, new_entry)
45 else:
46 fileList.append(new_entry)
47 print fileList
48 print lheBin
49
50 def get_weights(fileList,lheBin):
51 for file in fileList:
52 #file.append( 1 )
53 #continue
54 print file
55 infile = ROOT.TFile.Open(file[0],"READ")
56 tree = infile.Get('tree')
57 for bin in lheBin:
58 file[2].append( float(tree.GetEntries(bin)) )
59 count = infile.Get('CountWithPU')
60 file.append( count.GetBinContent(1) )
61 infile.Close()
62 del tree
63
64 CountIncl = fileList[0][3]
65 print fileList
66
67 #total -> total numer of events in each lheBin
68 print 'Calculating total'
69 total = []
70 weight= []
71 for bin in range(0, len(lheBin) ):
72 #weight.append(1.)
73 #continue
74 total.append(getTotal(bin, fileList))
75 #print lheBin[bin]
76 #to better stich we need the highest stat (that should correspond to the binned sample relative to the bin)
77 fileList.sort( key=lambda file: file[2][bin], reverse=True )
78 #print 'After sorting'
79 #print fileList
80 if total[bin] > 0.:
81 #the first is always the one with the highest N in the bin:
82 weight.append( (fileList[0][1]/fileList[0][3]) * (CountIncl/2950.0) * fileList[0][2][bin]/total[bin] )
83 else:
84 weight.append(1.)
85
86 weight_map = {}
87 for bin in range(0, len(lheBin) ):
88 print '%s: %.2f' %(lheBin[bin], weight[bin])
89 weight_map[lheBin[bin]] = weight[bin]
90 return weight_map
91
92
93 def apply_weights(fileList,weight_map,inclusive,newpostfix):
94 #now add the branch with the weight normalized to the inclusive
95 for file in fileList:
96 outfile = ROOT.TFile.Open(file[0].replace('.root',newpostfix),'RECREATE')
97 infile = ROOT.TFile.Open(file[0],"READ")
98 histoInfile = ROOT.TFile.Open(inclusive,"READ")
99 histoInfile.cd()
100 obj = ROOT.TObject
101 for key in ROOT.gDirectory.GetListOfKeys():
102 histoInfile.cd()
103 obj = key.ReadObj()
104 #print obj.GetName()
105 if obj.GetName() == 'tree':
106 continue
107 outfile.cd()
108 #print key.GetName()
109 obj.Write(key.GetName())
110
111 infile.cd()
112 tree = infile.Get('tree')
113 outfile.cd()
114 newtree = tree.CloneTree(0)
115 lheWeight = array('f',[0])
116 newtree.Branch('lheWeight',lheWeight,'lheWeight/F')
117
118 nEntries = tree.GetEntries()
119 theBinForms = {}
120 for bin in weight_map:
121 theBinForms[bin] = ROOT.TTreeFormula("Bin_formula_%s"%(bin),bin,tree)
122 for entry in range(0,nEntries):
123 tree.GetEntry(entry)
124 match_bin = None
125 for bin in weight_map:
126 if theBinForms[bin].EvalInstance() > 0.:
127 match_bin = bin
128 if match_bin:
129 lheWeight[0] = weight_map[match_bin]
130 else:
131 lheWeight[0] = 1.
132 newtree.Fill()
133
134 newtree.AutoSave()
135 outfile.Write()
136 outfile.Close()
137 infile.Close()
138 del tree
139 del newtree
140
141 def do_validation(fileList,inclusive,newpostfix):
142 histo = ROOT.TH1F("lheV_pt","lheV_pt",300,0,300)
143 histo1 = ROOT.TH1F("lheV_ptInc","lheV_ptInc",300,0,300)
144 histo.SetDirectory(0)
145 histo1.SetDirectory(0)
146
147 for file in fileList:
148 h_name=str(hashlib.sha224(file[0]).hexdigest())
149 print file[0]
150 print h_name
151 tfile = ROOT.TFile.Open(file[0].replace('.root',newpostfix),"read")
152 tree = tfile.Get("tree")
153 h_tmp = ROOT.TH1F(h_name,h_name,300,0,300)
154 #ROOT.gDirectory.ls()
155 tree.Draw("lheV_pt>>"+str(h_name),"(lheWeight)*(lheV_pt < 300.)","goff")
156 if inclusive in file[0]:
157 h_tmp1 = ROOT.TH1F(h_name+'Inc',h_name+'Inc',300,0,300)
158 tree.Draw("lheV_pt>>"+str(h_name+'Inc'),"(lheV_pt < 300.)","goff")
159 histo1.Add(h_tmp1)
160 histo.Add(h_tmp)
161 tfile.Close()
162 del tree
163
164
165 canvas = ROOT.TCanvas("lheV_pt","lheV_pt",600,600)
166 ROOT.gPad.SetLogy()
167 histo.Draw()
168 histo1.Draw('SAME')
169 print histo.Integral(100,300)
170 print histo1.Integral(100,300)
171 histo1.SetLineColor(ROOT.kRed)
172 canvas.Print("validation_lheV_pt.pdf","pdf")
173
174 if opts.weights:
175 weight_map = get_weights(fileList,lheBin)
176 config.set('LHEWeights', 'weights_per_bin', '%s' %weight_map)
177 f = open('8TeVconfig/lhe_weights', 'w')
178 config.write(f)
179 f.close()
180 elif opts.apply:
181 weight_map = config.get('LHEWeights', 'weights_per_bin')
182 if opts.apply:
183 apply_weights(fileList,weight_map,prefix+inclusive,newpostfix)
184 if opts.validate:
185 do_validation(fileList,inclusive,newpostfix)