def _eval_fit(self, fit_params, fit_type, extra_params_dict): """ Evaluates a particular fit for NRSur3dq8Remnant using the fit_params returned by _get_fit_params(). """ q, chiAz, chiBz = fit_params LALParams = lal.CreateDict() if extra_params_dict["unlimited_extrapolation"]: lal.DictInsertUINT4Value(LALParams, "unlimited_extrapolation", 1) if fit_type == "FinalMass": # FinalMass is given as a fraction of total mass val = lalsim.NRSur3dq8Remnant(q, chiAz, chiBz, "mf", LALParams) elif fit_type == "FinalSpin": # chifx and chify are zero for aligned-spin systems chifz = lalsim.NRSur3dq8Remnant(q, chiAz, chiBz, "chifz", LALParams) val = [0,0,chifz] elif fit_type == "RecoilKick": # vfz is zero for aligned-spin systems vfx = lalsim.NRSur3dq8Remnant(q, chiAz, chiBz, "vfx", LALParams) vfy = lalsim.NRSur3dq8Remnant(q, chiAz, chiBz, "vfy", LALParams) val = [vfx, vfy, 0] else: raise ValueError("Invalid fit_type=%s. This model only allows " "'FinalMass', 'FinalSpin' and 'RecoilKick'."%fit_type) return np.atleast_1d(val)
def _eval_fit(self, fit_params, fit_type, extra_params_dict): """ Evaluates a particular fit for NRSur7dq4Remnant using the fit_params returned by _get_fit_params(). fit_type can be one of "FinalMass", "FinalSpin" or "RecoilKick". Passing extra_params_dict = {"unlimited_extrapolation": True}, will ignore any extrapolation errors. USE AT YOUR OWN RISK!! Default: False. """ q, chiA_vec, chiB_vec, quat_fitnode, orbphase_fitnode = fit_params LALParams = lal.CreateDict() if extra_params_dict["unlimited_extrapolation"]: lal.DictInsertUINT4Value(LALParams, "unlimited_extrapolation", 1) if fit_type == "FinalMass": # FinalMass is given as a fraction of total mass val = lalsim.NRSur7dq4Remnant(q, chiA_vec[0], chiA_vec[1], chiA_vec[2], chiB_vec[0], chiB_vec[1], chiB_vec[2], "mf", LALParams).data[0] else: if fit_type == "FinalSpin": val = lalsim.NRSur7dq4Remnant(q, chiA_vec[0], chiA_vec[1], chiA_vec[2], chiB_vec[0], chiB_vec[1], chiB_vec[2], "chif", LALParams).data elif fit_type == "RecoilKick": val = lalsim.NRSur7dq4Remnant(q, chiA_vec[0], chiA_vec[1], chiA_vec[2], chiB_vec[0], chiB_vec[1], chiB_vec[2], "vf", LALParams).data else: raise ValueError("Invalid fit_type=%s. This model only allows " "'FinalMass', 'FinalSpin' and 'RecoilKick'." % fit_type) # The fits are constructed in the coorbital frame at t=-100M. # If quat_fitnode is None, this means that no spin evolution # was done and the return values should be in the coorbital frame # at t=-100. So, we don't need any further transformations. if quat_fitnode is not None: # If quat_fitnode is not None, we transform the remnant vectors # into the LAL inertial frame, which is the same as the # coorbital frame at omega0. This is done using the # coprecessing frame quaternion and orbital phase at t=-100M. # These are defined w.r.t. the reference LAL inertial frame # defined at omega0. val = quaternion_utils.transform_vector_coorb_to_inertial(val, \ orbphase_fitnode, quat_fitnode) return np.atleast_1d(val)
def _get_surrogate_dynamics(self, q, chiA0, chiB0, init_quat, \ init_orbphase, omega_ref, unlimited_extrapolation): """ A wrapper for NRSur7dq4 dynamics. Inputs: q: Mass ratio, mA/mB >= 1. chiA0: Dimless spin of BhA in the coorbital frame at omega_ref. chiB0: Dimless spin of BhB in the coorbital frame at omega_ref. init_quat: Coprecessing frame quaternion at omega_ref. init_orbphase: Orbital phase in the coprecessing frame at omega_ref. omega_ref: Orbital frequency in the coprecessing frame at the reference epoch where the input spins are given. Note: This is total-mass times the angular orbital frequency. unlimited_extrapolation: If True, allows unlimited extrapolation to regions well outside the surrogate's training region. Else, raises an error. Outputs: t_dyn: Time values at which the dynamics are returned. These are nonuniform and sparse. copr_quat: Time series of coprecessing frame quaternions. orbphase: Orbital phase time series in the coprecessing frame. chiA_copr: Time series of spin of BhA in the coprecessing frame. chiB_copr: Time series of spin of BhB in the coprecessing frame. """ approxTag = lalsim.SimInspiralGetApproximantFromString("NRSur7dq4") LALParams = lal.CreateDict() if unlimited_extrapolation: lal.DictInsertUINT4Value(LALParams, "unlimited_extrapolation", 1) t_dyn, quat0, quat1, quat2, quat3, orbphase, chiAx, chiAy, chiAz, \ chiBx, chiBy, chiBz = lalsim.PrecessingNRSurDynamics(q, \ chiA0[0], chiA0[1], chiA0[2], chiB0[0], chiB0[1], chiB0[2], \ omega_ref, init_quat[0], init_quat[1], init_quat[2], init_quat[3], \ init_orbphase, LALParams, approxTag) t_dyn = t_dyn.data orbphase = orbphase.data copr_quat = np.array([quat0.data, quat1.data, quat2.data, quat3.data]) chiA_copr = np.array([chiAx.data, chiAy.data, chiAz.data]).T chiB_copr = np.array([chiBx.data, chiBy.data, chiBz.data]).T return t_dyn, copr_quat, orbphase, chiA_copr, chiB_copr