Пример #1
0
def calculated_field_angles(calc_source,
                            attitude,
                            sat,
                            t,
                            double_telescope=False):
    """
    | Ref. Paper [LUDW2011]_ eq. [12]-[13]
    | Return field angles according to Lindegren eq. 12. See :meth:`compute_field_angles`

    :param source: [Calc_source]
    :param attitude: [quaternion] attitude at time t
    :param sat: [Satellite]
    :param t: [float] time at which we want the angles
    :param double_telescope: [bool] If true, uses the model with two telescopes
    :returns:
        * eta: along-scan field angle (== phi if double_telescope = False)
        * zeta: across-scan field angle
    """
    alpha, delta, parallax, mu_alpha, mu_delta = calc_source.s_params[:]
    params = np.array(
        [alpha, delta, parallax, mu_alpha, mu_delta, calc_source.mu_radial])

    Cu = compute_topocentric_direction(params, sat, t)  # u in CoMRS frame
    Su = ft.lmn_to_xyz(attitude, Cu)  # u in SRS frame

    eta, zeta = compute_field_angles(Su, double_telescope)
    return eta, zeta
Пример #2
0
 def compute_stuff_for_source(self, s):
     raise ValueError('This function is not complete')
     alpha, delta, parallax, mu_alpha, mu_delta = calc_source.s_params[:]
     params = np.array([alpha, delta, parallax, mu_alpha, mu_delta, calc_source.mu_radial])
     Cu = compute_topocentric_direction(params, sat, t)  # u in CoMRS frame
     Su = ft.lmn_to_xyz(attitude, Cu)  # u in SRS frame
     phi, zeta = compute_field_angles(Su, double_telescope=False)
     pass
Пример #3
0
def observed_field_angles(source, attitude, sat, t, double_telescope=False):
    """
    Ref. Paper eq. [12]-[13]
    Return field angles according to Lindegren eq. 12
    eta: along-scan field angle (== phi if double_telescope = False)
    zeta: across-scan field angle
    """
    Cu = source.unit_topocentric_function(sat, t)  # u in CoMRS frame
    Su = ft.lmn_to_xyz(attitude, Cu)
    # if double_telescope is False, it will return (phi, zeta)
    eta, zeta = compute_field_angles(Su, double_telescope)
    return eta, zeta
Пример #4
0
def calculated_field_angles(calc_source,
                            attitude,
                            sat,
                            t,
                            double_telescope=False):
    """
    Ref. Paper eq. [12]-[13]
    Return field angles according to Lindegren eq. 12
    eta: along-scan field angle
    """
    alpha, delta, parallax, mu_alpha, mu_delta = calc_source.s_params[:]
    params = np.array(
        [alpha, delta, parallax, mu_alpha, mu_delta, calc_source.mu_radial])

    Cu = compute_topocentric_direction(params, sat, t)  # u in CoMRS frame
    Su = ft.lmn_to_xyz(attitude, Cu)  # u in SRS frame

    eta, zeta = compute_field_angles(Su, double_telescope)
    return eta, zeta
Пример #5
0
def observed_field_angles(source, attitude, sat, t, double_telescope=False):
    """
    | Ref. Paper [LUDW2011]_ eq. [12]-[13]
    | Return field angles according to Lindegren eq. 12. See :meth:`compute_field_angles`

    :param source: [Source]
    :param attitude: [quaternion] attitude at time t
    :param sat: [Satellite]
    :param t: [float] time at which we want the angles
    :param double_telescope: [bool] If true, uses the model with two telescopes
    :returns:
        * eta: along-scan field angle (== phi if double_telescope = False)
        * zeta: across-scan field angle
    """
    Cu = source.unit_topocentric_function(sat, t)  # u in CoMRS frame
    Su = ft.lmn_to_xyz(attitude, Cu)
    # if double_telescope is False, it will return (phi, zeta)
    eta, zeta = compute_field_angles(Su, double_telescope)
    return eta, zeta
Пример #6
0
    def CoMRS_to_SRS_for_source_derivatives(self, CoMRS_derivatives, calc_source, t_L, source_index):
        """
        | Ref. Paper [LUDW2011]_ eq. [72]
        | rotate the frame from CoRMS (lmn) to SRS (xyz) for the given derivatives

        :param CoMRS_derivatives: [list] of deriatives [du_dalpha, du_ddelta,
         du_dparallax, du_dmualpha, du_dmudelta]
        :param calc_source: [Calc_source]
        :param t_L: [float] time of observation
        :param source_index: [int]
        """
        SRS_derivatives = []
        if self.updating == 'source':
            attitude = self.get_attitude_for_source(source_index, t_L)
        elif self.updating == 'scanned source':
            attitude = self.sat.func_attitude(t_L)
        else:  # attitude = self.get_attitude(t_L)
            raise ValueError('Not yet implemented for this case')

        for derivative in CoMRS_derivatives:  # TODO: remove these ugly for loop
            SRS_derivatives.append(ft.lmn_to_xyz(attitude, derivative))
        return SRS_derivatives
Пример #7
0
def eta_angle(t, sat, source, FoV='centered'):
    """
    Function to minimize in the scanner.
    See `observed_field_angles()`
    """
    Gamma_c = const.Gamma_c

    Cu_unit = source.unit_topocentric_function(sat, t)
    Su = ft.lmn_to_xyz(sat.func_attitude(t), Cu_unit)

    Su_x, Su_y, Su_z = Su[:]
    phi = np.arctan2(Su_y, Su_x)
    field_index = np.sign(phi)
    if FoV == 'centered':
        eta = phi
    elif FoV == 'preceding':
        eta = phi + Gamma_c / 2
    elif FoV == 'following':
        eta = phi - Gamma_c / 2
    else:
        raise ValueError('incorrect FoV argument.')
    return eta