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
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
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
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
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
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
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