Example #1
0
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)
Example #2
0
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])
Example #3
0
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
Example #4
0
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])
Example #5
0
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])
Example #6
0
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)
Example #7
0
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
Example #8
0
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
Example #9
0
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])
Example #10
0
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])
Example #11
0
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)
Example #12
0
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])
Example #13
0
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)
Example #14
0
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])
Example #15
0
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
Example #16
0
def test_histomanager_initialization_without_histograms():
    histogram_manager = HistoManager()
    assert len(histogram_manager.histos) == 0