def calc_gcen_coords(glong, glat, dist, R0=__R0, Zsun=__Zsun, roll=__roll, use_Zsunroll=True): """ Calculate galactocentric Cartesian coordinates from galactic longitudes, latitudes, and distances from the Sun. Parameters: glong, glat :: scalar or array of scalars Galactic longitude and latitude (deg) dist :: scalar or array of scalars line-of-sight distance (kpc) R0 :: scalar or array of scalars (optional) Galactocentric radius of the Sun Zsun :: scalar (optional) Height of Sun above galactic midplane (pc) roll :: scalar (optional) Roll angle relative to b=0 (deg) use_Zsunroll :: boolean (optional) If True, include Zsun and roll into calculation Returns: x, y, Rgal, cos_az, sin_az x, y :: scalars or arrays of scalars Galactocentric Cartesian positions (kpc). Sun is on -x-axis. Rgal :: scalar or array of scalars Galactocentric cylindrical radius (kpc) cos_az, sin_az :: scalar or array of scalars Cosine and sine of Galactocentric azimuth (rad) """ glong, glat, dist = np.atleast_1d(glong, glat, dist) if np.shape(glong) != np.shape(dist): glong = np.array([glong, ] * len(dist)) Rgal = kd_utils.calc_Rgal( glong, glat, dist, R0=R0, Zsun=Zsun, roll=roll, use_Zsunroll=use_Zsunroll) Rgal[Rgal < 1.0e-6] = 1.0e-6 # Catch small Rgal az = kd_utils.calc_az( glong, glat, dist, R0=R0, Zsun=Zsun, roll=roll, use_Zsunroll=use_Zsunroll) cos_az = np.cos(np.deg2rad(az)) sin_az = np.sin(np.deg2rad(az)) x = Rgal * -cos_az y = Rgal * sin_az return x, y, Rgal, cos_az, sin_az
def calc_vlsr(glong, glat, dist, R0=__R0, Usun=__Usun, Vsun=__Vsun, Wsun=__Wsun, Upec=__Upec, Vpec=__Vpec, a2=__a2, a3=__a3, Zsun=__Zsun, roll=__roll, peculiar=False): """ Return the IAU-LSR velocity at a given Galactic longitude and line-of-sight distance. Parameters: glong, glat :: scalars or arrays of scalars Galactic longitude and latitude (deg). dist :: scalar or array of scalars line-of-sight distance (kpc). R0 :: scalar (optional) Solar Galactocentric radius (kpc) Usun, Vsun, Wsun, Upec, Vpec, a2, a3 :: scalars (optional) Reid+2019 rotation curve parameters Zsun :: scalar (optional) Height of sun above Galactic midplane (pc) roll :: scalar (optional) Roll of Galactic midplane relative to b=0 (deg) peculiar :: boolean (optional) If True, include HMSFR peculiar motion component Returns: vlsr vlsr :: scalar or array of scalars LSR velocity (km/s). """ input_scalar = np.isscalar(glong) and np.isscalar(glat) and np.isscalar( dist) glong, glat, dist = np.atleast_1d(glong, glat, dist) cos_glong = np.cos(np.deg2rad(glong)) sin_glong = np.sin(np.deg2rad(glong)) cos_glat = np.cos(np.deg2rad(glat)) sin_glat = np.sin(np.deg2rad(glat)) # # Convert distance to Galactocentric, catch small Rgal # Rgal = kd_utils.calc_Rgal(glong, glat, dist, R0=R0) Rgal[Rgal < 1.e-6] = 1.e-6 az = kd_utils.calc_az(glong, glat, dist, R0=R0) cos_az = np.cos(np.deg2rad(az)) sin_az = np.sin(np.deg2rad(az)) # # Rotation curve circular velocity # theta = calc_theta(Rgal, a2=a2, a3=a3, R0=R0) theta0 = calc_theta(R0, a2=a2, a3=a3, R0=R0) # # Add HMSFR peculiar motion # if peculiar: vR = -Upec vAz = theta + Vpec vZ = 0.0 else: vR = 0.0 vAz = theta vZ = 0.0 vXg = -vR * cos_az + vAz * sin_az vYg = vR * sin_az + vAz * cos_az vZg = vZ # # Convert to barycentric # X = dist * cos_glat * cos_glong Y = dist * cos_glat * sin_glong Z = dist * sin_glat # useful constants sin_tilt = Zsun / 1000. / R0 cos_tilt = np.cos(np.arcsin(sin_tilt)) sin_roll = np.sin(np.deg2rad(roll)) cos_roll = np.cos(np.deg2rad(roll)) # solar peculiar motion vXg = vXg - Usun vYg = vYg - theta0 - Vsun vZg = vZg - Wsun # correct tilt and roll of Galactic midplane vXg1 = vXg * cos_tilt - vZg * sin_tilt vYg1 = vYg vZg1 = vXg * sin_tilt + vZg * cos_tilt vXh = vXg1 vYh = vYg1 * cos_roll + vZg1 * sin_roll vZh = -vYg1 * sin_roll + vZg1 * cos_roll vbary = (X * vXh + Y * vYh + Z * vZh) / dist # # Convert to IAU-LSR # vlsr = vbary + (__Ustd * cos_glong + __Vstd * sin_glong) * cos_glat + __Wstd * sin_glat if input_scalar: return vlsr[0] return vlsr