def process_mock_densdata(options): print("Using mock Pal 5 data from %s" % options.mockfilename) # Read and prep data for mocks xvid= numpy.loadtxt(options.mockfilename) xv= xvid[:,:6] xv= xv[numpy.argsort(xvid[:,6])] XYZ= bovy_coords.galcenrect_to_XYZ(xv[:,0],xv[:,1],xv[:,2], Xsun=R0,Zsun=0.025) lbd= bovy_coords.XYZ_to_lbd(XYZ[0],XYZ[1],XYZ[2],degree=True) radec= bovy_coords.lb_to_radec(lbd[:,0],lbd[:,1],degree=True) xieta= pal5_util.radec_to_pal5xieta(radec[:,0],radec[:,1],degree=True) # make sure the progenitor is at (0,0) xieta[:,0]-= numpy.median(xieta[:,0]) xieta[:,1]-= numpy.median(xieta[:,1]) h,e= numpy.histogram(xieta[:,0],range=[0.2,14.3],bins=141) xdata= numpy.arange(0.25,14.35,0.1) # Compute power spectrum tdata= h-0. pp= Polynomial.fit(xdata,tdata,deg=options.polydeg,w=1./numpy.sqrt(h+1.)) tdata/= pp(xdata) ll= xdata py= signal.csd(tdata,tdata,fs=1./(ll[1]-ll[0]),scaling='spectrum', nperseg=len(ll))[1] py= py.real # Also compute the bispectrum Bspec, Bpx= bispectrum.bispectrum(numpy.vstack((tdata,tdata)).T, nfft=len(tdata),wind=7,nsamp=1,overlap=0) ppyr= numpy.fabs(Bspec[len(Bspec)//2+_BISPECIND,len(Bspec)//2:].real) ppyi= numpy.fabs(Bspec[len(Bspec)//2+_BISPECIND,len(Bspec)//2:].imag) return (numpy.sqrt(py*(ll[-1]-ll[0])),numpy.sqrt(h+1.)/pp(xdata), ppyr,ppyi)
def sky_coords(cluster): """Get the sky coordinates of every star in the cluster Parameters ---------- cluster : class StarCluster Returns ------- ra,dec,d0,pmra,pmdec,vr0 : float on-sky positions and velocities of cluster stars History ------- 2018 - Written - Webb (UofT) """ origin0 = cluster.origin if origin0 != "galaxy": cluster.to_galaxy() x0, y0, z0 = bovy_coords.galcenrect_to_XYZ(cluster.x, cluster.y, cluster.z, Xsun=8.0, Zsun=0.025).T vx0, vy0, vz0 = bovy_coords.galcenrect_to_vxvyvz( cluster.vx, cluster.vy, cluster.vz, Xsun=8.0, Zsun=0.025, vsun=[-11.1, 244.0, 7.25], ).T l0, b0, d0 = bovy_coords.XYZ_to_lbd(x0, y0, z0, degree=True).T ra, dec = bovy_coords.lb_to_radec(l0, b0, degree=True).T vr0, pmll0, pmbb0 = bovy_coords.vxvyvz_to_vrpmllpmbb(vx0, vy0, vz0, l0, b0, d0, degree=True).T pmra, pmdec = bovy_coords.pmllpmbb_to_pmrapmdec(pmll0, pmbb0, l0, b0, degree=True).T if origin0 == "centre": cluster.to_centre() elif origin0 == "cluster": cluster.to_cluster() return ra, dec, d0, pmra, pmdec, vr0
def sky_coords(cluster): """ NAME: sky_coords PURPOSE: Get the sky coordinates of every star in the cluster INPUT: cluster - a StarCluster-class object OUTPUT: ra,dec,d0,pmra,pmdec,vr0 HISTORY: 2018 - Written - Webb (UofT) """ origin0 = cluster.origin if origin0 != "galaxy": cluster.to_galaxy() x0, y0, z0 = bovy_coords.galcenrect_to_XYZ( cluster.x, cluster.y, cluster.z, Xsun=8.0, Zsun=0.025 ).T vx0, vy0, vz0 = bovy_coords.galcenrect_to_vxvyvz( cluster.vx, cluster.vy, cluster.vz, Xsun=8.0, Zsun=0.025, vsun=[-11.1, 244.0, 7.25], ).T l0, b0, d0 = bovy_coords.XYZ_to_lbd(x0, y0, z0, degree=True).T ra, dec = bovy_coords.lb_to_radec(l0, b0, degree=True).T vr0, pmll0, pmbb0 = bovy_coords.vxvyvz_to_vrpmllpmbb( vx0, vy0, vz0, l0, b0, d0, degree=True ).T pmra, pmdec = bovy_coords.pmllpmbb_to_pmrapmdec(pmll0, pmbb0, l0, b0, degree=True).T if origin0 == "centre": cluster.to_centre() elif origin0 == "cluster": cluster.to_cluster() return ra, dec, d0, pmra, pmdec, vr0
def get_star_dx(pepperdf, n=1000, returnapar=False, returnxi=False): (Omega, angle, dt) = pepperdf.sample(n=n, returnaAdt=True) RvR = pepperdf._approxaAInv(Omega[0], Omega[1], Omega[2], angle[0], angle[1], angle[2]) vo = pepperdf._vo ro = pepperdf._ro R0 = pepperdf._R0 Zsun = pepperdf._Zsun vsun = pepperdf._vsun XYZ = bovy_coords.galcencyl_to_XYZ(RvR[0] * ro, RvR[5], RvR[3] * ro, Xsun=R0, Zsun=Zsun).T slbd = bovy_coords.XYZ_to_lbd(XYZ[0], XYZ[1], XYZ[2], degree=True) sradec = bovy_coords.lb_to_radec(slbd[:, 0], slbd[:, 1], degree=True) xieta = pal5_util.radec_to_pal5xieta(sradec[:, 0], sradec[:, 1], degree=True) l = slbd[:, 0] b = slbd[:, 1] r = slbd[:, 2] if returnapar: closesttrackindexes = np.zeros(len(r)) for i in np.arange(len(r)): closesttrackindexes[i] = pepperdf.find_closest_trackpoint( RvR[0][i], RvR[1][i], RvR[2][i], RvR[3][i], RvR[4][i], RvR[5][i], interp=True) starapar = pepperdf._interpolatedThetasTrack[( closesttrackindexes).astype(int)] return starapar if returnxi: return xieta[:, 0] else: return None
def galcencyl_to_lbd(R, phi, Z, degree=True): xyz = bovy_coords.galcencyl_to_XYZ(R, phi, Z) lbd = bovy_coords.XYZ_to_lbd(xyz[0], xyz[1], xyz[2], degree=degree) return lbd[0], lbd[1], lbd[2]
def xyzuvw_to_skycoord(xyzuvw_in, solarmotion='schoenrich', reverse_x_sign=True): """Converts XYZUVW with respect to the LSR or the sun to RAdeg, DEdeg, plx, pmra, pmdec, RV Parameters ---------- xyzuvw_in: XYZUVW with respect to the LSR. solarmotion: string The reference of assumed solar motion. "schoenrich" or None if inputs are already relative to the sun. reverse_x_sign: bool Do we reverse the sign of the X co-ordinate? This is needed for dealing with galpy sign conventions. TODO: not working at all... fix this """ if solarmotion == None: xyzuvw_sun = np.zeros(6) elif solarmotion == 'schoenrich': xyzuvw_sun = [0, 0, 25, 11.1, 12.24, 7.25] else: raise UserWarning #Make coordinates relative to sun xyzuvw = xyzuvw_in - xyzuvw_sun #Special for the sun itself... #FIXME: This seems like a hack. #if (np.sum(xyzuvw**2) < 1) and solarmotion != None: # return [0,0,1e5, 0,0,0] #Find l, b and distance. #!!! WARNING: the X-coordinate may have to be reversed here, just like everywhere else, #because of the convention in Orbit.x(), which doesn't seem to match X. if reverse_x_sign: lbd = bovy_coords.XYZ_to_lbd(-xyzuvw[0] / 1e3, xyzuvw[1] / 1e3, xyzuvw[2] / 1e3, degree=True) else: lbd = bovy_coords.XYZ_to_lbd(xyzuvw[0] / 1e3, xyzuvw[1] / 1e3, xyzuvw[2] / 1e3, degree=True) radec = bovy_coords.lb_to_radec(lbd[0], lbd[1], degree=True) vrpmllpmbb = bovy_coords.vxvyvz_to_vrpmllpmbb(xyzuvw[3],xyzuvw[4], xyzuvw[5],\ lbd[0],lbd[1],lbd[2], degree=True) pmrapmdec = bovy_coords.pmllpmbb_to_pmrapmdec(vrpmllpmbb[1], vrpmllpmbb[2], lbd[0], lbd[1], degree=True) return [ radec[0], radec[1], 1.0 / lbd[2], pmrapmdec[0], pmrapmdec[1], vrpmllpmbb[0] ]
def to_radec(cluster, do_order=False, do_key_params=False, ro=8.0, vo=220.0): """Convert to on-sky position, proper motion, and radial velocity of cluster Parameters ---------- cluster : class StarCluster do_order : bool sort star by radius after coordinate change (default: False) do_key_params : bool call key_params to calculate key parameters after unit change (default: False) ro : float galpy radius scaling parameter vo : float galpy velocity scaling parameter Returns ------- None History: ------- 2018 - Written - Webb (UofT) """ if len(cluster.ra) == len(cluster.x): cluster.x = copy(cluster.ra) cluster.y = copy(cluster.dec) cluster.z = copy(cluster.dist) cluster.vx = copy(cluster.pmra) cluster.vy = copy(cluster.pmdec) cluster.vz = copy(cluster.vlos) cluster.units = "radec" cluster.origin = "sky" else: units0, origin0 = cluster.units, cluster.origin cluster.to_galaxy() cluster.to_kpckms() x0, y0, z0 = bovy_coords.galcenrect_to_XYZ(cluster.x, cluster.y, cluster.z, Xsun=8.0, Zsun=0.025).T cluster.dist = np.sqrt(x0**2.0 + y0**2.0 + z0**2.0) vx0, vy0, vz0 = bovy_coords.galcenrect_to_vxvyvz( cluster.vx, cluster.vy, cluster.vz, Xsun=8.0, Zsun=0.025, vsun=[-11.1, 244.0, 7.25], ).T cluster.vlos = (vx0 * x0 + vy0 * y0 + vz0 * z0) / np.sqrt(x0**2.0 + y0**2.0 + z0**2.0) l0, b0, cluster.dist = bovy_coords.XYZ_to_lbd(x0, y0, z0, degree=True).T cluster.ra, cluster.dec = bovy_coords.lb_to_radec(l0, b0, degree=True).T vr0, pmll0, pmbb0 = bovy_coords.vxvyvz_to_vrpmllpmbb(vx0, vy0, vz0, l0, b0, cluster.dist, degree=True).T cluster.pmra, cluster.pmdec = bovy_coords.pmllpmbb_to_pmrapmdec( pmll0, pmbb0, l0, b0, degree=True).T x0, y0, z0 = bovy_coords.galcenrect_to_XYZ(cluster.xgc, cluster.ygc, cluster.zgc, Xsun=8.0, Zsun=0.025) vx0, vy0, vz0 = bovy_coords.galcenrect_to_vxvyvz( cluster.vxgc, cluster.vygc, cluster.vzgc, Xsun=8.0, Zsun=0.025, vsun=[-11.1, 244.0, 7.25], ) cluster.vlos_gc = (vx0 * x0 + vy0 * y0 + vz0 * z0) / np.sqrt(x0**2.0 + y0**2.0 + z0**2.0) l0, b0, cluster.dist_gc = bovy_coords.XYZ_to_lbd(x0, y0, z0, degree=True) cluster.ra_gc, cluster.dec_gc = bovy_coords.lb_to_radec(l0, b0, degree=True) vr0, pmll0, pmbb0 = bovy_coords.vxvyvz_to_vrpmllpmbb(vx0, vy0, vz0, l0, b0, cluster.dist_gc, degree=True) cluster.pmra_gc, cluster.pmdec_gc = bovy_coords.pmllpmbb_to_pmrapmdec( pmll0, pmbb0, l0, b0, degree=True) cluster.x = copy(cluster.ra) cluster.y = copy(cluster.dec) cluster.z = copy(cluster.dist) cluster.vx = copy(cluster.pmra) cluster.vy = copy(cluster.pmdec) cluster.vz = copy(cluster.vlos) cluster.xgc = copy(cluster.ra_gc) cluster.ygc = copy(cluster.dec_gc) cluster.zgc = copy(cluster.dist_gc) cluster.vxgc = copy(cluster.pmra_gc) cluster.vygc = copy(cluster.pmdec_gc) cluster.vzgc = copy(cluster.vlos_gc) cluster.units = "radec" cluster.origin = "sky" cluster.rv3d() if do_key_params: cluster.key_params(do_order=do_order)
def sample_and_hist_apars(pepperdf, apar, survey, nsample): (Omega, angle, dt) = pepperdf.sample(n=nsample, returnaAdt=True) RvR = pepperdf._approxaAInv(Omega[0], Omega[1], Omega[2], angle[0], angle[1], angle[2]) vo = pepperdf._vo ro = pepperdf._ro R0 = pepperdf._R0 Zsun = pepperdf._Zsun vsun = pepperdf._vsun XYZ = bovy_coords.galcencyl_to_XYZ(RvR[0] * ro, RvR[5], RvR[3] * ro, Xsun=R0, Zsun=Zsun).T slbd = bovy_coords.XYZ_to_lbd(XYZ[0], XYZ[1], XYZ[2], degree=True) l = slbd[:, 0] b = slbd[:, 1] r = slbd[:, 2] closesttrackindexes = np.zeros(len(r)) for i in np.arange(len(r)): closesttrackindexes[i] = pepperdf.find_closest_trackpoint(RvR[0][i], RvR[1][i], RvR[2][i], RvR[3][i], RvR[4][i], RvR[5][i], interp=True) starapar = pepperdf._interpolatedThetasTrack[( closesttrackindexes).astype(int)] masses = assign_masses(nsample) if 'LSST' in survey: mag1 = isodict['lsst_g-10.00-0.0001'](masses) + ( 5 * np.log10(r * 1e3) - 5) magerror1 = errormodels[survey]['g'](mag1) mag2 = isodict['lsst_r-10.00-0.0001'](masses) + ( 5 * np.log10(r * 1e3) - 5) magerror2 = errormodels[survey]['r'](mag2) elif survey == 'CASTOR': mag1 = isodict['castor_u-10.00-0.0001'](masses) + ( 5 * np.log10(r * 1e3) - 5) magerror1 = errormodels[survey]['u'](mag1) mag2 = isodict['castor_g-10.00-0.0001'](masses) + ( 5 * np.log10(r * 1e3) - 5) magerror2 = errormodels[survey]['g'](mag2) elif survey == 'WFIRST': mag1 = isodict['Z087-10.00-0.0001'](masses) + (5 * np.log10(r * 1e3) - 5) magerror1 = errormodels[survey]['z'](mag1) mag2 = isodict['H158-10.00-0.0001'](masses) + (5 * np.log10(r * 1e3) - 5) magerror2 = errormodels[survey]['h'](mag2) else: mag1 = isodict['sdss_g-10.00-0.0001'](masses) + ( 5 * np.log10(r * 1e3) - 5) magerror1 = errormodels[survey]['g'](mag1) mag2 = isodict['sdss_r-10.00-0.0001'](masses) + ( 5 * np.log10(r * 1e3) - 5) magerror2 = errormodels[survey]['r'](mag2) omag1 = (mag1 + np.random.normal(size=len(mag1)) * magerror1)[((magerror1 < .1) & (magerror2 < .1))] omag2 = (mag2 + np.random.normal(size=len(mag2)) * magerror2)[((magerror1 < .1) & (magerror2 < .1))] magsel = ((magerror1 < .1) & (magerror2 < .1)) lrange = [340, 360] brange = [37.5, 47.5] skysel = ((l < lrange[1]) & (l > lrange[0]) & (b < brange[1]) & (b > brange[0])) aparbins = np.linspace(apar[0] - (apar[1] - apar[0]) / 2., apar[-1] + 3 * (apar[1] - apar[0]) / 2., len(apar) + 1, endpoint=False) #centroids = bins[1:]-(bins[1]-bins[0])/2. counts, bins = np.histogram(starapar[magsel & skysel], bins=aparbins)