def test__express_matrix_from_pixels(self): roe = ac.ROE(empty_traps_at_start=False) express_multiplier, _ = roe.express_matrix_from_pixels_and_express( pixels=12, express=1, dtype=int) assert express_multiplier == pytest.approx(np.array([np.arange(1, 13)])) express_multiplier, _ = roe.express_matrix_from_pixels_and_express( pixels=12, express=4, dtype=int) assert express_multiplier == pytest.approx( np.array([ [1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], [0, 0, 0, 1, 2, 3, 3, 3, 3, 3, 3, 3], [0, 0, 0, 0, 0, 0, 1, 2, 3, 3, 3, 3], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3], ])) express_multiplier, _ = roe.express_matrix_from_pixels_and_express( pixels=12, express=12) assert express_multiplier == pytest.approx(np.triu(np.ones((12, 12)))) roe = ac.ROE(empty_traps_at_start=True) express_multiplier, _ = roe.express_matrix_from_pixels_and_express( pixels=12, express=12)
def test__readout_sequence_three_phase_single_phase_high(self): n_phases = 3 roe = ac.ROE([1] * n_phases, force_downstream_release=False) assert roe.pixels_accessed_during_clocking == [-1, 0, 1] # assert min(roe.pixels_accessed_during_clocking) == -1 # assert max(roe.pixels_accessed_during_clocking) == +1 assert roe.n_phases == n_phases assert roe.n_steps == n_phases for step in range(n_phases): phase = step assert roe.clock_sequence[step][phase]["high"], "Highness" assert (roe.clock_sequence[step][phase]["capture_from_which_pixel"] == 0), "Step {}, phase {}, capture".format(step, phase) assert (roe.clock_sequence[step][phase]["release_to_which_pixel"] == 0), "Step {}, phase {}, release".format(step, phase) # Check other phases assert roe.clock_sequence[0][1]["release_to_which_pixel"] == 0 assert roe.clock_sequence[0][2]["release_to_which_pixel"] == -1 assert roe.clock_sequence[1][0]["release_to_which_pixel"] == 0 assert roe.clock_sequence[1][2]["release_to_which_pixel"] == 0 assert roe.clock_sequence[2][0]["release_to_which_pixel"] == 1 assert roe.clock_sequence[2][1]["release_to_which_pixel"] == 0 # Never move electrons ahead of the trap roe = ac.ROE([1] * n_phases, force_downstream_release=True) assert roe.pixels_accessed_during_clocking == [0, 1] # assert min(roe.pixels_accessed_during_clocking) == 0 # assert max(roe.pixels_accessed_during_clocking) == +1 assert roe.n_phases == n_phases assert roe.n_steps == n_phases # Check all high phases for step in range(n_phases): phase = step assert roe.clock_sequence[step][phase]["high"], "Highness" assert (roe.clock_sequence[step][phase]["capture_from_which_pixel"] == 0), "Step {}, phase {}, capture".format(step, phase) assert (roe.clock_sequence[step][phase]["release_to_which_pixel"] == 0), "Step {}, phase {}, release".format(step, phase) # Check other phases assert roe.clock_sequence[0][1]["release_to_which_pixel"] == 1 assert roe.clock_sequence[0][2]["release_to_which_pixel"] == 0 assert roe.clock_sequence[1][0]["release_to_which_pixel"] == 0 assert roe.clock_sequence[1][2]["release_to_which_pixel"] == 1 assert roe.clock_sequence[2][0]["release_to_which_pixel"] == 1 assert roe.clock_sequence[2][1]["release_to_which_pixel"] == 0
def test__readout_sequence_two_phase_single_phase_high(self): n_phases = 2 roe = ac.ROE([1] * n_phases, force_downstream_release=False) assert roe.pixels_accessed_during_clocking == [-1, 0, 1] # assert min(roe.pixels_accessed_during_clocking) == -1 # assert max(roe.pixels_accessed_during_clocking) == +1 assert roe.n_phases == n_phases assert roe.n_steps == n_phases for step in range(n_phases): phase = step assert roe.clock_sequence[step][phase]["high"], "Highness" assert (roe.clock_sequence[step][phase]["capture_from_which_pixel"] == 0), "Step {}, phase {}, capture".format(step, phase) assert (roe.clock_sequence[step][phase]["release_to_which_pixel"] == 0), "Step {}, phase {}, release".format(step, phase) # Check other phases assert (roe.clock_sequence[0][1]["release_to_which_pixel"] == np.array( [-1, 0])).all assert (roe.clock_sequence[1][0]["release_to_which_pixel"] == np.array( [0, 1])).all roe = ac.ROE([1] * n_phases, force_downstream_release=True) assert roe.pixels_accessed_during_clocking == [0, 1] # assert min(roe.pixels_accessed_during_clocking) == 0 # assert max(roe.pixels_accessed_during_clocking) == +1 assert roe.n_phases == n_phases assert roe.n_steps == n_phases for step in range(n_phases): phase = step assert roe.clock_sequence[step][phase]["high"], "Highness" assert (roe.clock_sequence[step][phase]["capture_from_which_pixel"] == 0), "Step {}, phase {}, capture".format(step, phase) assert (roe.clock_sequence[step][phase]["release_to_which_pixel"] == 0), "Step {}, phase {}, release".format(step, phase) # Check other phases assert (roe.clock_sequence[0][1]["release_to_which_pixel"] == np.array( [0, 1])).all assert (roe.clock_sequence[1][0]["release_to_which_pixel"] == np.array( [0, 1])).all
def test__readout_sequence_single_phase_single_phase_high(self): for force_downstream_release in [True, False]: roe = ac.ROE([1], force_downstream_release=force_downstream_release) assert roe.pixels_accessed_during_clocking == [0] # assert min(roe.pixels_accessed_during_clocking) == 0 # assert max(roe.pixels_accessed_during_clocking) == 0 assert roe.n_phases == 1 assert roe.n_steps == 1 assert roe.clock_sequence[0][0]["high"], "Highness" assert roe.clock_sequence[0][0]["capture_from_which_pixel"] == 0 assert roe.clock_sequence[0][0]["release_to_which_pixel"] == 0
def test__express_matrix_always_sums_to_n_transfers(self): for pixels in [5, 7, 17]: for express in [0, 1, 2, 7]: for offset in [0, 1, 13]: for dtype in [int, float]: for first_pixel_different in [True, False]: roe = ac.ROE( empty_traps_at_start=first_pixel_different) ( express_multiplier, _, ) = roe.express_matrix_from_pixels_and_express( pixels=pixels, express=express, offset=offset, dtype=dtype, ) assert np.sum( express_multiplier, axis=0) == pytest.approx( np.arange(1, pixels + 1) + offset)