Browse Source

Adds hist_sub, hist_mul, and hist_div

Caleb Fangmeier 6 years ago
parent
commit
9275e55ed3
1 changed files with 31 additions and 0 deletions
  1. 31 0
      filval/histogram.py

+ 31 - 0
filval/histogram.py

@@ -53,6 +53,37 @@ def hist_add(*hs):
     return np.sum(vals, axis=0), np.sqrt(np.sum([err*err for err in errs], axis=0)), edges[0]
 
 
+def hist_sub(*hs):
+    if len(hs) == 0:
+        return np.zeros(0)
+    h0, hs = hs
+    hs = hist_add(hs)
+    hs = -hs[0], *hs[1:]
+    return hist_add(h0, hs)
+
+
+def hist_mul(h1, h2, cov=None):
+    h1_vals, h1_errs, num_edges = h1
+    h2_vals, h2_errs, _ = h2
+    prod_vals = h1_vals * h2_vals
+    prod_errs2 = (h1_errs/h1_vals)**2 + (h2_errs/h2_vals)**2
+    if cov:
+        prod_errs2 += 2*cov/(h1_vals*h2_vals)
+    prod_errs = abs(h1_vals*h2_vals)*np.sqrt(prod_errs2)
+    return prod_vals, prod_errs, num_edges
+
+
+def hist_div(num, den, cov=None):
+    num_vals, num_errs, num_edges = num
+    den_vals, den_errs, _ = den
+    rat_vals = num_vals / den_vals
+    rat_errs2 = (num_errs/num_vals)**2 + (den_errs/den_vals)**2
+    if cov:
+        rat_errs2 -= 2*cov/(num_vals*den_vals)
+    rat_errs = abs(num_vals/den_vals)*np.sqrt(rat_errs2)
+    return rat_vals, rat_errs, num_edges
+
+
 def hist_integral(h, times_bin_width=True):
     values, errors, edges = h
     if times_bin_width: