|
[Rivet-svn] r2379 - trunk/binblackhole at projects.hepforge.org blackhole at projects.hepforge.orgSun Apr 4 11:33:30 BST 2010
Author: buckley Date: Sun Apr 4 11:33:29 2010 New Revision: 2379 Log: Adding tolerance function for bin-edge float comparisons Modified: trunk/bin/make-plots Modified: trunk/bin/make-plots ============================================================================== --- trunk/bin/make-plots Sat Apr 3 21:26:55 2010 (r2378) +++ trunk/bin/make-plots Sun Apr 4 11:33:29 2010 (r2379) @@ -23,6 +23,14 @@ pat_property = re.compile('^(\w+?)=(.*)$') pat_path_property = re.compile('^(\S+?)::(\w+?)=(.*)$') + +def fuzzyeq(a, b, tolerance=1e-6): + "Fuzzy equality comparison function for floats, with given fractional tolerance" + if a == 0 and b == 0: + return True + return 2.0*abs(a-b)/abs(a+b) < tolerance + + def is_end_marker(line, blockname): m = pat_end_block.match(line) return m and m.group(1) == blockname @@ -974,8 +982,8 @@ if len(self.data)!=len(name.data): print '+++ Error in Histogram.add(): Binning of histograms differs' for i in range(len(self.data)): - if self.data[i]['LowEdge']==name.data[i]['LowEdge'] and \ - self.data[i]['UpEdge']==name.data[i]['UpEdge']: + if fuzzyeq(self.data[i]['LowEdge'], name.data[i]['LowEdge']) and \ + fuzzyeq(self.data[i]['UpEdge'], name.data[i]['UpEdge']): self.data[i]['Content'] += name.data[i]['Content'] self.data[i]['Error'][0] = sqrt(self.data[i]['Error'][0]**2 + name.data[i]['Error'][0]**2) self.data[i]['Error'][1] = sqrt(self.data[i]['Error'][1]**2 + name.data[i]['Error'][1]**2) @@ -986,8 +994,8 @@ if len(self.data)!=len(name.data): print '+++ Error in Histogram.divide(): Binning of histograms differs' for i in range(len(self.data)): - if self.data[i]['LowEdge']==name.data[i]['LowEdge'] and \ - self.data[i]['UpEdge']==name.data[i]['UpEdge']: + if fuzzyeq(self.data[i]['LowEdge'], name.data[i]['LowEdge']) and \ + fuzzyeq(self.data[i]['UpEdge'], name.data[i]['UpEdge']): try: self.data[i]['Error'][0] /= name.data[i]['Content'] except ZeroDivisionError: @@ -1009,8 +1017,8 @@ if len(self.data)!=len(name.data): print '+++ Error in Histogram.deviation(): Binning of histograms differs' for i in range(len(self.data)): - if self.data[i]['LowEdge']==name.data[i]['LowEdge'] and \ - self.data[i]['UpEdge']==name.data[i]['UpEdge']: + if fuzzyeq(self.data[i]['LowEdge'], name.data[i]['LowEdge']) and \ + fuzzyeq(self.data[i]['UpEdge'], name.data[i]['UpEdge']): self.data[i]['Content'] -= name.data[i]['Content'] try: self.data[i]['Content'] /= 0.5*(name.data[i]['Error'][0] + name.data[i]['Error'][1])
More information about the Rivet-svn mailing list |