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_new_histogram_in_histomanager(test_histogram): _, histogram = test_histogram histoname = histogram.title histogram_manager = HistoManager() histogram_manager.new_histogram(histogram) assert_histogram_equality(histogram, histogram_manager[histoname])
def create_histomanager_from_dicts(histobins_dict, histolabels_dict, histoscales_dict, init_fill_dict=None): """Creates and returns a HistoManager from a dict of bins and a given of labels with identical keys. Parameters ---------- histobins_dict : dict Dictionary with keys equal to histogram names and values equal to the binning. histolabels_dict : dict Dictionary with keys equal to histogram names and values equal to the axis labels. histoscales_dict : dict Dictionary with keys equal to histogram names and values equal to the y axis scale. init_fill_dict : dict, optional Dictionary with keys equal to histogram names and values equal to an initial filling. """ histo_manager = HistoManager() if init_fill_dict is None: init_fill_dict = dict() for title, bins in histobins_dict.items(): histo_manager.new_histogram(Histogram(title, bins, histolabels_dict [title], histoscales_dict [title], init_fill_dict.get(title, None))) return histo_manager
def test_setitem_histomanager(histogram_list): args, list_of_histograms = histogram_list titles, histobins, *_ = zip(*args) histogram_manager1 = HistoManager() histogram_manager2 = HistoManager() for histogram in list_of_histograms: histoname = histogram.title histogram_manager1.histos[histoname] = histogram histogram_manager2[histoname] = histogram assert_histogram_equality(histogram_manager1[histoname], histogram_manager2[histoname])
def test_histomanager_initialization_with_histograms(histogram_list): _, list_of_histograms = histogram_list histogram_manager = HistoManager(list_of_histograms) for histogram in list_of_histograms: assert_histogram_equality(histogram, histogram_manager[histogram.title])
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)
def test_save_histomanager_to_file_append_mode(output_tmpdir, histogram_list, group): assume(not iskeyword(group)) args, list_of_histograms = histogram_list histogram_manager = HistoManager(list_of_histograms[:1]) file_out = os.path.join(output_tmpdir, 'test_save_histogram_manager.h5') save_histomanager_to_file(histogram_manager, file_out, mode='w', group=group) histogram_manager = HistoManager(list_of_histograms[1:]) save_histomanager_to_file(histogram_manager, file_out, mode='a', group=group) with tb.open_file(file_out, "r") as h5in: file_group = getattr(h5in.root, group) for histogram in list_of_histograms: histoname = histogram.title saved_labels = [ str(label)[2:-1].replace('\\\\', '\\') for label in getattr(file_group, histoname + "_labels")[:] ] saved_scales = [ str(label)[2:-1].replace('\\\\', '\\') for label in getattr(file_group, histoname + "_scales")[:] ] assert histoname in file_group assert len(histogram.bins) == len( getattr(file_group, histoname + "_bins")[:]) assert np.all( a == b for a, b in zip(histogram.bins, getattr(file_group, histoname + "_bins")[:])) assert np.allclose(histogram.data, getattr(file_group, histoname)[:]) assert np.allclose(histogram.errors, getattr(file_group, histoname + "_errors")[:]) assert np.allclose(histogram.out_range, getattr(file_group, histoname + "_outRange")[:]) assert histogram.labels == saved_labels assert histogram.scale == saved_scales
def join_histo_managers(histo_manager1, histo_manager2): """Joins two HistoManager. If they share histograms, the histograms are sumed. Parameters ---------- histo_manager1, histo_manager2 : HistoManager objects to be joined. """ new_histogram_manager = HistoManager() list_of_histograms = set(histo_manager1.histos) | set(histo_manager2.histos) for histoname in list_of_histograms: histo1 = histo_manager1.histos.get(histoname, None) histo2 = histo_manager2.histos.get(histoname, None) try: new_histogram_manager.new_histogram(histo1 + histo2) except ValueError: print(f"Histograms with name {histoname} have not been added due to" " incompatible binning.") return new_histogram_manager
def test_join_histograms_from_file(output_tmpdir, 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) file_out1 = os.path.join(output_tmpdir, 'test_save_histogram_manager_1.h5') file_out2 = os.path.join(output_tmpdir, 'test_save_histogram_manager_2.h5') save_histomanager_to_file(histogram_manager1, file_out1) save_histomanager_to_file(histogram_manager2, file_out2) joined_histogram_manager1 = histf.join_histograms_from_files( [file_out1, file_out2]) joined_histogram_manager2 = histf.join_histo_managers( histogram_manager1, histogram_manager2) assert len(joined_histogram_manager1.histos) == len( joined_histogram_manager2.histos) for histoname in joined_histogram_manager1.histos: assert_histogram_equality(joined_histogram_manager1[histoname], joined_histogram_manager2[histoname])
def test_get_histograms_from_file(output_tmpdir, histogram_list): args, list_of_histograms = histogram_list histogram_manager1 = HistoManager(list_of_histograms) file_out = os.path.join(output_tmpdir, 'test_save_histogram_manager.h5') save_histomanager_to_file(histogram_manager1, file_out) histogram_manager2 = get_histograms_from_file(file_out) assert len(histogram_manager1.histos) == len(histogram_manager2.histos) for histoname in histogram_manager1.histos: assert_histogram_equality(histogram_manager1[histoname], histogram_manager2[histoname])
def test_save_histomanager_to_file_raises_ValueError(output_tmpdir, histogram_list, group, write_mode): args, list_of_histograms = histogram_list histogram_manager = HistoManager(list_of_histograms) file_out = os.path.join(output_tmpdir, 'test_save_histogram_manager.h5') with raises(ValueError): save_histomanager_to_file(histogram_manager, file_out, mode=write_mode, group=group)
def test_fill_histograms_in_histomanager(histogram_list): args, list_of_histograms = histogram_list titles, histobins, *_ = zip(*args) histogram_manager = HistoManager(list_of_histograms) test_data_values = {} old_data_values = {} test_out_of_range = {} old_out_of_range = {} for i, title in enumerate(titles): old_data_values[title] = np.copy(histogram_manager[title].data) old_out_of_range[title] = np.copy(histogram_manager[title].out_range) n_points = np.random.randint(5, 201) test_data = [ np.random.uniform(bins[0] * (1 + np.random.uniform()), bins[-1] * (1 + np.random.uniform()), n_points) for bins in histobins[i] ] test_data_values[title] = test_data out_of_range = [ np.array([ np.count_nonzero(test_data[j] < bins[0]), np.count_nonzero(test_data[j] > bins[-1]) ]) for j, bins in enumerate(histobins[i]) ] test_out_of_range[title] = np.array(out_of_range).T histogram_manager.fill_histograms(test_data_values) for histoname, data in test_data_values.items(): histogram = histogram_manager[histoname] old_data = np.array(old_data_values[histoname]) test_data = np.histogramdd(np.asarray(data).T, histogram.bins)[0] assert np.allclose(histogram.data, test_data + old_data) assert np.allclose(histogram.errors, np.sqrt(test_data + old_data)) assert np.allclose( histogram.out_range, test_out_of_range[histoname] + old_out_of_range[histoname])
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_histograms_from_file_and_write(output_tmpdir, histogram_list): _, list_of_histograms = histogram_list histogram_manager = HistoManager(list_of_histograms) file_out_test = os.path.join(output_tmpdir, 'test_save_histogram_manager_1.h5') save_histomanager_to_file(histogram_manager, file_out_test) file_out = os.path.join(output_tmpdir, 'test_join_histograms.h5') _ = histf.join_histograms_from_files([file_out_test, file_out_test], join_file=file_out) joined_histogram_manager1 = histf.get_histograms_from_file(file_out) joined_histogram_manager2 = histf.join_histo_managers( histogram_manager, histogram_manager) assert len(joined_histogram_manager1.histos) == len( joined_histogram_manager2.histos) for histoname in joined_histogram_manager1.histos: assert_histogram_equality(joined_histogram_manager1[histoname], joined_histogram_manager2[histoname])
def test_getitem_histomanager(histogram_list): args, list_of_histograms = histogram_list titles, histobins, *_ = zip(*args) histogram_manager = HistoManager(list_of_histograms) for histoname in histogram_manager.histos: assert np.all(a == b for a, b in zip(histogram_manager.histos[histoname].bins, histogram_manager[histoname].bins)) assert np.allclose(histogram_manager.histos[histoname].data, histogram_manager[histoname].data) assert np.allclose(histogram_manager.histos[histoname].errors, histogram_manager[histoname].errors) assert np.allclose(histogram_manager.histos[histoname].out_range, histogram_manager[histoname].out_range) assert histogram_manager.histos[histoname].labels == histogram_manager[ histoname].labels assert histogram_manager.histos[histoname].title == histogram_manager[ histoname].title assert histogram_manager.histos[histoname].scale == histogram_manager[ histoname].scale
def test_histomanager_initialization_without_histograms(): histogram_manager = HistoManager() assert len(histogram_manager.histos) == 0