Source code for micropolarray.cameras

import numpy as np

from micropolarray.processing.nrgf import roi_from_polar

# TODO: aggiungere tutti i bei dati qua, rendere le camere personalizzabili (caricare dark da cartelle e cose cosi)


[docs]class Camera: def __init__(self): pass
[docs] def occulter_roi( self, data: np.array, fill: float = 0.0, overoccult: int = 0 ) -> np.array: """Returns the array in the polar ROI, else fill Args: data (np.array): Input array fill (float, optional): Value for filling. Defaults to 0.0. overoccult (int, optional): Pixels to overoccult. Defaults to 0. Returns: np.array: Array if in ROI, fill elsewhere """ y, x, r = self.occulter_pos_last roidata = roi_from_polar(data, [y, x], [r + overoccult, 5000], fill=fill) return roidata
[docs] def occulter_mask(self, overoccult: int = 0, rmax: int = None) -> np.array: """Returns an array of True inside the roi, False elsewhere. Useful for mean/std operations (where=occulter_mask). Args: overoccult (int, optional): Pixels to overoccult. Defaults to 15. rmax (int, optional): Maximum r of the ROI. Defaults to image nearest border. Returns: np.array: Boolean roi array """ y, x, r = self.occulter_pos_last r = r + overoccult if rmax is None: rmax = np.min([y, x]) occulter_mask = np.where( roi_from_polar( np.ones(shape=(self.h_image, self.w_image)), [y, x], [r, rmax] ) != 0, True, False, ) return occulter_mask
[docs]class Kasi(Camera): def __init__(self): # self.angle_dic = {-45: 0, 0: 1, 90: 2, 45: 3} # old self.angle_dic = {0: 0, 45: 1, -45: 2, 90: 3} # new self.linearity_range = [0.0, 2500.0] self.PTC = 2.64 # [e-/ADU] self.readout_noise = 10 # [e-] self.full_well = 10500 # [e-] self.h_image = 3000 self.w_image = 4096
[docs]class PolarCam(Camera): def __init__(self): # self.angle_dic = {90: 0, 45: 1, -45: 2, 0: 3} # My ref system self.angle_dic = { 0: 0, 45: 1, -45: 2, 90: 3, } # Ale ref system, 0 = vertical self.PolarCam_model = "U4" self.sensor_type = "CCD" self.h_image = 1952 # height [pixel] self.w_image = 1952 # width [pixel] self.pixeldim_l1 = 7.4 # [micron] self.pixeldim_l2 = 7.4 # [micron] self.orientation00 = 0 # | [degree] self.orientation01 = 45 # / [degree] self.orientation11 = 90 # -- [degree] self.orientation10 = 135 # \ [degree] self.saturationCapacity = 44.0e3 # [e-] self.bitdepth = 12 # [bit] self.frameRate = 14 # [fps] self.Texp_min = 0.02 # [ms] self.quantumEff = 0.76 # @470 (nominal, by user manual) self.occulter_pos_last = [ 919, 941, 536, ] # Occulter y, x, radius [px, px, px] updated January 2023 self.occulter_pos_2021 = [ 925, 934, 532, ] # updated march 27, 2021/2022 campaign # self.sun_dimension_pixels = 446 # from standard astropy atan(R_sun/AU) self.sun_dimension_pixels = 457 # L1_processing/from sun_occ_dim.py self.occulter_radius_sr = ( self.occulter_pos_last[-1] / self.sun_dimension_pixels ) # occulter dimension in solar radii, L1_processing/from sun_occ_dim.py # self.occulter_radius_sr = 1.1901 # occulter dimension in solar radii self.gain = 9.28
[docs]class Antarticor: # AntarctiCor def __init__(self): self.aperture = 50 # [mm] self.effectiveFocalLength = 700 # [mm] self.fratio = self.effectiveFocalLength / self.aperture self.spectralRange = 591 # (591 +- 5) [nm] self.platescale = 4.3 # [arcsec/superpixel] self.FoV_degree = 0.6 # +/- 0.6 [degree] self.FoV_Rsun = 2.24 # +/- 2.24 [solar radii] # Other self.Topal = 0.27 # opal transmittance [] self.const = 1.083 * 10 ** (-5) # constant []