Source code for autocti.model.model_util

from typing import Optional, List

from arcticpy import CCDPhase
from arcticpy import TrapInstantCapture

from autoconf.dictable import Dictable


class AbstractCTI:
    @property
    def trap_list(self):
        raise NotImplementedError

    @property
    def delta_ellipticity(self):
        return sum([trap.delta_ellipticity for trap in self.trap_list])


[docs]class CTI1D(AbstractCTI, Dictable):
[docs] def __init__( self, trap_list: Optional[List[TrapInstantCapture]] = None, ccd: Optional[CCDPhase] = None, ): """ An object which determines the behaviour of CTI during 1D clocking. This includes the traps that capture and trail electrons and the CCD volume filling behaviour. Parameters ---------- trap_list The traps on the dataset that capture and release electrons during clocking. ccd The CCD volume filling parameterization which dictates how an electron cloud fills pixels and thus how it is subject to traps. """ self._trap_list = trap_list self.ccd = ccd
@property def trap_list(self): return self._trap_list
[docs]class CTI2D(AbstractCTI, Dictable):
[docs] def __init__( self, parallel_trap_list: Optional[List[TrapInstantCapture]] = None, parallel_ccd: Optional[CCDPhase] = None, serial_trap_list: Optional[List[TrapInstantCapture]] = None, serial_ccd: Optional[CCDPhase] = None, ): """ An object which determines the behaviour of CTI during 2D parallel and serial clocking. This includes the traps that capture and trail electrons and the CCD volume filling behaviour. Parameters ---------- parallel_trap_list The traps on the dataset that capture and release electrons during parallel clocking. parallel_ccd The CCD volume filling parameterization which dictates how an electron cloud fills pixel in the parallel direction and thus how it is subject to traps. serial_trap_list The traps on the dataset that capture and release electrons during serial clocking. serial_ccd The CCD volume filling parameterization which dictates how an electron cloud fills pixel in the serial direction and thus how it is subject to traps. """ self.parallel_trap_list = parallel_trap_list self.parallel_ccd = parallel_ccd self.serial_trap_list = serial_trap_list self.serial_ccd = serial_ccd
@property def trap_list(self) -> List[TrapInstantCapture]: """ Combine the parallel and serial trap lists to make an overall list of traps in the model. This is not a straight forward list addition, because **PyAutoFit** model's store the `parallel_traps` and `serial_traps` entries as a `ModelInstance`. This object does not allow for straight forward list addition. """ parallel_traps = self.parallel_trap_list or [] serial_traps = self.serial_trap_list or [] return [trap for trap in parallel_traps] + [trap for trap in serial_traps]
def is_parallel_fit(model): if model.parallel_ccd is not None and model.serial_ccd is None: return True return False def is_serial_fit(model): if model.parallel_ccd is None and model.serial_ccd is not None: return True return False def is_parallel_and_serial_fit(model): if model.parallel_ccd is not None and model.serial_ccd is not None: return True return False