import numpy as np
roe_type_standard = 0
roe_type_charge_injection = 1
roe_type_trap_pumping = 2
[docs]class ROE:
[docs] def __init__(
self,
dwell_times=[1.0],
prescan_offset=0,
overscan_start=-1,
empty_traps_between_columns=True,
empty_traps_for_first_transfers=False,
force_release_away_from_readout=True,
use_integer_express_matrix=False,
pixel_bounce_kA=0.0,
pixel_bounce_kv=0.0,
pixel_bounce_omega=1.0,
pixel_bounce_gamma=1.0,
):
self.dwell_times = np.array(dwell_times, dtype=np.double)
self.prescan_offset = prescan_offset
self.overscan_start = overscan_start
self.empty_traps_between_columns = empty_traps_between_columns
self.empty_traps_for_first_transfers = empty_traps_for_first_transfers
self.force_release_away_from_readout = force_release_away_from_readout
self.use_integer_express_matrix = use_integer_express_matrix
self.pixel_bounce_kA = pixel_bounce_kA
self.pixel_bounce_kv = pixel_bounce_kv
self.pixel_bounce_omega = pixel_bounce_omega
self.pixel_bounce_gamma = pixel_bounce_gamma
self.n_pumps = -1 # Dummy value
self.type = roe_type_standard
[docs]class ROEChargeInjection(ROE):
[docs] def __init__(
self,
dwell_times=[1.0],
prescan_offset=0,
overscan_start=-1,
empty_traps_between_columns=True,
force_release_away_from_readout=True,
use_integer_express_matrix=False,
pixel_bounce_kA=0.0,
pixel_bounce_kv=0.0,
pixel_bounce_omega=1.0,
pixel_bounce_gamma=1.0,
):
ROE.__init__(
self,
dwell_times=dwell_times,
prescan_offset=prescan_offset,
overscan_start=overscan_start,
empty_traps_between_columns=empty_traps_between_columns,
empty_traps_for_first_transfers=False,
force_release_away_from_readout=force_release_away_from_readout,
use_integer_express_matrix=use_integer_express_matrix,
pixel_bounce_kA=pixel_bounce_kA,
pixel_bounce_kv=pixel_bounce_kv,
pixel_bounce_omega=pixel_bounce_omega,
pixel_bounce_gamma=pixel_bounce_gamma,
)
self.type = roe_type_charge_injection
def from_normal_roe(roe, n_pixels_in_image):
"""
Convert a normal ROE sequence, with all its options, to one modelling
charge injection readout.
Must specify the number of physical pixels between the charge injection
register and the readout node.
"""
return ROEChargeInjection(
dwell_times=roe.dwell_times,
prescan_offset=roe.prescan_offset + n_pixels_in_image,
overscan_start=roe.overscan_start,
empty_traps_between_columns=roe.empty_traps_between_columns,
force_release_away_from_readout=roe.force_release_away_from_readout,
use_integer_express_matrix=roe.use_integer_express_matrix,
pixel_bounce_kA=roe.pixel_bounce_kA,
pixel_bounce_kv=roe.pixel_bounce_kv,
pixel_bounce_omega=roe.pixel_bounce_omega,
pixel_bounce_gamma=roe.pixel_bounce_gamma,
)
class ROETrapPumping(ROE):
def __init__(
self,
dwell_times=[0.5, 0.5],
prescan_offset=0,
overscan_start=-1,
n_pumps=1,
empty_traps_for_first_transfers=False,
use_integer_express_matrix=False,
pixel_bounce_kA=0.0,
pixel_bounce_kv=0.0,
pixel_bounce_omega=1.0,
pixel_bounce_gamma=1.0,
):
ROE.__init__(
self,
dwell_times=dwell_times,
prescan_offset=prescan_offset,
overscan_start=overscan_start,
empty_traps_between_columns=True,
empty_traps_for_first_transfers=empty_traps_for_first_transfers,
force_release_away_from_readout=False,
use_integer_express_matrix=use_integer_express_matrix,
pixel_bounce_kA=pixel_bounce_kA,
pixel_bounce_kv=pixel_bounce_kv,
pixel_bounce_omega=pixel_bounce_omega,
pixel_bounce_gamma=pixel_bounce_gamma,
)
self.n_pumps = n_pumps
self.type = roe_type_trap_pumping