-
Notifications
You must be signed in to change notification settings - Fork 18
/
diffhisto.py
153 lines (120 loc) · 4.28 KB
/
diffhisto.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
# !/usr/bin/env python
import optparse
import re
#-------------------------------------------------------------------------------
def getTypeLength(cmpfile):
# read header, determine type length in bits
typelength = 0
typelength_s =""
cmpfile.readline()
tmp = cmpfile.readline()
if tmp[0] == "D":
typelength = 64
typelength_s = "double"
else:
typelength = 32
typelength_s = "float"
return typelength,typelength_s
#-------------------------------------------------------------------------------
def getYaxisRange(name):
lr = -5000
hr = 5000
if "Asin" in name or "Acos" in name:
lr = -1
hr = 1
if "Log" in name or "Isqrt" in name:
lr = 0
if "Exp" in name:
lr = -705
hr = 705
if "Expf" in name:
lr = -85
hr = 85
return (lr,hr)
#-------------------------------------------------------------------------------
def getFilenamesFromDir(nick,dirname):
import os
return filter (lambda filename: re.match("comparison__%s__(.*).txt"%nick,filename), os.listdir(dirname))
#-------------------------------------------------------------------------------
def fill_histos(cmpfile,histo1D,histo2D):
#read lines and process them
while 1:
line = cmpfile.readline()
if line == "":
break
m=re.match("(.*) (.*) (.*) (.*) (.*)",line)
inputval=float(m.group(5))
db=int(m.group(4))
# fill histograms
histo1D.Fill(db)
histo2D.Fill(inputval,db)
#-------------------------------------------------------------------------------
def compare(nick,dirname):
import ROOT
# Some globals for the style
ROOT.gROOT.SetStyle("Plain")
ROOT.gROOT.SetBatch()
ROOT.gStyle.SetPalette(1)
# Do it for all function variants
ofile = ROOT.TFile("%s_histos.root" %nick,"RECREATE")
ofile.cd()
filenames = getFilenamesFromDir(nick,dirname)
print "%s files found." %len(filenames)
for filename in filenames:
print "Studying " + filename
cmpfile = open(filename)
typelength,typelength_s = getTypeLength(cmpfile)
m=re.match("comparison__%s__(.*).txt"%nick,filename)
fcn_name=m.group(1)
# read rest of header
for i in range(1,5):
cmpfile.readline()
# xaxis range
xmin,xmax=(-0.5,typelength+0.5)
xNbins=typelength+1
# set up Root 1D histo
dbhisto = ROOT.TH1F("Diffbit_"+fcn_name,
fcn_name+" diffbit for "+nick+";Diffbit;#",
xNbins,
xmin,xmax)
dbhisto.SetLineColor(ROOT.kBlue)
dbhisto.SetLineWidth(2)
dbhisto.GetYaxis().SetTitleOffset(1)
# setup diffbit VS input histogram
ymin,ymax=getYaxisRange(fcn_name)
dbVSinhisto = ROOT.TH2F("DiffVsInput_"+fcn_name,
fcn_name+" diffbit vs input for "+nick+";Input;Diffbit",
100,ymin,ymax,
xNbins,xmin,xmax)
fill_histos(cmpfile,dbhisto,dbVSinhisto)
# draw and save 1D histogram
dbcanvas = ROOT.TCanvas("dbcanv_%s"%fcn_name, "%s diffbit for %s canvas" %(fcn_name,nick),600,600)
dbcanvas.cd()
dbcanvas.SetLogy()
dbhisto.Draw()
dbcanvas.Print("%s_%s_%s_dbhisto.png"%(nick,typelength_s,fcn_name))
dbhisto.Write()
# draw and save 2D histogram
dbVSincanvas = ROOT.TCanvas("dbVSincanv_%s"%fcn_name, "%s diffbit for %s canvas" %(fcn_name,nick),600,600)
dbVSincanvas.cd()
dbVSinhisto.Draw("COLZ")
dbVSincanvas.Print("%s_%s_%s_dbVSinhisto.png"%(nick,typelength_s,fcn_name))
dbVSinhisto.Write()
ofile.Close()
#-------------------------------------------------------------------------------
def create_parser():
import sys
# set up cmd options
cmdParser = optparse.OptionParser(usage="%prog -n=<nick>")
cmdParser.add_option("-n","--nick",dest="nick",help="Determines which comparison files should be used.",default="")
cmdParser.add_option("-d","--dir",dest="dirname",help="Directory to be looked at.",default="./")
#parse options and retrieve needed parameters
(options,args) = cmdParser.parse_args()
if(options.nick == ""):
cmdParser.print_help()
sys.exit(1)
return options
#-------------------------------------------------------------------------------
if __name__ == "__main__":
options = create_parser()
compare(options.nick,options.dirname)