def get_histograms_from_file(file_input, group_name='HIST'): histo_manager = HistoManager() def name_selection(x): selection = (('bins' not in x) and ('labels' not in x) and ('errors' not in x) and ('outRange' not in x) and ('scales' not in x)) return selection with tb.open_file(file_input, "r") as h5in: histogram_list = [] group = getattr(h5in.root, group_name) for histoname in filter(name_selection, group._v_children): entries = np.array(getattr(group, histoname)[:]) bins = getattr(group, histoname + '_bins')[:] out_range = getattr(group, histoname + '_outRange')[:] errors = np.array(getattr(group, histoname + '_errors')[:]) labels = getattr(group, histoname + '_labels')[:] labels = [str(lab)[2:-1].replace('\\\\', '\\') for lab in labels] try: scale = getattr(group, histoname + '_scales')[:] scale = [str(scl)[2:-1].replace('\\\\', '\\') for scl in scale] except tb.NoSuchNodeError: scale = ["linear"] histogram = Histogram(histoname, bins, labels, scale) histogram.data = entries histogram.out_range = out_range histogram.errors = errors histogram.scale = scale histogram_list.append(histogram) return HistoManager(histogram_list)
def test_join_histo_managers(histogram_list): args, list_of_histograms = histogram_list histogram_manager = HistoManager(list_of_histograms) joined_histogram_manager = histf.join_histo_managers( histogram_manager, histogram_manager) assert len(list_of_histograms) == len(joined_histogram_manager.histos) for histoname, histogram in joined_histogram_manager.histos.items(): histo1 = histogram_manager[histoname] true_histogram = Histogram(histoname, histo1.bins, histo1.labels, histo1.scale) true_histogram.data = 2 * histo1.data true_histogram.errors = np.sqrt(2) * histo1.errors true_histogram.out_range = 2 * histo1.out_range assert_histogram_equality(histogram, true_histogram)
def test_join_histo_managers_with_different_histograms(histogram_list1, histogram_list2): _, list_of_histograms1 = histogram_list1 _, list_of_histograms2 = histogram_list2 histogram_manager1 = HistoManager(list_of_histograms1) histogram_manager2 = HistoManager(list_of_histograms2) joined_histogram_manager = histf.join_histo_managers( histogram_manager1, histogram_manager2) unique_histograms = set(histogram_manager1.histos) | set( histogram_manager2.histos) common_histograms = set(histogram_manager1.histos) & set( histogram_manager2.histos) remove_names = [] for name in unique_histograms: if name in common_histograms: if not np.all(a == b for a, b in zip(histogram_manager1[name].bins, histogram_manager2[name].bins)): remove_names.append(name) list_of_names = unique_histograms - set(remove_names) for histoname, histogram in joined_histogram_manager.histos.items(): assert histoname in list_of_names if (histoname in histogram_manager1.histos) and ( histoname in histogram_manager2.histos): histo1 = histogram_manager1[histoname] histo2 = histogram_manager2[histoname] true_histogram = Histogram(histoname, histo1.bins, histo1.labels, histo1.scale) true_histogram.data = histo1.data + histo2.data true_histogram.errors = np.sqrt(histo1.errors**2 + histo2.errors**2) true_histogram.out_range = histo1.out_range + histo2.out_range assert_histogram_equality(histogram, true_histogram) elif histoname in histogram_manager1.histos: histo1 = histogram_manager1[histoname] assert_histogram_equality(histogram, histo1) elif histoname in histogram_manager2.histos: histo2 = histogram_manager2[histoname] assert_histogram_equality(histogram, histo2)