def test_duplicated_names_init(named_hist): with pytest.raises(Exception): named_hist(axis.Regular(50, -3, 3, name="x"), axis.Regular(50, -3, 3, name="x")) with pytest.raises(Exception): named_hist(axis.Boolean(name="y"), axis.Boolean(name="y")) with pytest.raises(Exception): named_hist(axis.Variable(range(-3, 3), name="x"), axis.Variable(range(-3, 3), name="x")) with pytest.raises(Exception): named_hist(axis.Integer(-3, 3, name="x"), axis.Integer(-3, 3, name="x")) with pytest.raises(Exception): named_hist( axis.IntCategory(range(-3, 3), name="x"), axis.IntCategory(range(-3, 3), name="x"), ) with pytest.raises(Exception): named_hist(axis.StrCategory("TF", name="y"), axis.StrCategory(["T", "F"], name="y"))
def test_named_project(): """ Test named project -- whether NamedHist can be projected properly. """ h = NamedHist( axis.Regular( 50, -5, 5, name="A", label="a [units]", underflow=False, overflow=False ), axis.Boolean(name="B", label="b [units]"), axis.Variable(range(11), name="C", label="c [units]"), axis.Integer(0, 10, name="D", label="d [units]"), axis.IntCategory(range(10), name="E", label="e [units]"), axis.StrCategory("FT", name="F", label="f [units]"), ) # via names assert h.project() assert h.project("A", "B") assert h.project("A", "B", "C", "D", "E", "F") h = NamedHist( axis.Regular( 50, -5, 5, name="A", label="a [units]", underflow=False, overflow=False ), axis.Boolean(name="B", label="b [units]"), axis.Variable(range(11), name="C", label="c [units]"), axis.Integer(0, 10, name="D", label="d [units]"), axis.IntCategory(range(10), name="E", label="e [units]"), axis.StrCategory("FT", name="F", label="f [units]"), ) # via indices with pytest.raises(Exception): h.project(0, 1) with pytest.raises(Exception): h.project(0, 1, 2, 3, 4, 5) # duplicated with pytest.raises(Exception): h.project(0, 0) with pytest.raises(Exception): h.project("A", "A") # wrong/mixed types with pytest.raises(Exception): h.project(2, "A") with pytest.raises(Exception): h.project(True, "A") # cannot found with pytest.raises(Exception): h.project(-1, 9) with pytest.raises(Exception): h.project("G", "H")
def test_init_and_fill(unnamed_hist): """ Test general init -- whether Hist can be properly initialized. Also tests filling. """ np.random.seed(42) # basic h = unnamed_hist(axis.Regular(10, 0, 1, name="x"), axis.Regular(10, 0, 1, name="y")).fill([0.35, 0.35, 0.45], [0.35, 0.35, 0.45]) for idx in range(10): if idx == 3: assert h[idx, idx] == 2 assert h[{0: idx, 1: idx}] == 2 assert h[{"x": idx, "y": idx}] == 2 elif idx == 4: assert h[idx, idx] == 1 assert h[{0: idx, 1: idx}] == 1 assert h[{"x": idx, "y": idx}] == 1 else: assert h[idx, idx] == 0 assert h[{0: idx, 1: idx}] == 0 assert h[{"x": idx, "y": idx}] == 0 assert unnamed_hist(axis.Regular(50, -3, 3, name="x"), axis.Regular(50, -3, 3, name="y")).fill(np.random.randn(10), np.random.randn(10)) assert unnamed_hist(axis.Boolean(name="x"), axis.Boolean(name="y")).fill([True, False, True], [True, False, True]) assert unnamed_hist(axis.Variable(range(-3, 3), name="x"), axis.Variable(range(-3, 3), name="y")).fill(np.random.randn(10), np.random.randn(10)) assert unnamed_hist(axis.Integer(-3, 3, name="x"), axis.Integer(-3, 3, name="y")).fill(np.random.randn(10), np.random.randn(10)) assert unnamed_hist( axis.IntCategory(range(-3, 3), name="x"), axis.IntCategory(range(-3, 3), name="y"), ).fill(np.random.randn(10), np.random.randn(10)) assert unnamed_hist(axis.StrCategory(["F", "T"], name="x"), axis.StrCategory("FT", name="y")).fill(["T", "F", "T"], ["T", "F", "T"])
def test_no_named_init(unnamed_hist): # with no-named axes assert unnamed_hist(axis.Regular(50, -3, 3), axis.Regular(50, -3, 3)) assert unnamed_hist(axis.Boolean(), axis.Boolean()) assert unnamed_hist(axis.Variable(range(-3, 3)), axis.Variable(range(-3, 3))) assert unnamed_hist(axis.Integer(-3, 3), axis.Integer(-3, 3)) assert unnamed_hist( axis.IntCategory(range(-3, 3)), axis.IntCategory(range(-3, 3)), ) assert unnamed_hist(axis.StrCategory("TF"), axis.StrCategory(["T", "F"]))
def test_axis_names(): """ Test axis names -- whether axis names work. """ assert axis.Regular(50, -3, 3, name="x0") assert axis.Boolean(name="x_") assert axis.Variable(range(-3, 3), name="xx") assert axis.Integer(-3, 3, name="x_x") assert axis.IntCategory(range(-3, 3), name="X__X") assert axis.StrCategory("FT", name="X00") assert axis.Regular(50, -3, 3, name="") assert axis.Boolean(name="") assert axis.Variable(range(-3, 3)) assert axis.Integer(-3, 3, name="") assert axis.IntCategory(range(-3, 3), name="") assert axis.StrCategory("FT")
def test_axis_flow(): assert axis.Regular(9, 0, 8, flow=False) == axis.Regular(9, 0, 8, underflow=False, overflow=False) assert axis.Variable([1, 2, 3], flow=False) == axis.Variable([1, 2, 3], underflow=False, overflow=False) assert axis.Integer(0, 8, flow=False) == axis.Integer(0, 8, underflow=False, overflow=False) assert axis.Regular(9, 0, 8, flow=False, underflow=True) == axis.Regular(9, 0, 8, overflow=False) assert axis.Variable([1, 2, 3], flow=False, underflow=True) == axis.Variable([1, 2, 3], overflow=False) assert axis.Integer(0, 8, flow=False, underflow=True) == axis.Integer(0, 8, overflow=False) assert axis.Regular(9, 0, 8, flow=False, overflow=True) == axis.Regular(9, 0, 8, underflow=False) assert axis.Variable([1, 2, 3], flow=False, overflow=True) == axis.Variable([1, 2, 3], underflow=False) assert axis.Integer(0, 8, flow=False, overflow=True) == axis.Integer(0, 8, underflow=False)
def test_named_init(): """ Test named init -- whether NamedHist can be properly initialized. """ # basic h = NamedHist( axis.Regular(10, 0, 1, name="x"), axis.Regular(10, 0, 1, name="y") ).fill(x=[0.35, 0.35, 0.45], y=[0.35, 0.35, 0.45]) for idx in range(10): if idx == 3: assert h[idx, idx] == 2 assert h[{"x": idx, "y": idx}] == 2 elif idx == 4: assert h[idx, idx] == 1 else: assert h[idx, idx] == 0 with pytest.raises(Exception): h[{0: idx, 1: idx}] # with named axes assert NamedHist( axis.Regular(50, -3, 3, name="x"), axis.Regular(50, -3, 3, name="y") ).fill(x=np.random.randn(10), y=np.random.randn(10)) assert NamedHist(axis.Boolean(name="x"), axis.Boolean(name="y")).fill( y=[True, False, True], x=[True, False, True] ) assert NamedHist( axis.Variable(range(-3, 3), name="x"), axis.Variable(range(-3, 3), name="y") ).fill(x=np.random.randn(10), y=np.random.randn(10)) assert NamedHist(axis.Integer(-3, 3, name="x"), axis.Integer(-3, 3, name="y")).fill( x=np.random.randn(10), y=np.random.randn(10) ) assert NamedHist( axis.IntCategory(range(-3, 3), name="x"), axis.IntCategory(range(-3, 3), name="y"), ).fill(x=np.random.randn(10), y=np.random.randn(10)) assert NamedHist( axis.StrCategory(["F", "T"], name="x"), axis.StrCategory("FT", name="y") ).fill(y=["T", "F", "T"], x=["T", "F", "T"]) # cannot access via index h = NamedHist(axis.Regular(10, 0, 1, name="x")).fill(x=[0.35, 0.35, 0.45]) for idx in range(10): with pytest.raises(Exception): h[{0: idx}] # with no-named axes with pytest.raises(Exception): NamedHist(axis.Regular(50, -3, 3), axis.Regular(50, -3, 3)).fill( x=np.random.randn(10), y=np.random.randn(10) ) with pytest.raises(Exception): NamedHist(axis.Boolean(), axis.Boolean()).fill( y=[True, False, True], x=[True, False, True] ) with pytest.raises(Exception): NamedHist(axis.Variable(range(-3, 3)), axis.Variable(range(-3, 3))).fill( x=np.random.randn(10), y=np.random.randn(10) ) with pytest.raises(Exception): NamedHist(axis.Integer(-3, 3), axis.Integer(-3, 3)).fill( x=np.random.randn(10), y=np.random.randn(10) ) with pytest.raises(Exception): NamedHist( axis.IntCategory(range(-3, 3)), axis.IntCategory(range(-3, 3)), ).fill(x=np.random.randn(10), y=np.random.randn(10)) with pytest.raises(Exception): NamedHist(axis.StrCategory(["F", "T"]), axis.StrCategory("FT")).fill( y=["T", "F", "T"], x=["T", "F", "T"] ) # with duplicated names with pytest.raises(Exception): NamedHist(axis.Regular(50, -3, 3, name="x"), axis.Regular(50, -3, 3, name="x")) with pytest.raises(Exception): NamedHist(axis.Boolean(name="y"), axis.Boolean(name="y")) with pytest.raises(Exception): NamedHist( axis.Variable(range(-3, 3), name="x"), axis.Variable(range(-3, 3), name="x") ) with pytest.raises(Exception): NamedHist(axis.Integer(-3, 3, name="x"), axis.Integer(-3, 3, name="x")) with pytest.raises(Exception): NamedHist( axis.IntCategory(range(-3, 3), name="x"), axis.IntCategory(range(-3, 3), name="x"), ) with pytest.raises(Exception): NamedHist( axis.StrCategory("TF", name="y"), axis.StrCategory(["T", "F"], name="y") )
def test_named_fill(): """ Test named fill -- whether NamedHist can be properly filled. """ # Regular h = NamedHist( axis.Regular(10, 0, 1, name="x"), axis.Regular(10, 0, 1, name="y"), axis.Regular(2, 0, 2, name="z"), ).fill( x=[0.35, 0.35, 0.35, 0.45, 0.55, 0.55, 0.55], y=[0.35, 0.35, 0.45, 0.45, 0.45, 0.45, 0.45], z=[0, 0, 1, 1, 1, 1, 1], ) z_one_only = h[{"z": bh.loc(1)}] for idx_x in range(10): for idx_y in range(10): if idx_x == 3 and idx_y == 4 or idx_x == 4 and idx_y == 4: assert ( z_one_only[idx_x, idx_y] == z_one_only[{"x": idx_x, "y": idx_y}] == 1 ) elif idx_x == 5 and idx_y == 4: assert ( z_one_only[idx_x, idx_y] == z_one_only[{"x": idx_x, "y": idx_y}] == 3 ) else: assert ( z_one_only[idx_x, idx_y] == z_one_only[{"x": idx_x, "y": idx_y}] == 0 ) # Boolean h = NamedHist( axis.Boolean(name="x"), axis.Boolean(name="y"), axis.Boolean(name="z"), ).fill( x=[True, True, True, True, True, False, True], y=[False, True, True, False, False, True, False], z=[False, False, True, True, True, True, True], ) z_one_only = h[{"z": bh.loc(True)}] assert z_one_only[False, False] == z_one_only[{"x": False, "y": False}] == 0 assert z_one_only[False, True] == z_one_only[{"x": False, "y": True}] == 1 assert z_one_only[True, False] == z_one_only[{"x": True, "y": False}] == 3 assert z_one_only[True, True] == z_one_only[{"x": True, "y": True}] == 1 # Variable h = NamedHist( axis.Variable(range(11), name="x"), axis.Variable(range(11), name="y"), axis.Variable(range(3), name="z"), ).fill( x=[3.5, 3.5, 3.5, 4.5, 5.5, 5.5, 5.5], y=[3.5, 3.5, 4.5, 4.5, 4.5, 4.5, 4.5], z=[0, 0, 1, 1, 1, 1, 1], ) z_one_only = h[{"z": bh.loc(1)}] for idx_x in range(10): for idx_y in range(10): if idx_x == 3 and idx_y == 4 or idx_x == 4 and idx_y == 4: assert ( z_one_only[idx_x, idx_y] == z_one_only[{"x": idx_x, "y": idx_y}] == 1 ) elif idx_x == 5 and idx_y == 4: assert ( z_one_only[idx_x, idx_y] == z_one_only[{"x": idx_x, "y": idx_y}] == 3 ) else: assert ( z_one_only[idx_x, idx_y] == z_one_only[{"x": idx_x, "y": idx_y}] == 0 ) # Integer h = NamedHist( axis.Integer(0, 10, name="x"), axis.Integer(0, 10, name="y"), axis.Integer(0, 2, name="z"), ).fill( x=[3.5, 3.5, 3.5, 4.5, 5.5, 5.5, 5.5], y=[3.5, 3.5, 4.5, 4.5, 4.5, 4.5, 4.5], z=[0, 0, 1, 1, 1, 1, 1], ) z_one_only = h[{"z": bh.loc(1)}] for idx_x in range(10): for idx_y in range(10): if idx_x == 3 and idx_y == 4 or idx_x == 4 and idx_y == 4: assert ( z_one_only[idx_x, idx_y] == z_one_only[{"x": idx_x, "y": idx_y}] == 1 ) elif idx_x == 5 and idx_y == 4: assert ( z_one_only[idx_x, idx_y] == z_one_only[{"x": idx_x, "y": idx_y}] == 3 ) else: assert ( z_one_only[idx_x, idx_y] == z_one_only[{"x": idx_x, "y": idx_y}] == 0 ) # IntCategory h = NamedHist( axis.IntCategory(range(10), name="x"), axis.IntCategory(range(10), name="y"), axis.IntCategory(range(2), name="z"), ).fill( x=[3.5, 3.5, 3.5, 4.5, 5.5, 5.5, 5.5], y=[3.5, 3.5, 4.5, 4.5, 4.5, 4.5, 4.5], z=[0, 0, 1, 1, 1, 1, 1], ) z_one_only = h[{"z": bh.loc(1)}] for idx_x in range(10): for idx_y in range(10): if idx_x == 3 and idx_y == 4 or idx_x == 4 and idx_y == 4: assert ( z_one_only[idx_x, idx_y] == z_one_only[{"x": idx_x, "y": idx_y}] == 1 ) elif idx_x == 5 and idx_y == 4: assert ( z_one_only[idx_x, idx_y] == z_one_only[{"x": idx_x, "y": idx_y}] == 3 ) else: assert ( z_one_only[idx_x, idx_y] == z_one_only[{"x": idx_x, "y": idx_y}] == 0 ) # StrCategory h = NamedHist( axis.StrCategory("FT", name="x"), axis.StrCategory(list("FT"), name="y"), axis.StrCategory(["F", "T"], name="z"), ).fill( x=["T", "T", "T", "T", "T", "F", "T"], y=["F", "T", "T", "F", "F", "T", "F"], z=["F", "F", "T", "T", "T", "T", "T"], ) z_one_only = h[{"z": bh.loc("T")}] assert z_one_only[bh.loc("F"), bh.loc("F")] == 0 assert z_one_only[bh.loc("F"), bh.loc("T")] == 1 assert z_one_only[bh.loc("T"), bh.loc("F")] == 3 assert z_one_only[bh.loc("T"), bh.loc("T")] == 1 # without names with pytest.raises(Exception): NamedHist( axis.Regular(50, -3, 3, name="x"), axis.Regular(50, -3, 3, name="y") ).fill(np.random.randn(10), np.random.randn(10)) with pytest.raises(Exception): NamedHist(axis.Boolean(name="x"), axis.Boolean(name="y")).fill( [True, False, True], [True, False, True] ) with pytest.raises(Exception): NamedHist( axis.Variable(range(-3, 3), name="x"), axis.Variable(range(-3, 3), name="y") ).fill(np.random.randn(10), np.random.randn(10)) with pytest.raises(Exception): NamedHist(axis.Integer(-3, 3, name="x"), axis.Integer(-3, 3, name="y")).fill( np.random.randn(10), np.random.randn(10) ) with pytest.raises(Exception): NamedHist( axis.IntCategory(range(-3, 3), name="x"), axis.IntCategory(range(-3, 3), name="y"), ).fill(np.random.randn(10), np.random.randn(10)) with pytest.raises(Exception): NamedHist( axis.StrCategory(["F", "T"], name="x"), axis.StrCategory("FT", name="y") ).fill(["T", "F", "T"], ["T", "F", "T"]) # wrong names with pytest.raises(Exception): NamedHist( axis.Regular(50, -3, 3, name="x"), axis.Regular(50, -3, 3, name="y") ).fill(x=np.random.randn(10), z=np.random.randn(10)) with pytest.raises(Exception): NamedHist(axis.Boolean(name="x"), axis.Boolean(name="y")).fill( y=[True, False, True], z=[True, False, True] ) with pytest.raises(Exception): NamedHist( axis.Variable(range(-3, 3), name="x"), axis.Variable(range(-3, 3), name="y") ).fill(z=np.random.randn(10), x=np.random.randn(10)) with pytest.raises(Exception): NamedHist(axis.Integer(-3, 3, name="x"), axis.Integer(-3, 3, name="y")).fill( x=np.random.randn(10), z=np.random.randn(10) ) with pytest.raises(Exception): NamedHist( axis.IntCategory(range(-3, 3), name="x"), axis.IntCategory(range(-3, 3), name="y"), ).fill(y=np.random.randn(10), z=np.random.randn(10)) with pytest.raises(Exception): NamedHist( axis.StrCategory(["F", "T"], name="x"), axis.StrCategory("FT", name="y") ).fill(z=["T", "F", "T"], x=["T", "F", "T"]) h = NamedHist( axis.Regular( 50, -4, 4, name="X", label="s [units]", underflow=False, overflow=False ) ).fill(X=np.random.normal(size=10))
def test_general_fill(): """ Test general fill -- whether Hist can be properly filled. """ # Regular h = Hist( axis.Regular(10, 0, 1, name="x"), axis.Regular(10, 0, 1, name="y"), axis.Regular(2, 0, 2, name="z"), ).fill( x=[0.35, 0.35, 0.35, 0.45, 0.55, 0.55, 0.55], y=[0.35, 0.35, 0.45, 0.45, 0.45, 0.45, 0.45], z=[0, 0, 1, 1, 1, 1, 1], ) z_one_only = h[{2: bh.loc(1)}] for idx_x in range(10): for idx_y in range(10): if idx_x == 3 and idx_y == 4 or idx_x == 4 and idx_y == 4: assert z_one_only[idx_x, idx_y] == 1 elif idx_x == 5 and idx_y == 4: assert z_one_only[idx_x, idx_y] == 3 else: assert z_one_only[idx_x, idx_y] == 0 # Boolean h = Hist( axis.Boolean(name="x"), axis.Boolean(name="y"), axis.Boolean(name="z"), ).fill( [True, True, True, True, True, False, True], [False, True, True, False, False, True, False], [False, False, True, True, True, True, True], ) z_one_only = h[{2: bh.loc(True)}] assert z_one_only[False, False] == 0 assert z_one_only[False, True] == 1 assert z_one_only[True, False] == 3 assert z_one_only[True, True] == 1 # Variable h = Hist( axis.Variable(range(11), name="x"), axis.Variable(range(11), name="y"), axis.Variable(range(3), name="z"), ).fill( x=[3.5, 3.5, 3.5, 4.5, 5.5, 5.5, 5.5], y=[3.5, 3.5, 4.5, 4.5, 4.5, 4.5, 4.5], z=[0, 0, 1, 1, 1, 1, 1], ) z_one_only = h[{2: bh.loc(1)}] for idx_x in range(10): for idx_y in range(10): if idx_x == 3 and idx_y == 4 or idx_x == 4 and idx_y == 4: assert z_one_only[idx_x, idx_y] == 1 elif idx_x == 5 and idx_y == 4: assert z_one_only[idx_x, idx_y] == 3 else: assert z_one_only[idx_x, idx_y] == 0 # Integer h = Hist( axis.Integer(0, 10, name="x"), axis.Integer(0, 10, name="y"), axis.Integer(0, 2, name="z"), ).fill( [3.5, 3.5, 3.5, 4.5, 5.5, 5.5, 5.5], [3.5, 3.5, 4.5, 4.5, 4.5, 4.5, 4.5], [0, 0, 1, 1, 1, 1, 1], ) z_one_only = h[{2: bh.loc(1)}] for idx_x in range(10): for idx_y in range(10): if idx_x == 3 and idx_y == 4 or idx_x == 4 and idx_y == 4: assert z_one_only[idx_x, idx_y] == 1 elif idx_x == 5 and idx_y == 4: assert z_one_only[idx_x, idx_y] == 3 else: assert z_one_only[idx_x, idx_y] == 0 # IntCategory h = Hist( axis.IntCategory(range(10), name="x"), axis.IntCategory(range(10), name="y"), axis.IntCategory(range(2), name="z"), ).fill( x=[3.5, 3.5, 3.5, 4.5, 5.5, 5.5, 5.5], y=[3.5, 3.5, 4.5, 4.5, 4.5, 4.5, 4.5], z=[0, 0, 1, 1, 1, 1, 1], ) z_one_only = h[{2: bh.loc(1)}] for idx_x in range(10): for idx_y in range(10): if idx_x == 3 and idx_y == 4 or idx_x == 4 and idx_y == 4: assert z_one_only[idx_x, idx_y] == 1 elif idx_x == 5 and idx_y == 4: assert z_one_only[idx_x, idx_y] == 3 else: assert z_one_only[idx_x, idx_y] == 0 # StrCategory h = Hist( axis.StrCategory("FT", name="x"), axis.StrCategory(list("FT"), name="y"), axis.StrCategory(["F", "T"], name="z"), ).fill( ["T", "T", "T", "T", "T", "F", "T"], ["F", "T", "T", "F", "F", "T", "F"], ["F", "F", "T", "T", "T", "T", "T"], ) z_one_only = h[{2: bh.loc("T")}] assert z_one_only[bh.loc("F"), bh.loc("F")] == 0 assert z_one_only[bh.loc("F"), bh.loc("T")] == 1 assert z_one_only[bh.loc("T"), bh.loc("F")] == 3 assert z_one_only[bh.loc("T"), bh.loc("T")] == 1 # with names assert Hist(axis.Regular(50, -3, 3, name="x"), axis.Regular(50, -3, 3, name="y")).fill(x=np.random.randn(10), y=np.random.randn(10)) assert Hist(axis.Boolean(name="x"), axis.Boolean(name="y")).fill(x=[True, False, True], y=[True, False, True]) assert Hist(axis.Variable(range(-3, 3), name="x"), axis.Variable(range(-3, 3), name="y")).fill(x=np.random.randn(10), y=np.random.randn(10)) assert Hist(axis.Integer(-3, 3, name="x"), axis.Integer(-3, 3, name="y")).fill(x=np.random.randn(10), y=np.random.randn(10)) assert Hist( axis.IntCategory(range(-3, 3), name="x"), axis.IntCategory(range(-3, 3), name="y"), ).fill(x=np.random.randn(10), y=np.random.randn(10)) assert Hist(axis.StrCategory(["F", "T"], name="x"), axis.StrCategory("FT", name="y")).fill(x=["T", "F", "T"], y=["T", "F", "T"]) h = Hist( axis.Regular(50, -4, 4, name="X", label="s [units]", underflow=False, overflow=False)).fill(np.random.normal(size=10))
def test_stack_constructor_fails(): # Don't allow construction directly from axes with no Histograms with pytest.raises(Exception): assert Stack(reg_ax) with pytest.raises(Exception): assert Stack(reg_ax, reg_ax, reg_ax) # not allow to construct stack with different-type but same-type-axis histograms with pytest.raises(Exception): Stack(reg_hist, named_reg_hist) with pytest.raises(Exception): assert Stack(boo_hist, named_boo_hist) with pytest.raises(Exception): Stack(var_hist, named_var_hist) with pytest.raises(Exception): Stack(int_hist, named_int_hist) with pytest.raises(Exception): Stack(int_cat_hist, named_int_cat_hist) with pytest.raises(Exception): Stack(str_cat_hist, named_str_cat_hist) # not allow to construct stack with same-type but different-type-axis histograms with pytest.raises(Exception): Stack(reg_hist, boo_hist, var_hist) with pytest.raises(Exception): Stack(int_hist, int_cat_hist, str_cat_hist) # allow to construct stack with 2d histograms s1 = Stack(reg_hist_2d, reg_hist_2d, reg_hist_2d) s2 = Stack(boo_hist_2d, boo_hist_2d, boo_hist_2d) s3 = Stack(var_hist_2d, var_hist_2d, var_hist_2d) s4 = Stack(int_hist_2d, int_hist_2d, int_hist_2d) s5 = Stack(int_cat_hist_2d, int_cat_hist_2d, int_cat_hist_2d) s6 = Stack(str_cat_hist_2d, str_cat_hist_2d, str_cat_hist_2d) assert s1.axes == reg_hist_2d.axes assert s2.axes == boo_hist_2d.axes assert s3.axes == var_hist_2d.axes assert s4.axes == int_hist_2d.axes assert s5.axes == int_cat_hist_2d.axes assert s6.axes == str_cat_hist_2d.axes # not allow to construct stack with different ndim with pytest.raises(Exception): Stack(reg_hist, reg_hist_2d) with pytest.raises(Exception): Stack(boo_hist, boo_hist_2d) with pytest.raises(Exception): Stack(var_hist, var_hist_2d) with pytest.raises(Exception): Stack(int_hist, int_hist_2d) with pytest.raises(Exception): Stack(int_cat_hist, int_cat_hist_2d) with pytest.raises(Exception): Stack(str_cat_hist, str_cat_hist_2d) # not allow to struct stack from histograms with different axes with pytest.raises(Exception): NamedHist(named_reg_ax, axis.Regular(10, 0, 1, name="X")).stack("A", "X") with pytest.raises(Exception): NamedHist(named_boo_ax, axis.Boolean(name="X")).stack("B", "X") with pytest.raises(Exception): NamedHist(named_var_ax, axis.Variable(range(-3, 3), name="X")).stack("C", "X") with pytest.raises(Exception): NamedHist(named_int_ax, axis.Integer(-3, 3, name="X")).stack("D", "X") with pytest.raises(Exception): NamedHist(named_int_cat_ax, axis.IntCategory(range(-3, 3), name="X")).stack("E", "X") with pytest.raises(Exception): NamedHist(named_str_cat_ax, axis.StrCategory(["F", "T"], name="X")).stack("F", "X")
from __future__ import annotations from unittest.mock import MagicMock import numpy as np import pytest from pytest import approx from hist import Hist, NamedHist, Stack, axis # different histograms here! reg_ax = axis.Regular(10, 0, 1) boo_ax = axis.Boolean() var_ax = axis.Variable(range(-3, 3)) int_ax = axis.Integer(-3, 3) int_cat_ax = axis.IntCategory(range(-3, 3)) str_cat_ax = axis.StrCategory(["F", "T"]) reg_hist = Hist(reg_ax).fill(np.random.randn(10)) boo_hist = Hist(boo_ax).fill([True, False, True]) var_hist = Hist(var_ax).fill(np.random.randn(10)) int_hist = Hist(int_ax).fill(np.random.randn(10)) int_cat_hist = Hist(int_cat_ax).fill(np.random.randn(10)) str_cat_hist = Hist(str_cat_ax).fill(["T", "F", "T"]) named_reg_ax = axis.Regular(10, 0, 1, name="A") named_boo_ax = axis.Boolean(name="B") named_var_ax = axis.Variable(range(-3, 3), name="C") named_int_ax = axis.Integer(-3, 3, name="D") named_int_cat_ax = axis.IntCategory(range(-3, 3), name="E") named_str_cat_ax = axis.StrCategory(["F", "T"], name="F")