def test_lb_to_radec(): ra, dec= 120, 60. lb= bovy_coords.radec_to_lb(ra,dec,degree=True,epoch=2000.) rat, dect= bovy_coords.lb_to_radec(lb[0],lb[1],degree=True,epoch=2000.) assert numpy.fabs(ra-rat) < 10.**-10., 'lb_to_radec is not the inverse of radec_to_lb' assert numpy.fabs(dec-dect) < 10.**-10., 'lb_to_radec is not the inverse of radec_to_lb' # Also test this for degree=False lb= bovy_coords.radec_to_lb(ra/180.*numpy.pi,dec/180.*numpy.pi, degree=False,epoch=2000.) rat, dect= bovy_coords.lb_to_radec(lb[0],lb[1],degree=False,epoch=2000.) assert numpy.fabs(ra/180.*numpy.pi-rat) < 10.**-10., 'lb_to_radec is not the inverse of radec_to_lb' assert numpy.fabs(dec/180.*numpy.pi-dect) < 10.**-10., 'lb_to_radec is not the inverse of radec_to_lb' # And also test this for arrays os= numpy.ones(2) lb= bovy_coords.radec_to_lb(os*ra/180.*numpy.pi,os*dec/180.*numpy.pi, degree=False,epoch=2000.) ratdect= bovy_coords.lb_to_radec(lb[:,0],lb[:,1],degree=False,epoch=2000.) rat= ratdect[:,0] dect= ratdect[:,1] assert numpy.all(numpy.fabs(ra/180.*numpy.pi-rat) < 10.**-10.), 'lb_to_radec is not the inverse of radec_to_lb' assert numpy.all(numpy.fabs(dec/180.*numpy.pi-dect) < 10.**-10.), 'lb_to_radec is not the inverse of radec_to_lb' #Also test for a negative l l,b= 240., 60. ra,dec= bovy_coords.lb_to_radec(l,b,degree=True) lt,bt= bovy_coords.radec_to_lb(ra,dec,degree=True) assert numpy.fabs(lt-l) < 10.**-10., 'lb_to_radec is not the inverse of radec_to_lb' assert numpy.fabs(bt-b) < 10.**-10., 'lb_to_radec is not the inverse of radec_to_lb' return None
def test_radec_to_lb_ngp(): # Test that the NGP is at b=90 ra, dec= 192.25, 27.4 lb= bovy_coords.radec_to_lb(ra,dec,degree=True,epoch=1950.) assert numpy.fabs(lb[1]-90.) < 10.**-8., 'Galactic latitude of the NGP given in ra,dec is not 90' # Also test this for degree=False lb= bovy_coords.radec_to_lb(ra/180.*numpy.pi,dec/180.*numpy.pi, degree=False,epoch=1950.) assert numpy.fabs(lb[1]-numpy.pi/2.) < 10.**-8., 'Galactic latitude of the NGP given in ra,dec is not pi/2' return None
def test_radec_to_lb_ncp(): ra, dec= 180., 90. lb= bovy_coords.radec_to_lb(ra,dec,degree=True,epoch=1950.) assert numpy.fabs(lb[0]-123.) < 10.**-8., 'Galactic longitude of the NCP given in ra,dec is not 123' # Also test this for degree=False lb= bovy_coords.radec_to_lb(ra/180.*numpy.pi,dec/180.*numpy.pi, degree=False,epoch=1950.) assert numpy.fabs(lb[0]-123./180.*numpy.pi) < 10.**-8., 'Galactic longitude of the NCP given in ra,dec is not 123' # Also test the latter for vector inputs os= numpy.ones(2) lb= bovy_coords.radec_to_lb(os*ra/180.*numpy.pi,os*dec/180.*numpy.pi, degree=False,epoch=1950.) assert numpy.all(numpy.fabs(lb[:,0]-123./180.*numpy.pi) < 10.**-8.), 'Galactic longitude of the NCP given in ra,dec is not 123' return None
def phi12_to_lb(phi1,phi2,degree=False): """ NAME: phi12_to_lb PURPOSE: Transform (phi1,phi2) to Galactic coordinates (l,b) INPUT: phi1 - phi longitude (rad or degree) phi2 - phi latitude (rad or degree) degree= (False) if True, input and output are in degrees OUTPUT: (l,b) for scalar input [:,2] array for vector input HISTORY: 2014-11-04 - Written - Bovy (IAS) """ #Convert phi1,phi2 to l,b coordinates phiXYZ= numpy.array([numpy.cos(phi2)*numpy.cos(phi1), numpy.cos(phi2)*numpy.sin(phi1), numpy.sin(phi2)]) eqXYZ= numpy.dot(_TKOP.T,phiXYZ) #Get ra dec dec= numpy.arcsin(eqXYZ[2]) ra= numpy.arctan2(eqXYZ[1],eqXYZ[0]) ra[ra<0.]+= 2.*numpy.pi #Now convert to l,b return bovy_coords.radec_to_lb(ra,dec)
def convert(): global req_params #if position given in ra & dec, convert to l & b if (req_params.get('l') == -9.999): req_params['l'], req_params['b'] = b_c.radec_to_lb(req_params['ra'], req_params['dec'], degree=True, epoch=2000.0) #if position given in l & b, convert to ra & dec if (req_params.get('ra') == -9.999): req_params['ra'], req_params['dec'] = b_c.lb_to_radec(req_params['l'], req_params['b'], degree=True, epoch=2000.0) #if proper motion given in pmra & pmdec, convert to pml & pmb if (req_params.get('pml') == -9.999): req_params['pml'], req_params['pmb'] = b_c.pmrapmdec_to_pmllpmbb( req_params['pmra'], req_params['pmdec'], req_params['ra'], req_params['dec'], degree=True, epoch=2000.0)
def read_mgiant(self): dpath = "/Users/htian/Documents/GitHub/rothalo/data/dr4_mgiant.csv" ra, dec, rv, dist, sn, feh = np.loadtxt(dpath, skiprows=1, usecols=(0, 1, 2, 9, 10, 11), delimiter=',', unpack=True) ind_o = (rv > -10000000) & (sn > 10) & (feh > self.min_feh) & ( feh < self.max_feh) & (dist > -1000) print(len(sn[sn < 10]), len(sn)) print("there are ", len(ra[ind_o]), " stars readout!") # ra_o = data_halo[ind_o, 1] # dec_o = data_halo[ind_o, 2] lb = gub.radec_to_lb(ra, dec, degree=True) l = lb[:, 0] b = lb[:, 1] xyz = gub.lbd_to_XYZ(l, b, dist, degree=True) self.l_o = l[ind_o] self.b_o = b[ind_o] self.feh_o = feh[ind_o] self.rv_o = rv[ind_o] self.dist_o = dist[ind_o] self.Z_o = xyz[ind_o, 2] self.R_o = np.sqrt((8 - xyz[ind_o, 0])**2 + xyz[ind_o, 1]**2) self.name = "DR4_mgiant"
def pmradec_to_pmlb(R,ra,dec,vr,vra,vdec): ''' proper motion in equatorial coordinates to proper motion in Galactic coordinates to use in Jo's function to convert to proper motion in stream coordinates ''' l,b = bovy_coords.radec_to_lb(ra,dec,degree=False,epoch=2000.0) dec_NGP = 27.12825 # degrees ra_NGP = 192.85948 # degrees dec_NGP *= np.pi/180. ra_NGP *= np.pi/180. num1 = np.sin(dec_NGP) - (np.sin(dec) * np.sin(b)) denom1 = np.cos(dec) * np.cos(b) num2 = np.sin(ra-ra_NGP) * np.cos(dec_NGP) denom2 = np.cos(b) cos_phi = num1/denom1 sin_phi = num2/denom2 M = np.zeros((3,3)) M[0,:] = [1,0,0] M[1,:] = [0,cos_phi,sin_phi] M[2,:] = [0,-sin_phi,cos_phi] C = np.array([vr,1./R * vra,np.cos(dec),1./R * vdec]) val = np.dot(M,C) return val
def phi12_to_lb(phi1,phi2,degree=False): """ NAME: phi12_to_lb PURPOSE: Transform (phi1,phi2) to Galactic coordinates (l,b) INPUT: phi1 - phi longitude (rad or degree) phi2 - phi latitude (rad or degree) degree= (False) if True, input and output are in degrees OUTPUT: (l,b) for scalar input [:,2] array for vector input HISTORY: 2014-11-04 - Written - Bovy (IAS) """ import numpy _TKOP= numpy.zeros((3,3)) _TKOP[0,:]= [-0.4776303088,-0.1738432154,0.8611897727] _TKOP[1,:]= [0.510844589,-0.8524449229,0.111245042] _TKOP[2,:]= [0.7147776536,0.4930681392,0.4959603976] #Convert phi1,phi2 to l,b coordinates phiXYZ= numpy.array([numpy.cos(phi2)*numpy.cos(phi1), numpy.cos(phi2)*numpy.sin(phi1), numpy.sin(phi2)]) eqXYZ= numpy.dot(_TKOP.T,phiXYZ) #Get ra dec dec= numpy.arcsin(eqXYZ[2]) ra= numpy.arctan2(eqXYZ[1],eqXYZ[0]) ra[ra<0.]+= 2.*numpy.pi #Now convert to l,b return bovy_coords.radec_to_lb(ra,dec)
def hackGCS(cutbinaries=True,cutvalidfeh=True,cutfeh=True, casagrande=False,irfm=True): data= readGCS.readGCS(cutbinaries=cutbinaries, cutvalidfeh=cutvalidfeh, cutfeh=cutfeh, casagrande=casagrande,irfm=irfm) #To allow for XY pixelization, we will hack these data= esutil.numpy_util.add_fields(data,[('RC_GALR', float), ('RC_GALPHI', float), ('RA',float), ('DEC',float), ('GLON',float), ('GLAT',float)]) ras= numpy.empty(len(data)) decs= numpy.empty(len(data)) for ii in range(len(data)): c = SkyCoord(str(data['RAh'][ii])+'h'+str(data['RAm'][ii])+'m' +str(data['RAs'][ii])+'s', str(data['DE-'][ii])+str(data['DEd'][ii])+'d' +str(data['DEm'][ii])+'m'+str(data['DEs'][ii])+'s', 'icrs') ras[ii]= c.ra.degree decs[ii]= c.dec.degree llbb= bovy_coords.radec_to_lb(ras,decs,degree=True) data['RA']= ras data['DEC']= decs data['GLON']= llbb[:,0] data['GLAT']= llbb[:,1] data['RC_GALR']= data['Dist']/1000.*numpy.cos(llbb[:,1]/180.*numpy.pi) data['RC_GALPHI']= llbb[:,0]/180.*numpy.pi return data
def obs_to_galcen(ra, dec, dist, pmra, pmdec, rv, ro=_R0, vo=_v0, zo=_z0): vxvv = np.dstack([ra, dec, dist, pmra, pmdec, rv])[0] ra, dec = vxvv[:, 0], vxvv[:, 1] lb = bovy_coords.radec_to_lb(ra, dec, degree=True) pmra, pmdec = vxvv[:, 3], vxvv[:, 4] pmllpmbb = bovy_coords.pmrapmdec_to_pmllpmbb(pmra, pmdec, ra, dec, degree=True) d, vlos = vxvv[:, 2], vxvv[:, 5] rectgal = bovy_coords.sphergal_to_rectgal(lb[:, 0], lb[:, 1], d, vlos, pmllpmbb[:, 0], pmllpmbb[:, 1], degree=True) vsolar = np.array([-11.1, 245.7, 7.25]) vsun = vsolar / vo X = rectgal[:, 0] / ro Y = rectgal[:, 1] / ro Z = rectgal[:, 2] / ro vx = rectgal[:, 3] / vo vy = rectgal[:, 4] / vo vz = rectgal[:, 5] / vo XYZ = np.dstack([X, Y, Z])[0] vxyz = np.dstack([vx, vy, vz])[0] Rpz = bovy_coords.XYZ_to_galcencyl(XYZ[:, 0], XYZ[:, 1], XYZ[:, 2], Zsun=zo / ro) vRvTvz = bovy_coords.vxvyvz_to_galcencyl(vxyz[:, 0], vxyz[:, 1], vxyz[:, 2], Rpz[:, 0], Rpz[:, 1], Rpz[:, 2], vsun=vsun, Xsun=1., Zsun=zo / ro, galcen=True) return XYZ, vxyz, Rpz, vRvTvz
def force_pal5(pot: PotentialType, dpal5: float, ro: float = REFR0, vo: float = REFV0) -> Tuple[float]: """Return the force at Pal5. Parameters ---------- pot: Potential, list dpal5: float ro, vo: float Return ------ force: tuple [fx, fy, fz] """ from galpy import potential from galpy.util import bovy_coords # First compute the location based on the distance l5, b5 = bovy_coords.radec_to_lb(229.018, -0.124, degree=True) X5, Y5, Z5 = bovy_coords.lbd_to_XYZ(l5, b5, dpal5, degree=True) R5, p5, Z5 = bovy_coords.XYZ_to_galcencyl(X5, Y5, Z5, Xsun=ro, Zsun=0.025) args: list = [pot, R5 / ro, Z5 / ro] kws: dict = {"phi": p5, "use_physical": True, "ro": ro, "vo": vo} return ( potential.evaluateRforces(*args, **kws), potential.evaluatezforces(*args, **kws), potential.evaluatephiforces(*args, **kws), )
def test_radec_to_lb_otherepochs(): ra, dec= 180., 90. try: lb= bovy_coords.radec_to_lb(ra/180.*numpy.pi,dec/180.*numpy.pi, degree=False,epoch=1975.) except IOError: pass else: raise AssertionError('radec functions with epoch not equal to 1950 or 2000 did not raise IOError')
def plot_dust_gaia(dist, plotname): # Load the dust map green15map = dust.load_combined(dist, nest=True, nside_out=_NSIDE) dm = dust.dist2distmod(dist) green15map[green15map == healpy.UNSEEN] = -1. print "%i are NaN" % (numpy.sum(numpy.isnan(green15map))) #theta, phi= healpy.pixelfunc.pix2ang(_NSIDE,numpy.arange(healpy.pixelfunc.nside2npix(_NSIDE)),nest=True) #print (numpy.pi/2.-theta)[numpy.isnan(green15map)]/numpy.pi*180. #print phi[numpy.isnan(green15map)]/numpy.pi*180. # plot it healpy.visufunc.mollview(green15map, nest=True, xsize=4000, min=0., max=round(10. * (20. - dm - 0.68)) / 10., format=r'$%g$', cmap='gist_yarg', title="", unit='$A_G\,(\mathrm{mag})$') # Plot outline of Marshall et al. ls = numpy.linspace(-100.125, 100.125, 1001) healpy.visufunc.projplot(ls, ls * 0. - 10.125, 'k--', lw=1.2, lonlat=True) healpy.visufunc.projplot(ls, ls * 0. + 10.125, 'k--', lw=1.2, lonlat=True) bs = numpy.linspace(-10.125, 10.125, 1001) healpy.visufunc.projplot(bs * 0. - 100.125, bs, 'k--', lw=1.2, lonlat=True) healpy.visufunc.projplot(bs * 0. + 100.125, bs, 'k--', lw=1.2, lonlat=True) # Plot boundary of Green et al. map, dec > -30. ras = numpy.linspace(0., 360., 1001) decs = ras * 0. - 30. lbs = bovy_coords.radec_to_lb(ras, decs, degree=True) ls = lbs[:, 0] bs = lbs[:, 1] # rm those within Marshall et al. keepIndx = True - ((ls > 259.875) * (numpy.fabs(bs) < 10.125) + (ls < 100.125) * (numpy.fabs(bs) < 10.125)) ls = ls[keepIndx] bs = bs[keepIndx] healpy.visufunc.projplot(ls, bs, 'k-.', lw=1.2, lonlat=True) # Labels healpy.visufunc.projtext(350., -8., r'$\mathrm{Marshall\ et\ al.\ (2006)}$', lonlat=True, size=13.) healpy.visufunc.projtext(10., -60., r'$\mathrm{Drimmel\ et\ al.\ (2003)}$', lonlat=True, size=13.) healpy.visufunc.projtext(160., 40., r'$\mathrm{Green\ et\ al.\ (2015)}$', lonlat=True, size=13.) bovy_plot.bovy_end_print(plotname)
def measure_kinematics_onepop(tgas,twomass,jk,dm,mj,spii,zbins,options, csvwriter,csvout,maxcovar=30.): # Compute XYZ lb= bovy_coords.radec_to_lb(tgas['ra'],tgas['dec'],degree=True,epoch=None) XYZ= bovy_coords.lbd_to_XYZ(lb[:,0],lb[:,1],1./tgas['parallax'], degree=True) # Generate vradec and projection matrix vradec= numpy.array([bovy_coords._K/tgas['parallax']*tgas['pmra'], bovy_coords._K/tgas['parallax']*tgas['pmdec']]) proj= compute_projection(tgas) # Sample from the joint (parallax,proper motion) uncertainty distribution # to get the covariance matrix of the vradec, using MC sims nmc= 10001 vradec_cov= compute_vradec_cov_mc(tgas,nmc) # Fit each zbin if spii == options.start: startz= options.startz else: startz= 0 for ii in tqdm.trange(startz,len(zbins)-1): indx= (XYZ[:,2] > zbins[ii])\ *(XYZ[:,2] <= zbins[ii+1])\ *(numpy.sqrt(XYZ[:,0]**2.+XYZ[:,1]**2.) < 0.2) nstar= numpy.sum(indx) if numpy.sum(indx) < 30: continue # Basic XD fit ydata= vradec.T[indx] ycovar= numpy.zeros_like(vradec.T)[indx] initamp= numpy.random.uniform(size=options.ngauss) initamp/= numpy.sum(initamp) m= numpy.zeros(3) s= numpy.array([40.,40.,20.]) initmean= [] initcovar= [] for jj in range(options.ngauss): initmean.append(m+numpy.random.normal(size=3)*s) initcovar.append(4.*s**2.*numpy.diag(numpy.ones(3))) initcovar= numpy.array(initcovar) initmean= numpy.array(initmean) lnL= extreme_deconvolution(ydata,ycovar,initamp,initmean,initcovar, projection=proj[indx]) sig2z= combined_sig2(initamp,initmean[:,2],initcovar[:,2,2], maxcovar=maxcovar) kurtz= combined_k(initamp,initmean[:,2],initcovar[:,2,2], maxcovar=maxcovar) sam= bootstrap(options.nboot, vradec.T[indx],vradec_cov[indx],proj[indx], ngauss=options.ngauss,maxcovar=maxcovar) sig2z_err= 1.4826*numpy.median(numpy.fabs(sam[0]-numpy.median(sam[0]))) kurtz_err= 1.4826*numpy.median(numpy.fabs(sam[1]-numpy.median(sam[1]))) sig2kurtz_corr= numpy.corrcoef(sam)[0,1] csvwriter.writerow([spii,ii,nstar, sig2z,sig2z_err,kurtz,kurtz_err,sig2kurtz_corr]) csvout.flush() return None
def force_pal5(pot,dpal5,ro,vo): """Return the force at Pal5""" # First compute the location based on the distance l5, b5= bovy_coords.radec_to_lb(229.018,-0.124,degree=True) X5,Y5,Z5= bovy_coords.lbd_to_XYZ(l5,b5,dpal5,degree=True) R5,p5,Z5= bovy_coords.XYZ_to_galcencyl(X5,Y5,Z5,Xsun=ro,Zsun=0.025) return (potential.evaluateRforces(pot,R5/ro,Z5/ro,phi=p5, use_physical=True,ro=ro,vo=vo), potential.evaluatezforces(pot,R5/ro,Z5/ro,phi=p5, use_physical=True,ro=ro,vo=vo), potential.evaluatephiforces(pot,R5/ro,Z5/ro,phi=p5, use_physical=True,ro=ro,vo=vo))
def test_coords(): from galpy.util import bovy_coords ra, dec, dist = 161., 50., 8.5 pmra, pmdec, vlos = -6.8, -10., -115. # Convert to Galactic and then to rect. Galactic ll, bb = bovy_coords.radec_to_lb(ra, dec, degree=True) pmll, pmbb = bovy_coords.pmrapmdec_to_pmllpmbb(pmra, pmdec, ra, dec, degree=True) X, Y, Z = bovy_coords.lbd_to_XYZ(ll, bb, dist, degree=True) vX, vY, vZ = bovy_coords.vrpmllpmbb_to_vxvyvz(vlos, pmll, pmbb, X, Y, Z, XYZ=True) # Convert to cylindrical Galactocentric # Assuming Sun's distance to GC is (8,0.025) in (R,z) R, phi, z = bovy_coords.XYZ_to_galcencyl(X, Y, Z, Xsun=8., Zsun=0.025) vR, vT, vz = bovy_coords.vxvyvz_to_galcencyl(vX, vY, vZ, R, phi, Z, vsun=[-10.1, 244., 6.7], galcen=True) # 5/12/2016: test weakened, because improved galcen<->heliocen # transformation has changed these, but still close print(R, phi, z, vR, vT, vz) assert numpy.fabs(R - 12.51328515156942 ) < 10.**-1., 'Coordinate transformation has changed' assert numpy.fabs(phi - 0.12177409073433249 ) < 10.**-1., 'Coordinate transformation has changed' assert numpy.fabs(z - 7.1241282354856228 ) < 10.**-1., 'Coordinate transformation has changed' assert numpy.fabs(vR - 78.961682923035966 ) < 10.**-1., 'Coordinate transformation has changed' assert numpy.fabs(vT + 241.49247772351964 ) < 10.**-1., 'Coordinate transformation has changed' assert numpy.fabs(vz + 102.83965442188689 ) < 10.**-1., 'Coordinate transformation has changed' return None
def plot_dust_gaia(dist,plotname): # Load the dust map green15map= dust.load_combined(dist,nest=True,nside_out=_NSIDE) dm= dust.dist2distmod(dist) green15map[green15map == healpy.UNSEEN]= -1. print "%i are NaN" % (numpy.sum(numpy.isnan(green15map))) #theta, phi= healpy.pixelfunc.pix2ang(_NSIDE,numpy.arange(healpy.pixelfunc.nside2npix(_NSIDE)),nest=True) #print (numpy.pi/2.-theta)[numpy.isnan(green15map)]/numpy.pi*180. #print phi[numpy.isnan(green15map)]/numpy.pi*180. # plot it healpy.visufunc.mollview(green15map, nest=True, xsize=4000,min=0., max=round(10.*(20.-dm-0.68))/10., format=r'$%g$', cmap='gist_yarg', title="", unit='$A_G\,(\mathrm{mag})$') # Plot outline of Marshall et al. ls= numpy.linspace(-100.125,100.125,1001) healpy.visufunc.projplot(ls,ls*0.-10.125,'k--',lw=1.2,lonlat=True) healpy.visufunc.projplot(ls,ls*0.+10.125,'k--',lw=1.2,lonlat=True) bs= numpy.linspace(-10.125,10.125,1001) healpy.visufunc.projplot(bs*0.-100.125,bs,'k--',lw=1.2,lonlat=True) healpy.visufunc.projplot(bs*0.+100.125,bs,'k--',lw=1.2,lonlat=True) # Plot boundary of Green et al. map, dec > -30. ras= numpy.linspace(0.,360.,1001) decs= ras*0.-30. lbs= bovy_coords.radec_to_lb(ras,decs,degree=True) ls= lbs[:,0] bs= lbs[:,1] # rm those within Marshall et al. keepIndx= True-((ls > 259.875)*(numpy.fabs(bs) < 10.125) +(ls < 100.125)*(numpy.fabs(bs) < 10.125)) ls= ls[keepIndx] bs= bs[keepIndx] healpy.visufunc.projplot(ls,bs,'k-.',lw=1.2,lonlat=True) # Labels healpy.visufunc.projtext(350.,-8.,r'$\mathrm{Marshall\ et\ al.\ (2006)}$', lonlat=True,size=13.) healpy.visufunc.projtext(10.,-60.,r'$\mathrm{Drimmel\ et\ al.\ (2003)}$', lonlat=True,size=13.) healpy.visufunc.projtext(160.,40.,r'$\mathrm{Green\ et\ al.\ (2015)}$', lonlat=True,size=13.) bovy_plot.bovy_end_print(plotname)
def select_targets(outfile, location): numpy.random.seed(location) datafilename = '../target_info/SecQuanObj_%03i+00.fits' % location data = fitsio.read(datafilename) # De-redden ak = data['AK'] aj = ak * 2.5 j0 = data['J_M'] - aj k0 = data['K_M'] - ak # Cut on jk0,h indx = ((j0 - k0) > 0.8) * (data['H_M'] > 12.) * (data['H_M'] < 13.) data = data[indx] # setup dust map dmap = mwdust.Marshall06(filter='2MASS H') # Calculate A_H(7 kpc) according to Marshall et al. (2006) ahdmap = numpy.zeros(len(data)) lb = bovy_coords.radec_to_lb(data['RA'], data['DEC'], degree=True) for ii in range(len(data)): ahdmap[ii] = dmap(lb[ii, 0], lb[ii, 1], 7.) # Cut on AH <= 1.4 indx = ahdmap <= 1.4 data = data[indx] # Match against already drilled targets data = esutil.numpy_util.add_fields(data, [('FLAG_DONT_OBSERVE', int)]) data['FLAG_DONT_OBSERVE'] = 0 yannyfiles = glob.glob('../target_info/plateHolesSorted-*.par') for yannyfile in yannyfiles: drillFile = yanny.yanny(filename=yannyfile, np=True) drilled = drillFile['STRUCT1'] # spherematch h = esutil.htm.HTM() m1, m2, d12 = h.match(data['RA'], data['DEC'], drilled['target_ra'], drilled['target_dec'], 2. / 3600., maxmatch=1) data['FLAG_DONT_OBSERVE'][m1] = 1 # Write to file fitsio.write(outfile, data[numpy.random.permutation(len(data))], clobber=True) return None
def test_coords(): from galpy.util import bovy_coords ra, dec, dist= 161., 50., 8.5 pmra, pmdec, vlos= -6.8, -10., -115. # Convert to Galactic and then to rect. Galactic ll, bb= bovy_coords.radec_to_lb(ra,dec,degree=True) pmll, pmbb= bovy_coords.pmrapmdec_to_pmllpmbb(pmra,pmdec,ra,dec,degree=True) X,Y,Z= bovy_coords.lbd_to_XYZ(ll,bb,dist,degree=True) vX,vY,vZ= bovy_coords.vrpmllpmbb_to_vxvyvz(vlos,pmll,pmbb,X,Y,Z,XYZ=True) # Convert to cylindrical Galactocentric # Assuming Sun's distance to GC is (8,0.025) in (R,z) R,phi,z= bovy_coords.XYZ_to_galcencyl(X,Y,Z,Xsun=8.,Zsun=0.025) vR,vT,vz= bovy_coords.vxvyvz_to_galcencyl(vX,vY,vZ,R,phi,Z,vsun=[-10.1,244.,6.7],galcen=True) assert numpy.fabs(R-12.51328515156942) < 10.**-4., 'Coordinate transformation has changed' assert numpy.fabs(phi-0.12177409073433249) < 10.**-4., 'Coordinate transformation has changed' assert numpy.fabs(z-7.1241282354856228) < 10.**-4., 'Coordinate transformation has changed' assert numpy.fabs(vR-78.961682923035966) < 10.**-4., 'Coordinate transformation has changed' assert numpy.fabs(vT+241.49247772351964) < 10.**-4., 'Coordinate transformation has changed' assert numpy.fabs(vz+102.83965442188689) < 10.**-4., 'Coordinate transformation has changed' return None
def __call__(self, dist, ra, dec, MJ=None, JK=None): """ NAME: __call__ PURPOSE: Evaluate the effective selection function INPUT: distance - distance in kpc (can be array) ra, dec - sky coordinates (deg), scalars MJ= (object-wide default) absolute magnitude in J or an array of samples of absolute magnitudes in J for the tracer population JK= (object-wide default) J-Ks color or an array of samples of the J-Ks color OUTPUT effective selection fraction HISTORY: 2017-01-18 - Written - Bovy (UofT/CCA) """ if isinstance(dist, (int, float)): dist = numpy.array([dist]) elif isinstance(dist, list): dist = numpy.array(dist) MJ, JK = self._parse_mj_jk(MJ, JK) distmod = 5. * numpy.log10(dist) + 10. # Extract the distribution of A_J and A_J-A_Ks at this distance # from the dust map, use twice the radius of a pixel for this lcen, bcen = bovy_coords.radec_to_lb(ra, dec, degree=True) pixarea, aj= self._dmap3d.dust_vals_disk(\ lcen,bcen,dist,healpy.nside2resol(_BASE_NSIDE)/numpy.pi*180.) totarea = numpy.sum(pixarea) ejk = aj * (1. - 1. / 2.5) # Assume AJ/AK = 2.5 distmod = numpy.tile(distmod, (aj.shape[0], 1)) pixarea = numpy.tile(pixarea, (len(dist), 1)).T out = numpy.zeros_like(dist) for mj, jk in zip(MJ, JK): tj = mj + distmod + aj tjk = jk + ejk out += numpy.sum(pixarea * self._tgasSel(tj, tjk, ra, dec), axis=0) if not self._maxd is None: out[dist > self._maxd] = 0. return out / totarea / len(MJ)
def select_targets(outfile,location): numpy.random.seed(location) datafilename= '../target_info/SecQuanObj_%03i+00.fits' % location data= fitsio.read(datafilename) # De-redden ak= data['AK'] aj= ak*2.5 j0= data['J_M']-aj k0= data['K_M']-ak # Cut on jk0,h indx= ((j0-k0) > 0.8)*(data['H_M'] > 12.)*(data['H_M'] < 13.) data= data[indx] # setup dust map dmap= mwdust.Marshall06(filter='2MASS H') # Calculate A_H(7 kpc) according to Marshall et al. (2006) ahdmap= numpy.zeros(len(data)) lb= bovy_coords.radec_to_lb(data['RA'],data['DEC'],degree=True) for ii in range(len(data)): ahdmap[ii]= dmap(lb[ii,0],lb[ii,1],7.) # Cut on AH <= 1.4 indx= ahdmap <= 1.4 data= data[indx] # Match against already drilled targets data= esutil.numpy_util.add_fields(data,[('FLAG_DONT_OBSERVE', int)]) data['FLAG_DONT_OBSERVE']= 0 yannyfiles= glob.glob('../target_info/plateHolesSorted-*.par') for yannyfile in yannyfiles: drillFile= yanny.yanny(filename=yannyfile,np=True) drilled= drillFile['STRUCT1'] # spherematch h=esutil.htm.HTM() m1,m2,d12 = h.match(data['RA'],data['DEC'], drilled['target_ra'],drilled['target_dec'], 2./3600.,maxmatch=1) data['FLAG_DONT_OBSERVE'][m1]= 1 # Write to file fitsio.write(outfile,data[numpy.random.permutation(len(data))], clobber=True) return None
def test_pmllpmbb_to_pmrapmdec(): #This is a random l,b ll, bb= 132., -20.4 pmll, pmbb= 10., 20. pmra, pmdec= bovy_coords.pmllpmbb_to_pmrapmdec(pmll,pmbb, ll,bb, degree=True,epoch=1950.) assert numpy.fabs(numpy.sqrt(pmll**2.+pmbb**2.)-numpy.sqrt(pmra**2.+pmdec**2.)) < 10.**-10., 'pmllpmbb_to_pmrapmdec conversion did not work as expected for a random l,b' # This is close to the NGP ll,bb= numpy.pi-0.001, numpy.pi/2.-0.001 pmll, pmbb= 10., 20. os= numpy.ones(2) pmrapmdec= bovy_coords.pmllpmbb_to_pmrapmdec(os*pmll,os*pmbb, os*ll,os*bb, degree=False,epoch=1950.) pmra= pmrapmdec[:,0] pmdec= pmrapmdec[:,1] assert numpy.all(numpy.fabs(numpy.sqrt(pmll**2.+pmbb**2.)-numpy.sqrt(pmra**2.+pmdec**2.)) < 10.**-10.), 'pmllpmbb_to_pmrapmdec conversion did not work as expected close to the NGP' # This is the NGP ll,bb= numpy.pi, numpy.pi/2. pmll, pmbb= 10., 20. os= numpy.ones(2) pmrapmdec= bovy_coords.pmllpmbb_to_pmrapmdec(os*pmll,os*pmbb, os*ll,os*bb, degree=False,epoch=1950.) pmra= pmrapmdec[:,0] pmdec= pmrapmdec[:,1] assert numpy.all(numpy.fabs(numpy.sqrt(pmll**2.+pmbb**2.)-numpy.sqrt(pmra**2.+pmdec**2.)) < 10.**-10.), 'pmllpmbb_to_pmrapmdec conversion did not work as expected at the NGP' # This is the NCP ra, dec= numpy.pi, numpy.pi/2. ll, bb= bovy_coords.radec_to_lb(ra,dec,degree=False,epoch=1950.) pmll, pmbb= 10., 20. pmra, pmdec= bovy_coords.pmllpmbb_to_pmrapmdec(pmll,pmbb, ll,bb, degree=False,epoch=1950.) assert numpy.fabs(numpy.sqrt(pmll**2.+pmbb**2.)-numpy.sqrt(pmra**2.+pmdec**2.)) < 10.**-10., 'pmllpmbb_to_pmrapmdec conversion did not work as expected at the NCP' return None
def comove_coords(t, lit_gaia): ###could add other outputs like Vr, pred, in addition to sep,sep3d,and Vtan off ra = t.target_df.squeeze()['ra'] * u.deg dec = t.target_df.squeeze()['dec'] * u.deg distance = (1000.0 / t.target_df.squeeze()['parallax']) * u.pc radvel = t.target_df.squeeze( )['dr2_radial_velocity'] * u.kilometer / u.second pmra = t.target_df.squeeze()['pmra'] * u.mas / u.year pmdec = t.target_df.squeeze()['pmdec'] * u.mas / u.year Pcoord = SkyCoord( ra=ra, dec=dec, \ distance=distance, frame='icrs' , \ radial_velocity=radvel , \ pm_ra_cosdec= pmra , pm_dec= pmdec ) # # Query Gaia with search radius and parallax cut # # Note, a cut on parallax_error was added because searches at low galactic latitude # # return an overwhelming number of noisy sources that scatter into the search volume - ALK 20210325 # print('Querying Gaia for neighbors') # if (searchradpc < Pcoord.distance): # sqltext = "SELECT * FROM gaiaedr3.gaia_source WHERE CONTAINS( \ # POINT('ICRS',gaiaedr3.gaia_source.ra,gaiaedr3.gaia_source.dec), \ # CIRCLE('ICRS'," + str(Pcoord.ra.value) +","+ str(Pcoord.dec.value) +","+ str(searchraddeg.value) +"))\ # =1 AND parallax>" + str(minpar.value) + " AND parallax_error<0.5;" # if (searchradpc >= Pcoord.distance): # sqltext = "SELECT * FROM gaiaedr3.gaia_source WHERE parallax>" + str(minpar.value) + " AND parallax_error<0.5;" # print('Note, using all-sky search') # if verbose == True: # print(sqltext) # print() # job = Gaia.launch_job_async(sqltext , dump_to_file=False) # r = job.get_results() # if verbose == True: print('Number of records: ',len(r['ra'])) # # Construct coordinates array for all stars returned in cone search # gaiacoord = SkyCoord( ra=r['ra'] , dec=r['dec'] , distance=(1000.0/r['parallax'])*u.parsec , \ # frame='icrs' , \ # pm_ra_cosdec=r['pmra'] , pm_dec=r['pmdec'] ) lit_sc = SkyCoord( ra=lit_gaia.ra.to_numpy(dtype='float') * u.deg, dec=lit_gaia.dec.to_numpy(dtype='float') * u.deg, pm_ra_cosdec=lit_gaia.pmra.to_numpy(dtype='float') * u.mas / u.yr, pm_dec=lit_gaia.pmdec.to_numpy(dtype='float') * u.mas / u.yr, distance=u.pc * (1000. / lit_gaia.parallax.to_numpy(dtype='float'))) sep = lit_sc.separation(Pcoord) #in degrees sep3d = lit_sc.separation_3d(Pcoord) #in parsec Pllbb = bc.radec_to_lb(Pcoord.ra.value, Pcoord.dec.value, degree=True) Ppmllpmbb = bc.pmrapmdec_to_pmllpmbb( Pcoord.pm_ra_cosdec.value , Pcoord.pm_dec.value , \ Pcoord.ra.value , Pcoord.dec.value , degree=True ) Pvxvyvz = bc.vrpmllpmbb_to_vxvyvz(Pcoord.radial_velocity.value , Ppmllpmbb[0] , Ppmllpmbb[1] , \ Pllbb[0] , Pllbb[1] , Pcoord.distance.value/1000.0 , XYZ=False , degree=True) Gllbb = bc.radec_to_lb(lit_sc.ra.value, lit_sc.dec.value, degree=True) Gxyz = bc.lbd_to_XYZ(Gllbb[:, 0], Gllbb[:, 1], lit_sc.distance / 1000.0, degree=True) Gvrpmllpmbb = bc.vxvyvz_to_vrpmllpmbb( \ Pvxvyvz[0]*np.ones(len(Gxyz[:,0])) , Pvxvyvz[1]*np.ones(len(Gxyz[:,1])) , Pvxvyvz[2]*np.ones(len(Gxyz[:,2])) , \ Gxyz[:,0] , Gxyz[:,1] , Gxyz[:,2] , XYZ=True) Gpmrapmdec = bc.pmllpmbb_to_pmrapmdec(Gvrpmllpmbb[:, 1], Gvrpmllpmbb[:, 2], Gllbb[:, 0], Gllbb[:, 1], degree=True) # Code in case I want to do chi^2 cuts someday Gvtanerr = 1.0 * np.ones(len(Gxyz[:, 0])) Gpmerr = Gvtanerr * 206265000.0 * 3.154e7 / (lit_sc.distance.value * 3.086e13) Gchi2 = ((Gpmrapmdec[:, 0] - lit_sc.pm_ra_cosdec.value)**2 + (Gpmrapmdec[:, 1] - lit_sc.pm_dec.value)**2)**0.5 vtanoff = Gchi2 / Gpmerr #this is reported Vtan,off(km/s) ##vr pred vr_pred = Gvrpmllpmbb[:, 0] #create results dataframe res = pd.DataFrame( data={ 'tic': lit_gaia.tic.to_numpy(dtype='str'), 'designation': lit_gaia.designation.to_numpy(dtype='str'), 'ra': lit_sc.ra.value, 'dec': lit_sc.dec.value, 'sep2D(deg)': sep.value, 'sep3D(pc)': sep3d.value, 'Vtan,off(km/s)': vtanoff, 'Vr,pred(km/s)': vr_pred }) return (res)
def make_rcsample(parser): options,args= parser.parse_args() savefilename= options.savefilename if savefilename is None: #Create savefilename if not given savefilename= os.path.join(appath._APOGEE_DATA, 'rcsample_'+appath._APOGEE_REDUX+'.fits') print "Saving to %s ..." % savefilename #Read the base-sample data= apread.allStar(adddist=_ADDHAYDENDIST,rmdups=options.rmdups) #Remove a bunch of fields that we do not want to keep data= esutil.numpy_util.remove_fields(data, ['TARGET_ID', 'FILE', 'AK_WISE', 'SFD_EBV', 'SYNTHVHELIO_AVG', 'SYNTHVSCATTER', 'SYNTHVERR', 'SYNTHVERR_MED', 'RV_TEFF', 'RV_LOGG', 'RV_FEH', 'RV_CCFWHM', 'RV_AUTOFWHM', 'SYNTHSCATTER', 'CHI2_THRESHOLD', 'APSTAR_VERSION', 'ASPCAP_VERSION', 'RESULTS_VERSION', 'REDUCTION_ID', 'SRC_H', 'PM_SRC']) if not appath._APOGEE_REDUX.lower() == 'current' \ and int(appath._APOGEE_REDUX[1:]) < 500: data= esutil.numpy_util.remove_fields(data, ['ELEM']) #Select red-clump stars jk= data['J0']-data['K0'] z= isodist.FEH2Z(data['METALS'],zsolar=0.017) if appath._APOGEE_REDUX.lower() == 'current' \ or int(appath._APOGEE_REDUX[1:]) > 600: from apogee.tools import paramIndx if False: #Use my custom logg calibration that's correct for the RC logg= (1.-0.042)*data['FPARAM'][:,paramIndx('logg')]-0.213 lowloggindx= data['FPARAM'][:,paramIndx('logg')] < 1. logg[lowloggindx]= data['FPARAM'][lowloggindx,paramIndx('logg')]-0.255 hiloggindx= data['FPARAM'][:,paramIndx('logg')] > 3.8 logg[hiloggindx]= data['FPARAM'][hiloggindx,paramIndx('logg')]-0.3726 else: #Use my custom logg calibration that's correct on average logg= (1.+0.03)*data['FPARAM'][:,paramIndx('logg')]-0.37 lowloggindx= data['FPARAM'][:,paramIndx('logg')] < 1. logg[lowloggindx]= data['FPARAM'][lowloggindx,paramIndx('logg')]-0.34 hiloggindx= data['FPARAM'][:,paramIndx('logg')] > 3.8 logg[hiloggindx]= data['FPARAM'][hiloggindx,paramIndx('logg')]-0.256 else: logg= data['LOGG'] indx= (jk < 0.8)*(jk >= 0.5)\ *(z <= 0.06)\ *(z <= rcmodel.jkzcut(jk,upper=True))\ *(z >= rcmodel.jkzcut(jk))\ *(logg >= rcmodel.loggteffcut(data['TEFF'],z,upper=False))\ *(logg <= rcmodel.loggteffcut(data['TEFF'],z,upper=True)) data= data[indx] #Add more aggressive flag cut data= esutil.numpy_util.add_fields(data,[('ADDL_LOGG_CUT',numpy.int32)]) data['ADDL_LOGG_CUT']= ((data['TEFF']-4800.)/1000.+2.75) > data['LOGG'] if options.loggcut: data= data[data['ADDL_LOGG_CUT'] == 1] print "Making catalog of %i objects ..." % len(data) #Add distances data= esutil.numpy_util.add_fields(data,[('RC_DIST', float), ('RC_DM', float), ('RC_GALR', float), ('RC_GALPHI', float), ('RC_GALZ', float)]) rcd= rcmodel.rcdist() jk= data['J0']-data['K0'] z= isodist.FEH2Z(data['METALS'],zsolar=0.017) data['RC_DIST']= rcd(jk,z,appmag=data['K0'])*options.distfac data['RC_DM']= 5.*numpy.log10(data['RC_DIST'])+10. XYZ= bovy_coords.lbd_to_XYZ(data['GLON'], data['GLAT'], data['RC_DIST'], degree=True) R,phi,Z= bovy_coords.XYZ_to_galcencyl(XYZ[:,0], XYZ[:,1], XYZ[:,2], Xsun=8.,Zsun=0.025) data['RC_GALR']= R data['RC_GALPHI']= phi data['RC_GALZ']= Z #Save fitsio.write(savefilename,data,clobber=True) if not options.nostat: #Determine statistical sample and add flag apo= apogee.select.apogeeSelect() statIndx= apo.determine_statistical(data) mainIndx= apread.mainIndx(data) data= esutil.numpy_util.add_fields(data,[('STAT',numpy.int32), ('INVSF',float)]) data['STAT']= 0 data['STAT'][statIndx*mainIndx]= 1 for ii in range(len(data)): if (statIndx*mainIndx)[ii]: data['INVSF'][ii]= 1./apo(data['LOCATION_ID'][ii], data['H'][ii]) else: data['INVSF'][ii]= -1. if options.nopm: fitsio.write(savefilename,data,clobber=True) return None #Get proper motions from astroquery.vizier import Vizier import astroquery from astropy import units as u import astropy.coordinates as coord pmfile= savefilename.split('.')[0]+'_pms.fits' if os.path.exists(pmfile): pmdata= fitsio.read(pmfile,1) else: pmdata= numpy.recarray(len(data), formats=['f8','f8','f8','f8','f8','f8','i4'], names=['RA','DEC','PMRA','PMDEC', 'PMRA_ERR','PMDEC_ERR','PMMATCH']) rad= u.Quantity(4./3600.,u.degree) v= Vizier(columns=['RAJ2000','DEJ2000','pmRA','pmDE','e_pmRA','e_pmDE']) for ii in range(len(data)): #if ii > 100: break sys.stdout.write('\r'+"Getting pm data for point %i / %i" % (ii+1,len(data))) sys.stdout.flush() pmdata.RA[ii]= data['RA'][ii] pmdata.DEC[ii]= data['DEC'][ii] co= coord.ICRS(ra=data['RA'][ii], dec=data['DEC'][ii], unit=(u.degree, u.degree)) trying= True while trying: try: tab= v.query_region(co,rad,catalog='I/322') #UCAC-4 catalog except astroquery.exceptions.TimeoutError: pass else: trying= False if len(tab) == 0: pmdata.PMMATCH[ii]= 0 print "Didn't find a match for %i ..." % ii continue else: pmdata.PMMATCH[ii]= len(tab) if len(tab[0]['pmRA']) > 1: print "Found more than 1 match for %i ..." % ii try: pmdata.PMRA[ii]= float(tab[0]['pmRA']) except TypeError: jj= 1 while len(tab[0]['pmRA']) > 1 and jj < 4: trad= u.Quantity((4.-jj)/3600.,u.degree) trying= True while trying: try: tab= v.query_region(co,trad,catalog='I/322') #UCAC-4 catalog except astroquery.exceptions.TimeoutError: pass else: trying= False jj+= 1 if len(tab) == 0: pmdata.PMMATCH[ii]= 0 print "Didn't find a unambiguous match for %i ..." % ii continue pmdata.PMRA[ii]= float(tab[0]['pmRA']) pmdata.PMDEC[ii]= float(tab[0]['pmDE']) pmdata.PMRA_ERR[ii]= float(tab[0]['e_pmRA']) pmdata.PMDEC_ERR[ii]= float(tab[0]['e_pmDE']) if numpy.isnan(float(tab[0]['pmRA'])): pmdata.PMMATCH[ii]= 0 sys.stdout.write('\r'+_ERASESTR+'\r') sys.stdout.flush() fitsio.write(pmfile,pmdata,clobber=True) #To make sure we're using the same format below pmdata= fitsio.read(pmfile,1) #Match proper motions try: #These already exist currently, but may not always exist data= esutil.numpy_util.remove_fields(data,['PMRA','PMDEC']) except ValueError: pass data= esutil.numpy_util.add_fields(data,[('PMRA', numpy.float), ('PMDEC', numpy.float), ('PMRA_ERR', numpy.float), ('PMDEC_ERR', numpy.float), ('PMMATCH',numpy.int32)]) data['PMMATCH']= 0 h=esutil.htm.HTM() m1,m2,d12 = h.match(pmdata['RA'],pmdata['DEC'], data['RA'],data['DEC'], 2./3600.,maxmatch=1) data['PMRA'][m2]= pmdata['PMRA'][m1] data['PMDEC'][m2]= pmdata['PMDEC'][m1] data['PMRA_ERR'][m2]= pmdata['PMRA_ERR'][m1] data['PMDEC_ERR'][m2]= pmdata['PMDEC_ERR'][m1] data['PMMATCH'][m2]= pmdata['PMMATCH'][m1].astype(numpy.int32) pmindx= data['PMMATCH'] == 1 data['PMRA'][True-pmindx]= -9999.99 data['PMDEC'][True-pmindx]= -9999.99 data['PMRA_ERR'][True-pmindx]= -9999.99 data['PMDEC_ERR'][True-pmindx]= -9999.99 #Calculate Galactocentric velocities data= esutil.numpy_util.add_fields(data,[('GALVR', numpy.float), ('GALVT', numpy.float), ('GALVZ', numpy.float)]) lb= bovy_coords.radec_to_lb(data['RA'],data['DEC'],degree=True) XYZ= bovy_coords.lbd_to_XYZ(lb[:,0],lb[:,1],data['RC_DIST'],degree=True) pmllpmbb= bovy_coords.pmrapmdec_to_pmllpmbb(data['PMRA'],data['PMDEC'], data['RA'],data['DEC'], degree=True) vxvyvz= bovy_coords.vrpmllpmbb_to_vxvyvz(data['VHELIO_AVG'], pmllpmbb[:,0], pmllpmbb[:,1], lb[:,0],lb[:,1],data['RC_DIST'], degree=True) vR, vT, vZ= bovy_coords.vxvyvz_to_galcencyl(vxvyvz[:,0], vxvyvz[:,1], vxvyvz[:,2], 8.-XYZ[:,0], XYZ[:,1], XYZ[:,2]+0.025, vsun=[-11.1,30.24*8.,7.25])#Assumes proper motion of Sgr A* and R0=8 kpc, zo= 25 pc data['GALVR']= vR data['GALVT']= vT data['GALVZ']= vZ data['GALVR'][True-pmindx]= -9999.99 data['GALVT'][True-pmindx]= -9999.99 data['GALVZ'][True-pmindx]= -9999.99 #Get proper motions pmfile= savefilename.split('.')[0]+'_pms_ppmxl.fits' if os.path.exists(pmfile): pmdata= fitsio.read(pmfile,1) else: pmdata= numpy.recarray(len(data), formats=['f8','f8','f8','f8','f8','f8','i4'], names=['RA','DEC','PMRA','PMDEC', 'PMRA_ERR','PMDEC_ERR','PMMATCH']) rad= u.Quantity(4./3600.,u.degree) v= Vizier(columns=['RAJ2000','DEJ2000','pmRA','pmDE','e_pmRA','e_pmDE']) for ii in range(len(data)): #if ii > 100: break sys.stdout.write('\r'+"Getting pm data for point %i / %i" % (ii+1,len(data))) sys.stdout.flush() pmdata.RA[ii]= data['RA'][ii] pmdata.DEC[ii]= data['DEC'][ii] co= coord.ICRS(ra=data['RA'][ii], dec=data['DEC'][ii], unit=(u.degree, u.degree)) trying= True while trying: try: tab= v.query_region(co,rad,catalog='I/317') #PPMXL catalog except astroquery.exceptions.TimeoutError: pass else: trying= False if len(tab) == 0: pmdata.PMMATCH[ii]= 0 print "Didn't find a match for %i ..." % ii continue else: pmdata.PMMATCH[ii]= len(tab) if len(tab[0]['pmRA']) > 1: pass #print "Found more than 1 match for %i ..." % ii try: pmdata.PMRA[ii]= float(tab[0]['pmRA']) except TypeError: #Find nearest cosdists= numpy.zeros(len(tab[0]['pmRA'])) for jj in range(len(tab[0]['pmRA'])): cosdists[jj]= cos_sphere_dist(tab[0]['RAJ2000'][jj], tab[0]['DEJ2000'][jj], data['RA'][ii], data['DEC'][ii]) closest= numpy.argmax(cosdists) pmdata.PMRA[ii]= float(tab[0]['pmRA'][closest]) pmdata.PMDEC[ii]= float(tab[0]['pmDE'][closest]) pmdata.PMRA_ERR[ii]= float(tab[0]['e_pmRA'][closest]) pmdata.PMDEC_ERR[ii]= float(tab[0]['e_pmDE'][closest]) if numpy.isnan(float(tab[0]['pmRA'][closest])): pmdata.PMMATCH[ii]= 0 else: pmdata.PMDEC[ii]= float(tab[0]['pmDE']) pmdata.PMRA_ERR[ii]= float(tab[0]['e_pmRA']) pmdata.PMDEC_ERR[ii]= float(tab[0]['e_pmDE']) if numpy.isnan(float(tab[0]['pmRA'])): pmdata.PMMATCH[ii]= 0 sys.stdout.write('\r'+_ERASESTR+'\r') sys.stdout.flush() fitsio.write(pmfile,pmdata,clobber=True) #To make sure we're using the same format below pmdata= fitsio.read(pmfile,1) #Match proper motions to ppmxl data= esutil.numpy_util.add_fields(data,[('PMRA_PPMXL', numpy.float), ('PMDEC_PPMXL', numpy.float), ('PMRA_ERR_PPMXL', numpy.float), ('PMDEC_ERR_PPMXL', numpy.float), ('PMMATCH_PPMXL',numpy.int32)]) data['PMMATCH_PPMXL']= 0 h=esutil.htm.HTM() m1,m2,d12 = h.match(pmdata['RA'],pmdata['DEC'], data['RA'],data['DEC'], 2./3600.,maxmatch=1) data['PMRA_PPMXL'][m2]= pmdata['PMRA'][m1] data['PMDEC_PPMXL'][m2]= pmdata['PMDEC'][m1] data['PMRA_ERR_PPMXL'][m2]= pmdata['PMRA_ERR'][m1] data['PMDEC_ERR_PPMXL'][m2]= pmdata['PMDEC_ERR'][m1] data['PMMATCH_PPMXL'][m2]= pmdata['PMMATCH'][m1].astype(numpy.int32) pmindx= data['PMMATCH_PPMXL'] == 1 data['PMRA_PPMXL'][True-pmindx]= -9999.99 data['PMDEC_PPMXL'][True-pmindx]= -9999.99 data['PMRA_ERR_PPMXL'][True-pmindx]= -9999.99 data['PMDEC_ERR_PPMXL'][True-pmindx]= -9999.99 #Calculate Galactocentric velocities data= esutil.numpy_util.add_fields(data,[('GALVR_PPMXL', numpy.float), ('GALVT_PPMXL', numpy.float), ('GALVZ_PPMXL', numpy.float)]) lb= bovy_coords.radec_to_lb(data['RA'],data['DEC'],degree=True) XYZ= bovy_coords.lbd_to_XYZ(lb[:,0],lb[:,1],data['RC_DIST'],degree=True) pmllpmbb= bovy_coords.pmrapmdec_to_pmllpmbb(data['PMRA_PPMXL'], data['PMDEC_PPMXL'], data['RA'],data['DEC'], degree=True) vxvyvz= bovy_coords.vrpmllpmbb_to_vxvyvz(data['VHELIO_AVG'], pmllpmbb[:,0], pmllpmbb[:,1], lb[:,0],lb[:,1],data['RC_DIST'], degree=True) vR, vT, vZ= bovy_coords.vxvyvz_to_galcencyl(vxvyvz[:,0], vxvyvz[:,1], vxvyvz[:,2], 8.-XYZ[:,0], XYZ[:,1], XYZ[:,2]+0.025, vsun=[-11.1,30.24*8.,7.25])#Assumes proper motion of Sgr A* and R0=8 kpc, zo= 25 pc data['GALVR_PPMXL']= vR data['GALVT_PPMXL']= vT data['GALVZ_PPMXL']= vZ data['GALVR_PPMXL'][True-pmindx]= -9999.99 data['GALVT_PPMXL'][True-pmindx]= -9999.99 data['GALVZ_PPMXL'][True-pmindx]= -9999.99 #Save fitsio.write(savefilename,data,clobber=True) return None
def from_radec(cluster, do_order=False, do_key_params=False): """Calculate galactocentric coordinates from 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) Returns ------- None History: ------- 2018 - Written - Webb (UofT) """ if cluster.units == "radec" and cluster.origin == "sky": origin0 = cluster.origin l, b = bovy_coords.radec_to_lb(cluster.ra, cluster.dec, degree=True).T x0, y0, z0 = bovy_coords.lbd_to_XYZ(l, b, cluster.dist, degree=True).T cluster.x, cluster.y, cluster.z = bovy_coords.XYZ_to_galcenrect( x0, y0, z0, Xsun=8.0, Zsun=0.025).T pml, pmb = bovy_coords.pmrapmdec_to_pmllpmbb(cluster.pmra, cluster.pmdec, cluster.ra, cluster.dec, degree=True).T vx0, vy0, vz0 = bovy_coords.vrpmllpmbb_to_vxvyvz(cluster.vlos, pml, pmb, l, b, cluster.dist, degree=True).T cluster.vx, cluster.vy, cluster.vz = bovy_coords.vxvyvz_to_galcenrect( vx0, vy0, vz0, vsun=[0.0, 220.0, 0.0], Xsun=8.0, Zsun=0.025, _extra_rot=True, ).T l_gc, b_gc = bovy_coords.radec_to_lb(cluster.ra_gc, cluster.dec_gc, degree=True) x0_gc, y0_gc, z0_gc = bovy_coords.lbd_to_XYZ(l_gc, b_gc, cluster.dist_gc, degree=True) cluster.xgc, cluster.ygc, cluster.zgc = bovy_coords.XYZ_to_galcenrect( x0_gc, y0_gc, z0_gc, Xsun=8.0, Zsun=0.025) pml_gc, pmb_gc = bovy_coords.pmrapmdec_to_pmllpmbb(cluster.pmra_gc, cluster.pmdec_gc, cluster.ra_gc, cluster.dec_gc, degree=True) vx0_gc, vy0_gc, vz0_gc = bovy_coords.vrpmllpmbb_to_vxvyvz( cluster.vlos_gc, pml_gc, pmb_gc, l_gc, b_gc, cluster.dist_gc, degree=True) cluster.vx_gc, cluster.vy_gc, cluster.vz_gc = bovy_coords.vxvyvz_to_galcenrect( vx0_gc, vy0_gc, vz0_gc, vsun=[0.0, 220.0, 0.0], Xsun=8.0, Zsun=0.025, _extra_rot=True, ) cluster.origin = "galaxy" cluster.units = "kpckms" cluster.rv3d() if do_key_params: cluster.key_params(do_order=do_order)
def calcMass(options,args): if options.sample.lower() == 'g': if options.select.lower() == 'program': raw= read_gdwarfs(_GDWARFFILE,logg=True,ebv=True,sn=True) elif options.select.lower() == 'fakebimodal': raw= read_gdwarfs(_FAKEBIMODALGDWARFFILE, logg=True,ebv=True,sn=True) options.select= 'all' else: raw= read_gdwarfs(logg=True,ebv=True,sn=True) elif options.sample.lower() == 'k': if options.select.lower() == 'program': raw= read_kdwarfs(_KDWARFFILE,logg=True,ebv=True,sn=True) else: raw= read_kdwarfs(logg=True,ebv=True,sn=True) #Bin the data binned= pixelAfeFeh(raw,dfeh=options.dfeh,dafe=options.dafe) #Savefile if os.path.exists(args[0]):#Load savefile savefile= open(args[0],'rb') mass= pickle.load(savefile) ii= pickle.load(savefile) jj= pickle.load(savefile) savefile.close() else: mass= [] ii, jj= 0, 0 #parameters if os.path.exists(args[1]):#Load initial savefile= open(args[1],'rb') fits= pickle.load(savefile) savefile.close() else: print "Error: must provide parameters of best fits" print "Returning ..." return None #Sample? if options.mcsample: if ii < len(binned.fehedges)-1 and jj < len(binned.afeedges)-1: print "First do all of the best-fit mass estimates ..." print "Returning ..." return None if os.path.exists(args[2]): #Load savefile savefile= open(args[2],'rb') masssamples= pickle.load(savefile) ii= pickle.load(savefile) jj= pickle.load(savefile) savefile.close() else: masssamples= [] ii, jj= 0, 0 if os.path.exists(args[3]): #Load savefile savefile= open(args[3],'rb') denssamples= pickle.load(savefile) savefile.close() else: print "If mcsample you need to provide the file with the density samples ..." print "Returning ..." return None #Set up model etc. if options.model.lower() == 'hwr': densfunc= _HWRDensity elif options.model.lower() == 'twodblexp': densfunc= _TwoDblExpDensity like_func= _HWRLikeMinus pdf_func= _HWRLike if options.sample.lower() == 'g': colorrange=[0.48,0.55] elif options.sample.lower() == 'k': colorrange=[0.55,0.75] #Load selection function plates= numpy.array(list(set(list(raw.plate))),dtype='int') #Only load plates that we use print "Using %i plates, %i stars ..." %(len(plates),len(raw)) sf= segueSelect(plates=plates,type_faint='tanhrcut', sample=options.sample,type_bright='tanhrcut', sn=True,select=options.select) platelb= bovy_coords.radec_to_lb(sf.platestr.ra,sf.platestr.dec, degree=True) indx= [not 'faint' in name for name in sf.platestr.programname] platebright= numpy.array(indx,dtype='bool') indx= ['faint' in name for name in sf.platestr.programname] platefaint= numpy.array(indx,dtype='bool') if options.sample.lower() == 'g': grmin, grmax= 0.48, 0.55 rmin,rmax= 14.5, 20.2 #Run through the bins while ii < len(binned.fehedges)-1: while jj < len(binned.afeedges)-1: data= binned(binned.feh(ii),binned.afe(jj)) if len(data) < options.minndata: if options.mcsample: masssamples.append(None) else: mass.append(None) jj+= 1 if jj == len(binned.afeedges)-1: jj= 0 ii+= 1 break continue print binned.feh(ii), binned.afe(jj), len(data) fehindx= binned.fehindx(binned.feh(ii)) afeindx= binned.afeindx(binned.afe(jj)) #set up feh and color feh= binned.feh(ii) fehrange= [binned.fehedges[ii],binned.fehedges[ii+1]] #FeH fehdist= DistSpline(*numpy.histogram(data.feh,bins=5, range=fehrange), xrange=fehrange,dontcuttorange=False) #Color colordist= DistSpline(*numpy.histogram(data.dered_g\ -data.dered_r, bins=9,range=colorrange), xrange=colorrange) #Age marginalization afe= binned.afe(jj) if options.simpleage: agemin, agemax= 0.5, 10. else: if afe > 0.25: agemin, agemax= 7.,10. else: agemin,agemax= 1.,8. if options.mcsample: #Loop over samples thissamples= denssamples[afeindx+fehindx*binned.npixafe()] if options.nsamples < len(thissamples): print "Taking random ..." #Random permutation thissamples= numpy.random.permutation(thissamples)[0:options.nsamples] thismasssamples= [] print "WARNING: DISK MASS IN CALCMASS ONLY FOR G COLORS" for kk in range(len(thissamples)): thisparams= thissamples[kk] thismasssamples.append(predictDiskMass(densfunc, thisparams,sf, colordist,fehdist, fehrange[0], fehrange[1],feh, data,0.45, 0.58, agemin,agemax, normalize=options.normalize, imfmodel=options.imfmodel)) #Print some stuff print numpy.mean(numpy.array(thismasssamples)), numpy.std(numpy.array(thismasssamples)) masssamples.append(thismasssamples) else: thisparams= fits[afeindx+fehindx*binned.npixafe()] print "WARNING: DISK MASS IN CALCMASS ONLY FOR G COLORS" mass.append(predictDiskMass(densfunc, thisparams,sf, colordist,fehdist, fehrange[0], fehrange[1],feh, data,0.45, 0.58, agemin,agemax, normalize=options.normalize, imfmodel=options.imfmodel)) print mass[-1] jj+= 1 if jj == len(binned.afeedges)-1: jj= 0 ii+= 1 if options.mcsample: save_pickles(args[2],masssamples,ii,jj) else: save_pickles(args[0],mass,ii,jj) if jj == 0: #this means we've reset the counter break if options.mcsample: save_pickles(args[2],masssamples,ii,jj) else: save_pickles(args[0],mass,ii,jj) return None
def action(ra_deg, dec_deg, d_kpc, pm_ra_masyr, pm_dec_masyr, v_los_kms, verbose=False): """ parameters: ---------- ra_deg: (float) RA in degrees. dec_deg: (float) Dec in degress. d_kpc: (float) Distance in kpc. pm_ra_masyr: (float) RA proper motion in mas/yr. pm_decmasyr: (float) Dec proper motion in mas/yr. v_los_kms: (float) RV in kms. returns: ------ R_kpc, phi_rad, z_kpc, vR_kms, vT_kms, vz_kms jR: (float) Radial action. lz: (float) Vertical ang mom. jz: (float) Vertical action. """ ra_rad = ra_deg * (np.pi / 180.) # RA [rad] dec_rad = dec_deg * (np.pi / 180.) # dec [rad] # Galactocentric position of the Sun: X_gc_sun_kpc = 8. # [kpc] Z_gc_sun_kpc = 0.025 # [kpc] # Galactocentric velocity of the Sun: vX_gc_sun_kms = -9.58 # = -U [kms] vY_gc_sun_kms = 10.52 + 220. # = V+v_circ(R_Sun) [kms] vZ_gc_sun_kms = 7.01 # = W [kms] # a. convert spatial coordinates (ra,dec,d) to (R,z,phi) # (ra,dec) --> Galactic coordinates (l,b): lb = bovy_coords.radec_to_lb(ra_rad, dec_rad, degree=False, epoch=2000.0) # l_rad = lb[:, 0] # b_rad = lb[:, 1] l_rad = lb[0] b_rad = lb[1] # (l,b,d) --> Galactocentric cartesian coordinates (x,y,z): xyz = bovy_coords.lbd_to_XYZ(l_rad, b_rad, d_kpc, degree=False) # x_kpc = xyz[:, 0] # y_kpc = xyz[:, 1] # z_kpc = xyz[:, 2] x_kpc = xyz[0] y_kpc = xyz[1] z_kpc = xyz[2] # (x,y,z) --> Galactocentric cylindrical coordinates (R,z,phi): Rzphi = bovy_coords.XYZ_to_galcencyl(x_kpc, y_kpc, z_kpc, Xsun=X_gc_sun_kpc, Zsun=Z_gc_sun_kpc) # R_kpc = Rzphi[:, 0] # phi_rad = Rzphi[:, 1] # z_kpc = Rzphi[:, 2] R_kpc = Rzphi[0] phi_rad = Rzphi[1] z_kpc = Rzphi[2] # b. convert velocities (pm_ra,pm_dec,vlos) to (vR,vz,vT) # (pm_ra,pm_dec) --> (pm_l,pm_b): pmlpmb = bovy_coords.pmrapmdec_to_pmllpmbb(pm_ra_masyr, pm_dec_masyr, ra_rad, dec_rad, degree=False, epoch=2000.0) # pml_masyr = pmlpmb[:, 0] # pmb_masyr = pmlpmb[:, 1] pml_masyr = pmlpmb[0] pmb_masyr = pmlpmb[1] # (v_los,pm_l,pm_b) & (l,b,d) --> (vx,vy,vz): vxvyvz = bovy_coords.vrpmllpmbb_to_vxvyvz(v_los_kms, pml_masyr, pmb_masyr, l_rad, b_rad, d_kpc, XYZ=False, degree=False) # vx_kms = vxvyvz[:, 0] # vy_kms = vxvyvz[:, 1] # vz_kms = vxvyvz[:, 2] vx_kms = vxvyvz[0] vy_kms = vxvyvz[1] vz_kms = vxvyvz[2] # (vx,vy,vz) & (x,y,z) --> (vR,vT,vz): vRvTvZ = bovy_coords.vxvyvz_to_galcencyl(vx_kms, vy_kms, vz_kms, R_kpc, phi_rad, z_kpc, vsun=[vX_gc_sun_kms, vY_gc_sun_kms, vZ_gc_sun_kms], galcen=True) # vR_kms = vRvTvZ[:, 0] # vT_kms = vRvTvZ[:, 1] # vz_kms = vRvTvZ[:, 2] vR_kms = vRvTvZ[0] vT_kms = vRvTvZ[1] vz_kms = vRvTvZ[2] if verbose: print("R = ", R_kpc, "\t kpc") print("phi = ", phi_rad, "\t rad") print("z = ", z_kpc, "\t kpc") print("v_R = ", vR_kms, "\t km/s") print("v_T = ", vT_kms, "\t km/s") print("v_z = ", vz_kms, "\t km/s") jR, lz, jz = calc_actions(R_kpc, phi_rad, z_kpc, vR_kms, vT_kms, vz_kms) return R_kpc, phi_rad, z_kpc, vR_kms, vT_kms, vz_kms, jR, lz, jz
def calc_eccentricity(args, options): table = os.path.join(args[0],'table2.dat') readme = os.path.join(args[0],'ReadMe') dierickx = ascii.read(table, readme=readme) vxvv = np.dstack([dierickx['RAdeg'], dierickx['DEdeg'], dierickx['Dist']/1e3, dierickx['pmRA'], dierickx['pmDE'], dierickx['HRV']])[0] ro, vo, zo = 8., 220., 0.025 ra, dec= vxvv[:,0], vxvv[:,1] lb= bovy_coords.radec_to_lb(ra,dec,degree=True) pmra, pmdec= vxvv[:,3], vxvv[:,4] pmllpmbb= bovy_coords.pmrapmdec_to_pmllpmbb(pmra,pmdec,ra,dec,degree=True) d, vlos= vxvv[:,2], vxvv[:,5] rectgal= bovy_coords.sphergal_to_rectgal(lb[:,0],lb[:,1],d,vlos,pmllpmbb[:,0], pmllpmbb[:,1],degree=True) vsolar= np.array([-10.1,4.0,6.7]) vsun= np.array([0.,1.,0.,])+vsolar/vo X = rectgal[:,0]/ro Y = rectgal[:,1]/ro Z = rectgal[:,2]/ro vx = rectgal[:,3]/vo vy = rectgal[:,4]/vo vz = rectgal[:,5]/vo vsun= np.array([0.,1.,0.,])+vsolar/vo Rphiz= bovy_coords.XYZ_to_galcencyl(X,Y,Z,Zsun=zo/ro) vRvTvz= bovy_coords.vxvyvz_to_galcencyl(vx,vy,vz,Rphiz[:,0],Rphiz[:,1],Rphiz[:,2],vsun=vsun,Xsun=1.,Zsun=zo/ro,galcen=True) #do the integration and individual analytic estimate for each object ts= np.linspace(0.,20.,10000) lp= LogarithmicHaloPotential(normalize=1.) e_ana = numpy.zeros(len(vxvv)) e_int = numpy.zeros(len(vxvv)) print('Performing orbit integration and analytic parameter estimates for Dierickx et al. sample...') for i in tqdm(range(len(vxvv))): try: orbit = Orbit(vxvv[i], radec=True, vo=220., ro=8.) e_ana[i] = orbit.e(analytic=True, pot=lp, c=True) except UnboundError: e_ana[i] = np.nan orbit.integrate(ts, lp) e_int[i] = orbit.e(analytic=False) fig = plt.figure() fig.set_size_inches(1.5*columnwidth, 1.5*columnwidth) plt.scatter(e_int, e_ana, s=1, color='Black', lw=0.) plt.xlabel(r'$\mathrm{galpy\ integrated}\ e$') plt.ylabel(r'$\mathrm{galpy\ analytic}\ e$') plt.xlim(0.,1.) plt.ylim(0.,1.) fig.tight_layout() plt.savefig(os.path.join(args[0],'dierickx-integratedeanalytice.png'), format='png', dpi=200) fig = plt.figure() fig.set_size_inches(1.5*columnwidth, 1.5*columnwidth) plt.hist(e_int, bins=30) plt.xlim(0.,1.) plt.xlabel(r'$\mathrm{galpy}\ e$') fig.tight_layout() plt.savefig(os.path.join(args[0], 'dierickx-integratedehist.png'), format='png', dpi=200) fig = plt.figure() fig.set_size_inches(1.5*columnwidth, 1.5*columnwidth) plt.scatter(dierickx['e'], e_int, s=1, color='Black', lw=0.) plt.xlabel(r'$\mathrm{Dierickx\ et\ al.}\ e$') plt.ylabel(r'$\mathrm{galpy\ integrated}\ e$') plt.xlim(0.,1.) plt.ylim(0.,1.) fig.tight_layout() plt.savefig(os.path.join(args[0],'dierickx-integratedee.png'), format='png', dpi=200) fig = plt.figure() fig.set_size_inches(1.5*columnwidth, 1.5*columnwidth) plt.scatter(dierickx['e'], e_ana, s=1, color='Black', lw=0.) plt.xlabel(r'$\mathrm{Dierickx\ et\ al.}\ e$') plt.ylabel(r'$\mathrm{galpy\ estimated}\ e$') plt.xlim(0.,1.) plt.ylim(0.,1.) fig.tight_layout() plt.savefig(os.path.join(args[0],'dierickx-analyticee.png'), format='png', dpi=200) arr = numpy.recarray(len(e_ana), dtype=[('analytic_e', float), ('integrated_e', float)]) arr['analytic_e'] = e_ana arr['integrated_e'] = e_int with open(os.path.join(args[0],'eccentricities.dat'), 'w') as file: pickle.dump(arr, file) file.close()
def shuffle(self, GRVScut=16., vtotcut=450 * u.km / u.s, dustmap=None, N=100): ''' Randomize the galactocentric right ascension and computes how many stars satisfy the photometric/dynamical conditions GRVS < GRVScut, vtot<vtotcut. Do this N times. Parameters ---------- GRVScut : float Magnitude cut to impose vtotcut : Quantity Galactocentric velocity cut to impose dustmap : DustMap Dustmap to be used to compute the photometry N : int Number of random realizations Returns ------- NGaia : ndarray Array of size N containing the number of selected stars per each realization. ''' import astropy.coordinates as coord from galpy.util.bovy_coords import radec_to_lb, pmrapmdec_to_pmllpmbb vSun = [ -self.solarmotion[0], self.solarmotion[1], self.solarmotion[2] ] * u.km / u.s # (U, V, W) vrot = [0., 220., 0.] * u.km / u.s RSun = 8. * u.kpc zSun = 0 * u.pc v_sun = coord.CartesianDifferential(vSun + vrot) GCCS = coord.Galactocentric(galcen_distance=RSun, z_sun=zSun, galcen_v_sun=v_sun) GCS = coord.Galactic() data = radec_to_lb(self.ra.to('deg').value, self.dec.to('deg').value, degree=True) ll, bb = data[:, 0], data[:, 1] data = pmrapmdec_to_pmllpmbb(self.pmra, self.pmdec, self.ra.to('deg').value, self.dec.to('deg').value, degree=True) pmll, pmbb = data[:, 0], data[:, 1] galactic_coords = coord.Galactic(l=ll * u.deg, b=bb * u.deg, distance=self.dist, pm_l_cosb=pmll * u.mas / u.yr, pm_b=pmbb * u.mas / u.yr, radial_velocity=self.vlos) galactocentric_coords = galactic_coords.transform_to(GCCS) phi = np.arctan2(galactocentric_coords.y, galactocentric_coords.x) r = (galactocentric_coords.y**2. + galactocentric_coords.x**2.)**0.5 self.vtot = np.sqrt(galactocentric_coords.v_x**2. + galactocentric_coords.v_y**2. + galactocentric_coords.v_z**2.).to(u.km / u.s) NGaia = np.zeros(N) for i in xrange(N): phi2 = (2 * np.random.random(phi.size) - 1) * np.pi galactocentric_coords2 = coord.Galactocentric( x=r * np.cos(phi2), y=r * np.sin(phi2), z=galactocentric_coords.z, galcen_distance=RSun, z_sun=zSun, galcen_v_sun=v_sun) galactic2 = galactocentric_coords2.transform_to(GCS) self.ll, self.bb = galactic2.l.to(u.deg).value, galactic2.b.to( u.deg).value self.dist = galactic2.distance self.photometry(dustmap=dustmap, v=False) NGaia[i] = ((self.GRVS < GRVScut) & (self.vtot > vtotcut)).sum() self.cattype = 2 return NGaia
def plotMetallicityColor(options,args): if options.png: ext= 'png' else: ext= 'ps' #Load data XYZ,vxvyvz,cov_vxvyvz,data= readData(metal=options.metal, sample=options.sample) #Load plates platestr= segueSelect._load_fits(os.path.join(segueSelect._SEGUESELECTDIR, 'segueplates.fits')) #Set up ranges if options.sample.lower() == 'g': xrange=[0.46,0.57] rmin, rmax= 14.5, 20.2 grmin, grmax= 0.48, 0.55 rx= 0.47 colorrange=[0.48,0.55] elif options.sample.lower() == 'k': xrange=[0.51,0.79] rmin, rmax= 14.5, 19. grmin, grmax= 0.55,0.75 rx= 0.01/.11*(xrange[1]-xrange[0])+xrange[0] colorrange=[0.55,0.75] if options.metal.lower() == 'rich': yrange=[-0.55,0.5] ry= 0.275 fehrange= _APOORFEHRANGE elif options.metal.lower() == 'poor': yrange=[-1.6,0.3] ry= yrange[1]-(.5-0.275)*(yrange[1]-yrange[0]) fehrange= _ARICHFEHRANGE #First plot all data, faint, and bright bovy_plot.bovy_print() _plotMC_single(data,options,args,all=True,overplot=False,xrange=xrange, yrange=yrange,fehrange=fehrange,colorrange=colorrange) _overplot_model(data,xrange=xrange,yrange=yrange,fehrange=fehrange, colorrange=colorrange) bovy_plot.bovy_end_print(os.path.join(args[0],'FeH_gr_'+options.sample+'_'+options.metal+'.'+ext)) #Then plot them pixel-by-pixel platelb= bovy_coords.radec_to_lb(platestr.ra,platestr.dec, degree=True) nside= 1 for ii in range(12*nside**2): #First find all of the plates in this pixel indx= (platestr.healpix_level1 == ii) if numpy.sum(indx) == 0: continue #No match thisplatestr= platestr[indx] platels= platelb[indx,0] platebs= platelb[indx,1] indx= [] for jj in range(len(data.ra)): if data[jj].plate in list(thisplatestr.plate): indx.append(True) else: indx.append(False) indx= numpy.array(indx,dtype='bool') if numpy.sum(indx) == 0: continue #No matches bovy_plot.bovy_print() _plotMC_single(data[indx],options,args,all=False,overplot=False, xrange=xrange,yrange=yrange,platels=platels, platebs=platebs, ry=ry,rx=rx, rmin=rmin,rmax=rmax,grmin=grmin,grmax=grmax) _overplot_model(data,xrange=xrange,yrange=yrange,fehrange=fehrange, colorrange=colorrange) bovy_plot.bovy_end_print(os.path.join(args[0],'FeH_gr_'+options.sample+'_'+options.metal+'_%i.' % ii + ext)) return None
# other properties # June Y18 version # age = star['age_1'][sindx] # age_68l = star['age_68L_1'][sindx] # age_68u = star['age_68U_1'][sindx] # feh = star['feh_1'][sindx] # alpha = star['alpha'][sindx] # data13Jul18 age = star['age'][sindx] age_68l = star['age_68L'][sindx] age_68u = star['age_68U'][sindx] feh = star['FE_H_ADOP_COR'][sindx] alpha = star['ALP_FE_ADOP_COR'][sindx] # convert coordinates Tllbb = bovy_coords.radec_to_lb(ra, dec, degree=True, epoch=None) glon = Tllbb[:, 0] glat = Tllbb[:, 1] # assumed solar motion, from Adibekyan et al. (2012) usun = 11.1 vsun = 12.24 wsun = 7.25 zsun = 0.014 # set vxvv for galpy # vxvs=[] # for i in range(0,nstar-1): # vxvs.append([ra[i],dec[i],dist[i],pmra[i],pmdec[i],vhel[i]]) # vxvv=numpy.array(vxvs)
def resampleMags(raw,comps,options,args): #For each data point's line-of-sight and color and feh #calculate the "thin" and "thick" distributions model_thick= _DblExpDensity model_thin= _DblExpDensity params_thick= numpy.array([numpy.log(options.hz_thick/1000.), -numpy.log(options.hr_thick)]) params_thin= numpy.array([numpy.log(options.hz_thin/1000.), -numpy.log(options.hr_thin)]) if options.allthin: params_thick= params_thin elif options.allthick: params_thin= params_thick #Load sf sf= segueSelect(sample=options.sample,sn=True, type_bright='tanhrcut', type_faint='tanhrcut') platelb= bovy_coords.radec_to_lb(sf.platestr.ra,sf.platestr.dec, degree=True) #Cut out bright stars on faint plates and vice versa cutbright= False if cutbright: indx= [] for ii in range(len(raw.feh)): if sf.platebright[str(raw[ii].plate)] and raw[ii].dered_r >= 17.8: indx.append(False) elif not sf.platebright[str(raw[ii].plate)] and raw[ii].dered_r < 17.8: indx.append(False) else: indx.append(True) indx= numpy.array(indx,dtype='bool') raw= raw[indx] comps= comps[indx] #Loadthe data into the pixelAfeFeh structure raw= _append_field_recarray(raw,'comps',comps) binned= pixelAfeFeh(raw,dfeh=0.1,dafe=0.05,fehmin=-1.6, fehmax=0.5,afemin=-0.05,afemax=0.55) #Color if options.sample.lower() == 'g': colorrange=[0.48,0.55] rmax= 20.2 elif options.sample.lower() == 'k': colorrange=[0.55,0.75] rmax= 19. if options.sample.lower() == 'g': grmin, grmax= 0.48, 0.55 rmin,rmax= 14.5, 20.2 ngr, nfeh, nrs= 2, 2, 201 grs= numpy.linspace(grmin,grmax,ngr) rs= numpy.linspace(rmin,rmax,nrs) #Run through the bins ii, jj= 0, 0 while ii < len(binned.fehedges)-1: while jj < len(binned.afeedges)-1: data= binned(binned.feh(ii),binned.afe(jj)) rawIndx= binned.callIndx(binned.feh(ii),binned.afe(jj)) if len(data) < 1: jj+= 1 if jj == len(binned.afeedges)-1: jj= 0 ii+= 1 break continue #Set up feh and color feh= binned.feh(ii) fehrange= [binned.fehedges[ii],binned.fehedges[ii+1]] #FeH fehdist= DistSpline(*numpy.histogram(data.feh,bins=5, range=fehrange), xrange=fehrange,dontcuttorange=False) #Color colordist= DistSpline(*numpy.histogram(data.dered_g\ -data.dered_r, bins=9,range=colorrange), xrange=colorrange) #Predict the r-distribution for all plates #Thick or thin? thick_amp= numpy.mean(data.comps) rdists_thin= numpy.zeros((len(sf.plates),nrs,ngr,nfeh)) rdists_thick= numpy.zeros((len(sf.plates),nrs,ngr,nfeh)) for pp in range(len(sf.plates)): sys.stdout.write('\r'+"Working on bin %i / %i: plate %i / %i" \ % (ii*(len(binned.afeedges)-1)+jj+1, (len(binned.afeedges)-1)*(len(binned.fehedges)-1),pp+1,len(sf.plates))+'\r') sys.stdout.flush() rdists_thin[pp,:,:,:]= _predict_rdist_plate(rs,model_thin, params_thin, rmin,rmax, platelb[pp,0],platelb[pp,1], grmin,grmax, fehrange[0],fehrange[1],feh, colordist, fehdist,sf,sf.plates[pp], dontmarginalizecolorfeh=True, ngr=ngr,nfeh=nfeh) rdists_thick[pp,:,:,:]= _predict_rdist_plate(rs,model_thick, params_thick, rmin,rmax, platelb[pp,0],platelb[pp,1], grmin,grmax, fehrange[0],fehrange[1],feh, colordist, fehdist,sf,sf.plates[pp], dontmarginalizecolorfeh=True, ngr=ngr,nfeh=nfeh) rdists= thick_amp*rdists_thick+(1.-thick_amp)*rdists_thin rdists[numpy.isnan(rdists)]= 0. numbers= numpy.sum(rdists,axis=3) numbers= numpy.sum(numbers,axis=2) numbers= numpy.sum(numbers,axis=1) numbers= numpy.cumsum(numbers) numbers/= numbers[-1] rdists= numpy.cumsum(rdists,axis=1) for ww in range(len(sf.plates)): for ll in range(ngr): for kk in range(nfeh): if rdists[ww,-1,ll,kk] != 0.: rdists[ww,:,ll,kk]/= rdists[ww,-1,ll,kk] #Now sample nout= 0 while nout < len(data): #First sample a plate ran= numpy.random.uniform() kk= 0 while numbers[kk] < ran: kk+= 1 #plate==kk; now sample from the rdist of this plate ran= numpy.random.uniform() ll= 0 #Find cc and ff for this data point cc= int(numpy.floor((data[nout].dered_g-data[nout].dered_r-colorrange[0])/(colorrange[1]-colorrange[0])*ngr)) ff= int(numpy.floor((data[nout].feh-fehrange[0])/(fehrange[1]-fehrange[0])*nfeh)) while rdists[kk,ll,cc,ff] < ran and ll < nrs-1: ll+= 1 #r=ll oldgr= data.dered_g[nout]-data.dered_r[nout] oldr= data.dered_r[nout] data.dered_r[nout]= rs[ll] data.dered_g[nout]= oldgr+data.dered_r[nout] #Also change plate and l and b data.plate[nout]= sf.plates[kk] data.ra[nout]= sf.platestr.ra[kk] data.dec[nout]= sf.platestr.dec[kk] data.l[nout]= platelb[kk,0] data.b[nout]= platelb[kk,1] nout+= 1 raw.dered_r[rawIndx]= data.dered_r raw.dered_g[rawIndx]= data.dered_g raw.plate[rawIndx]= data.plate raw.ra[rawIndx]= data.ra raw.dec[rawIndx]= data.dec raw.l[rawIndx]= data.l raw.b[rawIndx]= data.b jj+= 1 if jj == len(binned.afeedges)-1: jj= 0 ii+= 1 sys.stdout.write('\r'+_ERASESTR+'\r') sys.stdout.flush() #Dump raw fitsio.write(args[0],raw,clobber=True)
def calc_actions(ra_deg, dec_deg, d_kpc, pm_ra_masyr, pm_dec_masyr, v_los_kms): ra_rad = ra_deg * (np.pi / 180.) # RA [rad] dec_rad = dec_deg * (np.pi / 180.) # dec [rad] # Galactocentric position of the Sun: X_gc_sun_kpc = 8. # [kpc] Z_gc_sun_kpc = 0.025 # [kpc] # Galactocentric velocity of the Sun: vX_gc_sun_kms = -9.58 # = -U [kms] vY_gc_sun_kms = 10.52 + 220. # = V+v_circ(R_Sun) [kms] vZ_gc_sun_kms = 7.01 # = W [kms] # a. convert spatial coordinates (ra,dec,d) to (R,z,phi) # (ra,dec) --> Galactic coordinates (l,b): lb = bovy_coords.radec_to_lb(ra_rad, dec_rad, degree=False, epoch=2000.0) l_rad = lb[:, 0] b_rad = lb[:, 1] # (l,b,d) --> Galactocentric cartesian coordinates (x,y,z): xyz = bovy_coords.lbd_to_XYZ(l_rad, b_rad, d_kpc, degree=False) x_kpc = xyz[:, 0] y_kpc = xyz[:, 1] z_kpc = xyz[:, 2] # (x,y,z) --> Galactocentric cylindrical coordinates (R,z,phi): Rzphi = bovy_coords.XYZ_to_galcencyl(x_kpc, y_kpc, z_kpc, Xsun=X_gc_sun_kpc, Zsun=Z_gc_sun_kpc) R_kpc = Rzphi[:, 0] phi_rad = Rzphi[:, 1] z_kpc = Rzphi[:, 2] # b. convert velocities (pm_ra,pm_dec,vlos) to (vR,vz,vT) # (pm_ra,pm_dec) --> (pm_l,pm_b): pmlpmb = bovy_coords.pmrapmdec_to_pmllpmbb(pm_ra_masyr, pm_dec_masyr, ra_rad, dec_rad, degree=False, epoch=2000.0) pml_masyr = pmlpmb[:, 0] pmb_masyr = pmlpmb[:, 1] # (v_los,pm_l,pm_b) & (l,b,d) --> (vx,vy,vz): vxvyvz = bovy_coords.vrpmllpmbb_to_vxvyvz(v_los_kms, pml_masyr, pmb_masyr, l_rad, b_rad, d_kpc, XYZ=False, degree=False) vx_kms = vxvyvz[:, 0] vy_kms = vxvyvz[:, 1] vz_kms = vxvyvz[:, 2] # (vx,vy,vz) & (x,y,z) --> (vR,vT,vz): vRvTvZ = bovy_coords.vxvyvz_to_galcencyl( vx_kms, vy_kms, vz_kms, R_kpc, phi_rad, z_kpc, vsun=[vX_gc_sun_kms, vY_gc_sun_kms, vZ_gc_sun_kms], galcen=True) vR_kms = vRvTvZ[:, 0] vT_kms = vRvTvZ[:, 1] vz_kms = vRvTvZ[:, 2] print("R = ", R_kpc, "\t kpc") print("phi = ", phi_rad, "\t rad") print("z = ", z_kpc, "\t kpc") print("v_R = ", vR_kms, "\t km/s") print("v_T = ", vT_kms, "\t km/s") print("v_z = ", vz_kms, "\t km/s") return vz_kms
rdata[:,2]=rdata[:,2]*1000.0 rdata[:,8]=rdata[:,8]*1000.0 rdata[:,14]=rdata[:,14]*1000.0 # arcsec/yr -> mas/yr rdata[:,3]=rdata[:,3]*1000.0 rdata[:,4]=rdata[:,4]*1000.0 rdata[:,9]=rdata[:,9]*1000.0 rdata[:,10]=rdata[:,10]*1000.0 rdata[:,15]=rdata[:,15]*1000.0 rdata[:,16]=rdata[:,16]*1000.0 # Galactic coordinates # True l and b RA_true=rdata[:,0] DEC_true=rdata[:,1] Tllbb=bovy_coords.radec_to_lb(RA_true,DEC_true,degree=True,epoch=2000.0) GLON_true=Tllbb[:,0] GLAT_true=Tllbb[:,1] # True pmGLON, pmGLAT pmRA_true=rdata[:,3] pmDEC_true=rdata[:,4] Tpmllbb=bovy_coords.pmrapmdec_to_pmllpmbb(pmRA_true,pmDEC_true \ ,RA_true,DEC_true,degree=True,epoch=2000.0) pmGLON_true=Tpmllbb[:,0] pmGLAT_true=Tpmllbb[:,1] # observed RA_obs=rdata[:,6] DEC_obs=rdata[:,7] pmRA_obs=rdata[:,9] pmDEC_obs=rdata[:,10] Tpmllbb=bovy_coords.pmrapmdec_to_pmllpmbb(pmRA_obs,pmDEC_obs \
def generate_fakeDFData(options,args): #Check whether the savefile already exists if os.path.exists(args[0]): savefile= open(args[0],'rb') print "Savefile already exists, not re-sampling and overwriting ..." return None #Read the data print "Reading the data ..." if options.sample.lower() == 'g': if options.select.lower() == 'program': raw= read_gdwarfs(_GDWARFFILE,logg=True,ebv=True,sn=options.snmin,nosolar=True,nocoords=True) else: raw= read_gdwarfs(logg=True,ebv=True,sn=options.snmin,nosolar=True,nocoords=True) elif options.sample.lower() == 'k': if options.select.lower() == 'program': raw= read_kdwarfs(_KDWARFFILE,logg=True,ebv=True,sn=options.snmin,nosolar=True,nocoords=True) else: raw= read_kdwarfs(logg=True,ebv=True,sn=options.snmin,nosolar=True, nocoords=True) if not options.bmin is None: #Cut on |b| raw= raw[(numpy.fabs(raw.b) > options.bmin)] if not options.fehmin is None: raw= raw[(raw.feh >= options.fehmin)] if not options.fehmax is None: raw= raw[(raw.feh < options.fehmax)] if not options.afemin is None: raw= raw[(raw.afe >= options.afemin)] if not options.afemax is None: raw= raw[(raw.afe < options.afemax)] if not options.plate is None and not options.loo: raw= raw[(raw.plate == options.plate)] elif not options.plate is None: raw= raw[(raw.plate != options.plate)] #Bin the data binned= pixelAfeFeh(raw,dfeh=options.dfeh,dafe=options.dafe) #Map the bins with ndata > minndata in 1D fehs, afes= [], [] for ii in range(len(binned.fehedges)-1): for jj in range(len(binned.afeedges)-1): data= binned(binned.feh(ii),binned.afe(jj)) if len(data) < options.minndata: continue fehs.append(binned.feh(ii)) afes.append(binned.afe(jj)) nabundancebins= len(fehs) fehs= numpy.array(fehs) afes= numpy.array(afes) if not options.singlefeh is None: if options.loo: pass else: #Set up single feh indx= binned.callIndx(options.singlefeh,options.singleafe) if numpy.sum(indx) == 0: raise IOError("Bin corresponding to singlefeh and singleafe is empty ...") data= copy.copy(binned.data[indx]) print "Using %i data points ..." % (len(data)) #Bin again binned= pixelAfeFeh(data,dfeh=options.dfeh,dafe=options.dafe) fehs, afes= [], [] for ii in range(len(binned.fehedges)-1): for jj in range(len(binned.afeedges)-1): data= binned(binned.feh(ii),binned.afe(jj)) if len(data) < options.minndata: continue fehs.append(binned.feh(ii)) afes.append(binned.afe(jj)) nabundancebins= len(fehs) fehs= numpy.array(fehs) afes= numpy.array(afes) #Setup the selection function #Load selection function plates= numpy.array(list(set(list(raw.plate))),dtype='int') #Only load plates that we use print "Using %i plates, %i stars ..." %(len(plates),len(raw)) sf= segueSelect(plates=plates,type_faint='tanhrcut', sample=options.sample,type_bright='tanhrcut', sn=options.snmin,select=options.select, indiv_brightlims=options.indiv_brightlims) platelb= bovy_coords.radec_to_lb(sf.platestr.ra,sf.platestr.dec, degree=True) if options.sample.lower() == 'g': grmin, grmax= 0.48, 0.55 rmin,rmax= 14.50001, 20.199999 #so we don't go out of the range if options.sample.lower() == 'k': grmin, grmax= 0.55, 0.75 rmin,rmax= 14.50001, 18.999999 colorrange=[grmin,grmax] mapfehs= monoAbundanceMW.fehs() mapafes= monoAbundanceMW.afes() #Setup params if not options.init is None: #Load initial parameters from file savefile= open(options.init,'rb') tparams= pickle.load(savefile) savefile.close() #Setup the correct form params= initialize(options,fehs,afes) params[0:6]= get_dfparams(tparams,options.index,options,log=True) params[6:11]= tparams[-5:len(tparams)] else: params= initialize(options,fehs,afes) #Setup potential if (options.potential.lower() == 'flatlog' or options.potential.lower() == 'flatlogdisk') \ and not options.flatten is None: #Set flattening potparams= list(get_potparams(params,options,len(fehs))) potparams[0]= options.flatten params= set_potparams(potparams,params,options,len(fehs)) pot= setup_potential(params,options,len(fehs)) aA= setup_aA(pot,options) if not options.multi is None: binned= fakeDFData_abundance_singles(binned,options,args,fehs,afes) else: for ii in range(len(fehs)): print "Working on population %i / %i ..." % (ii+1,len(fehs)) #Setup qdf dfparams= get_dfparams(params,ii,options,log=False) vo= get_vo(params,options,len(fehs)) ro= get_ro(params,options) if options.dfmodel.lower() == 'qdf': #Normalize hr= dfparams[0]/ro sr= dfparams[1]/vo sz= dfparams[2]/vo hsr= dfparams[3]/ro hsz= dfparams[4]/ro print hr, sr, sz, hsr, hsz qdf= quasiisothermaldf(hr,sr,sz,hsr,hsz,pot=pot,aA=aA,cutcounter=True) #Some more selection stuff data= binned(fehs[ii],afes[ii]) #feh and color feh= fehs[ii] fehrange= [feh-options.dfeh/2.,feh+options.dfeh/2.] #FeH fehdist= DistSpline(*numpy.histogram(data.feh,bins=5, range=fehrange), xrange=fehrange,dontcuttorange=False) #Color colordist= DistSpline(*numpy.histogram(data.dered_g\ -data.dered_r, bins=9,range=colorrange), xrange=colorrange) #Re-sample binned= fakeDFData(binned,qdf,ii,params,fehs,afes,options, rmin,rmax, platelb, grmin,grmax, fehrange, colordist, fehdist,feh,sf, mapfehs,mapafes, ro=None,vo=None) #Save to new file fitsio.write(args[0],binned.data) return None
def findfriends(targname,radial_velocity,velocity_limit=5.0,search_radius=25.0,rvcut=5.0,radec=[None,None],output_directory = None,showplots=False,verbose=False,DoGALEX=True,DoWISE=True,DoROSAT=True): radvel= radial_velocity * u.kilometer / u.second if output_directory == None: outdir = './' + targname.replace(" ", "") + '_friends/' else: outdir = output_directory if os.path.isdir(outdir) == True: print('Output directory ' + outdir +' Already Exists!!') print('Either Move it, Delete it, or input a different [output_directory] Please!') return os.mkdir(outdir) if velocity_limit < 0.00001 : print('input velocity_limit is too small, try something else') print('velocity_limit: ' + str(velocity_limit)) if search_radius < 0.0000001: print('input search_radius is too small, try something else') print('search_radius: ' + str(search_radius)) # Search parameters vlim=velocity_limit * u.kilometer / u.second searchradpc=search_radius * u.parsec if (radec[0] != None) & (radec[1] != None): usera,usedec = radec[0],radec[1] else: ##use the target name to get simbad ra and dec. print('Asking Simbad for RA and DEC') result_table = Simbad.query_object(targname) usera,usedec = result_table['RA'][0],result_table['DEC'][0] if verbose == True: print('Target name: ',targname) print('Coordinates: ' + str(usera) +' '+str(usedec)) print() c = SkyCoord( ra=usera , dec=usedec , unit=(u.hourangle, u.deg) , frame='icrs') if verbose == True: print(c) # Find precise coordinates and distance from Gaia, define search radius and parallax cutoff print('Asking Gaia for precise coordinates') sqltext = "SELECT * FROM gaiaedr3.gaia_source WHERE CONTAINS( \ POINT('ICRS',gaiaedr3.gaia_source.ra,gaiaedr3.gaia_source.dec), \ CIRCLE('ICRS'," + str(c.ra.value) +","+ str(c.dec.value) +","+ str(6.0/3600.0) +"))=1;" job = Gaia.launch_job_async(sqltext , dump_to_file=False) Pgaia = job.get_results() if verbose == True: print(sqltext) print() print(Pgaia['source_id','ra','dec','phot_g_mean_mag','parallax','ruwe'].pprint_all()) print() minpos = Pgaia['phot_g_mean_mag'].tolist().index(min(Pgaia['phot_g_mean_mag'])) Pcoord = SkyCoord( ra=Pgaia['ra'][minpos]*u.deg , dec=Pgaia['dec'][minpos]*u.deg , \ distance=(1000.0/Pgaia['parallax'][minpos])*u.parsec , frame='icrs' , \ radial_velocity=radvel , \ pm_ra_cosdec=Pgaia['pmra'][minpos]*u.mas/u.year , pm_dec=Pgaia['pmdec'][minpos]*u.mas/u.year ) searchraddeg = np.arcsin(searchradpc/Pcoord.distance).to(u.deg) minpar = (1000.0 * u.parsec) / (Pcoord.distance + searchradpc) * u.mas if verbose == True: print(Pcoord) print() print('Search radius in deg: ',searchraddeg) print('Minimum parallax: ',minpar) # Query Gaia with search radius and parallax cut # Note, a cut on parallax_error was added because searches at low galactic latitude # return an overwhelming number of noisy sources that scatter into the search volume - ALK 20210325 print('Querying Gaia for neighbors') Pllbb = bc.radec_to_lb(Pcoord.ra.value , Pcoord.dec.value , degree=True) if ( np.abs(Pllbb[1]) > 10.0): plxcut = max( 0.5 , (1000.0/Pcoord.distance.value/10.0) ) else: plxcut = 0.5 print('Parallax cut: ',plxcut) if (searchradpc < Pcoord.distance): sqltext = "SELECT * FROM gaiaedr3.gaia_source WHERE CONTAINS( \ POINT('ICRS',gaiaedr3.gaia_source.ra,gaiaedr3.gaia_source.dec), \ CIRCLE('ICRS'," + str(Pcoord.ra.value) +","+ str(Pcoord.dec.value) +","+ str(searchraddeg.value) +"))\ =1 AND parallax>" + str(minpar.value) + " AND parallax_error<" + str(plxcut) + ";" if (searchradpc >= Pcoord.distance): sqltext = "SELECT * FROM gaiaedr3.gaia_source WHERE parallax>" + str(minpar.value) + " AND parallax_error<" + str(plxcut) + ";" print('Note, using all-sky search') if verbose == True: print(sqltext) print() job = Gaia.launch_job_async(sqltext , dump_to_file=False) r = job.get_results() if verbose == True: print('Number of records: ',len(r['ra'])) # Construct coordinates array for all stars returned in cone search gaiacoord = SkyCoord( ra=r['ra'] , dec=r['dec'] , distance=(1000.0/r['parallax'])*u.parsec , \ frame='icrs' , \ pm_ra_cosdec=r['pmra'] , pm_dec=r['pmdec'] ) sep = gaiacoord.separation(Pcoord) sep3d = gaiacoord.separation_3d(Pcoord) if verbose == True: print('Printing angular separations in degrees as sanity check') print(sep.degree) Pllbb = bc.radec_to_lb(Pcoord.ra.value , Pcoord.dec.value , degree=True) Ppmllpmbb = bc.pmrapmdec_to_pmllpmbb( Pcoord.pm_ra_cosdec.value , Pcoord.pm_dec.value , \ Pcoord.ra.value , Pcoord.dec.value , degree=True ) Pvxvyvz = bc.vrpmllpmbb_to_vxvyvz(Pcoord.radial_velocity.value , Ppmllpmbb[0] , Ppmllpmbb[1] , \ Pllbb[0] , Pllbb[1] , Pcoord.distance.value/1000.0 , XYZ=False , degree=True) if verbose == True: print('Science Target Name: ',targname) print('Science Target RA/DEC: ',Pcoord.ra.value,Pcoord.dec.value) print('Science Target Galactic Coordinates: ',Pllbb) print('Science Target UVW: ',Pvxvyvz) print() Gllbb = bc.radec_to_lb(gaiacoord.ra.value , gaiacoord.dec.value , degree=True) Gxyz = bc.lbd_to_XYZ( Gllbb[:,0] , Gllbb[:,1] , gaiacoord.distance/1000.0 , degree=True) Gvrpmllpmbb = bc.vxvyvz_to_vrpmllpmbb( \ Pvxvyvz[0]*np.ones(len(Gxyz[:,0])) , Pvxvyvz[1]*np.ones(len(Gxyz[:,1])) , Pvxvyvz[2]*np.ones(len(Gxyz[:,2])) , \ Gxyz[:,0] , Gxyz[:,1] , Gxyz[:,2] , XYZ=True) Gpmrapmdec = bc.pmllpmbb_to_pmrapmdec( Gvrpmllpmbb[:,1] , Gvrpmllpmbb[:,2] , Gllbb[:,0] , Gllbb[:,1] , degree=True) # Code in case I want to do chi^2 cuts someday Gvtanerr = 1.0 * np.ones(len(Gxyz[:,0])) Gpmerr = Gvtanerr * 206265000.0 * 3.154e7 / (gaiacoord.distance.value * 3.086e13) Gchi2 = ( (Gpmrapmdec[:,0]-gaiacoord.pm_ra_cosdec.value)**2 + (Gpmrapmdec[:,1]-gaiacoord.pm_dec.value)**2 )**0.5 Gchi2 = Gchi2 / Gpmerr if verbose == True: print('Predicted PMs if comoving:') print(Gpmrapmdec , "\n") print('Actual PMRAs from Gaia:') print(gaiacoord.pm_ra_cosdec.value , "\n") print('Actual PMDECs from Gaia:') print(gaiacoord.pm_dec.value , "\n") print('Predicted PM errors:') print(Gpmerr , "\n") print('Chi^2 values:') print(Gchi2) # Query external list(s) of RVs zz = np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) ) yy = zz[0][np.argsort(sep3d[zz])] RV = np.empty(np.array(r['ra']).size) RVerr = np.empty(np.array(r['ra']).size) RVsrc = np.array([ ' None' for x in range(np.array(r['ra']).size) ]) RV[:] = np.nan RVerr[:] = np.nan print('Populating RV table') for x in range(0 , np.array(yy).size): if np.isnan(r['dr2_radial_velocity'][yy[x]]) == False: # First copy over DR2 RVs RV[yy[x]] = r['dr2_radial_velocity'][yy[x]] RVerr[yy[x]] = r['dr2_radial_velocity_error'][yy[x]] RVsrc[yy[x]] = 'Gaia DR2' if os.path.isfile('LocalRV.csv'): with open('LocalRV.csv') as csvfile: # Now check for a local RV that would supercede readCSV = csv.reader(csvfile, delimiter=',') for row in readCSV: ww = np.where(r['designation'] == row[0])[0] if (np.array(ww).size == 1): RV[ww] = row[2] RVerr[ww] = row[3] RVsrc[ww] = row[4] if verbose == True: print('Using stored RV: ',row) print(r['ra','dec','phot_g_mean_mag'][ww]) print(RV[ww]) print(RVerr[ww]) print(RVsrc[ww]) # Create Gaia CMD plot mamajek = np.loadtxt(datapath+'/sptGBpRp.txt') pleiades = np.loadtxt(datapath+'/PleGBpRp.txt') tuchor = np.loadtxt(datapath+'/TucGBpRp.txt') usco = np.loadtxt(datapath+'/UScGBpRp.txt') chai = np.loadtxt(datapath+'/ChaGBpRp.txt') zz = np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) & (np.isnan(r['bp_rp']) == False) ) # Note, this causes an error because NaNs yy = zz[0][np.argsort(sep3d[zz])] zz2= np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) & (sep.degree > 0.00001) & \ (r['phot_bp_rp_excess_factor'] < (1.3 + 0.06*r['bp_rp']**2)) & \ (np.isnan(r['bp_rp']) == False) ) # Note, this causes an error because NaNs yy2= zz2[0][np.argsort((-Gchi2)[zz2])] figname=outdir + targname.replace(" ", "") + "cmd.png" if verbose == True: print(figname) fig,ax1 = plt.subplots(figsize=(12,8)) ax1.axis([ math.floor(min(r['bp_rp'][zz])) , \ math.ceil(max(r['bp_rp'][zz])), \ math.ceil(max((r['phot_g_mean_mag'][zz] - (5.0*np.log10(gaiacoord.distance[zz].value)-5.0))))+1, \ math.floor(min((r['phot_g_mean_mag'][zz] - (5.0*np.log10(gaiacoord.distance[zz].value)-5.0))))-1 ] ) ax1.set_xlabel(r'$B_p-R_p$ (mag)' , fontsize=16) ax1.set_ylabel(r'$M_G$ (mag)' , fontsize=16) ax1.tick_params(axis='both',which='major',labelsize=12) ax2 = ax1.twiny() ax2.set_xlim(ax1.get_xlim()) spttickvals = np.array([ -0.037 , 0.377 , 0.782 , 0.980 , 1.84 , 2.50 , 3.36 , 4.75 ]) sptticklabs = np.array([ 'A0' , 'F0' , 'G0' , 'K0' , 'M0' , 'M3' , 'M5' , 'M7' ]) xx = np.where( (spttickvals >= math.floor(min(r['bp_rp'][zz]))) & (spttickvals <= math.ceil(max(r['bp_rp'][zz]))) )[0] ax2.set_xticks(spttickvals[xx]) ax2.set_xticklabels( sptticklabs[xx] ) ax2.set_xlabel('SpT' , fontsize=16, labelpad=15) ax2.tick_params(axis='both',which='major',labelsize=12) ax1.plot( chai[:,1] , chai[:,0] , zorder=1 , label='Cha-I (0-5 Myr)') ax1.plot( usco[:,1] , usco[:,0] , zorder=2 , label='USco (11 Myr)') ax1.plot( tuchor[:,1] , tuchor[:,0] , zorder=3 , label='Tuc-Hor (40 Myr)') ax1.plot(pleiades[:,1] , pleiades[:,0] , zorder=4 , label='Pleiades (125 Myr)') ax1.plot( mamajek[:,2] , mamajek[:,1] , zorder=5 , label='Mamajek MS') for x in range(0 , np.array(yy2).size): msize = (17-12.0*(sep3d[yy2[x]].value/searchradpc.value))**2 mcolor = Gchi2[yy2[x]] medge = 'black' mzorder= 7 if (r['ruwe'][yy2[x]] < 1.2): mshape='o' if (r['ruwe'][yy2[x]] >= 1.2): mshape='s' if (np.isnan(rvcut) == False): if (np.isnan(RV[yy2[x]])==False) & (np.abs(RV[yy2[x]]-Gvrpmllpmbb[yy2[x],0]) > rvcut): mshape='+' mcolor='black' mzorder=6 if (np.isnan(RV[yy2[x]])==False) & (np.abs(RV[yy2[x]]-Gvrpmllpmbb[yy2[x],0]) <= rvcut): medge='blue' ccc = ax1.scatter(r['bp_rp'][yy2[x]] , (r['phot_g_mean_mag'][yy2[x]] - (5.0*np.log10(gaiacoord.distance[yy2[x]].value)-5.0)) , \ s=msize , c=mcolor , marker=mshape , edgecolors=medge , zorder=mzorder , \ vmin=0.0 , vmax=vlim.value , cmap='cubehelix' , label='_nolabel' ) temp1 = ax1.scatter([] , [] , c='white' , edgecolors='black', marker='o' , s=12**2 , label = 'RUWE < 1.2') temp2 = ax1.scatter([] , [] , c='white' , edgecolors='black', marker='s' , s=12**2 , label = 'RUWE >= 1.2') temp3 = ax1.scatter([] , [] , c='white' , edgecolors='blue' , marker='o' , s=12**2 , label = 'RV Comoving') temp4 = ax1.scatter([] , [] , c='black' , marker='+' , s=12**2 , label = 'RV Outlier') ax1.plot(r['bp_rp'][yy[0]] , (r['phot_g_mean_mag'][yy[0]] - (5.0*np.log10(gaiacoord.distance[yy[0]].value)-5.0)) , \ 'rx' , markersize=18 , mew=3 , markeredgecolor='red' , zorder=10 , label=targname) ax1.arrow( 1.3 , 2.5 , 0.374, 0.743 , length_includes_head=True , head_width=0.07 , head_length = 0.10 ) ax1.text( 1.4 , 2.3, r'$A_V=1$' , fontsize=12) ax1.legend(fontsize=11) cb = plt.colorbar(ccc , ax=ax1) cb.set_label(label='Velocity Difference (km/s)',fontsize=14) plt.savefig(figname , bbox_inches='tight', pad_inches=0.2 , dpi=200) if showplots == True: plt.show() plt.close('all') # Create PM plot zz2= np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) & (sep.degree > 0.00001) ) yy2= zz2[0][np.argsort((-Gchi2)[zz2])] zz3= np.where( (sep3d.value < searchradpc.value) & (sep.degree > 0.00001) ) figname=outdir + targname.replace(" ", "") + "pmd.png" fig,ax1 = plt.subplots(figsize=(12,8)) ax1.axis([ (max(r['pmra'][zz2]) + 0.05*np.ptp(r['pmra'][zz2]) ) , \ (min(r['pmra'][zz2]) - 0.05*np.ptp(r['pmra'][zz2]) ) , \ (min(r['pmdec'][zz2])- 0.05*np.ptp(r['pmra'][zz2]) ) , \ (max(r['pmdec'][zz2])+ 0.05*np.ptp(r['pmra'][zz2]) ) ] ) ax1.tick_params(axis='both',which='major',labelsize=16) if ((max(r['pmra'][zz2]) + 0.05*np.ptp(r['pmra'][zz2])) > 0.0) & \ ((min(r['pmra'][zz2]) - 0.05*np.ptp(r['pmra'][zz2])) < 0.0) & \ ((min(r['pmdec'][zz2])- 0.05*np.ptp(r['pmra'][zz2])) < 0.0) & \ ((max(r['pmdec'][zz2])+ 0.05*np.ptp(r['pmra'][zz2])) > 0.0): ax1.plot( [0.0,0.0] , [-1000.0,1000.0] , 'k--' , linewidth=1 ) ax1.plot( [-1000.0,1000.0] , [0.0,0.0] , 'k--' , linewidth=1 ) ax1.errorbar( (r['pmra'][yy2]) , (r['pmdec'][yy2]) , \ yerr=(r['pmdec_error'][yy2]) , xerr=(r['pmra_error'][yy2]) , fmt='none' , ecolor='k' ) ax1.scatter( (r['pmra'][zz3]) , (r['pmdec'][zz3]) , \ s=(0.5)**2 , marker='o' , c='black' , zorder=2 , label='Field' ) for x in range(0 , np.array(yy2).size): msize = (17-12.0*(sep3d[yy2[x]].value/searchradpc.value))**2 mcolor = Gchi2[yy2[x]] medge = 'black' mzorder= 7 if (r['ruwe'][yy2[x]] < 1.2): mshape='o' if (r['ruwe'][yy2[x]] >= 1.2): mshape='s' if (np.isnan(rvcut) == False): if (np.isnan(RV[yy2[x]])==False) & (np.abs(RV[yy2[x]]-Gvrpmllpmbb[yy2[x],0]) > rvcut): mshape='+' mcolor='black' mzorder=6 if (np.isnan(RV[yy2[x]])==False) & (np.abs(RV[yy2[x]]-Gvrpmllpmbb[yy2[x],0]) <= rvcut): medge='blue' ccc = ax1.scatter(r['pmra'][yy2[x]] , r['pmdec'][yy2[x]] , \ s=msize , c=mcolor , marker=mshape , edgecolors=medge , zorder=mzorder , \ vmin=0.0 , vmax=vlim.value , cmap='cubehelix' , label='_nolabel' ) temp1 = ax1.scatter([] , [] , c='white' , edgecolors='black', marker='o' , s=12**2 , label = 'RUWE < 1.2') temp2 = ax1.scatter([] , [] , c='white' , edgecolors='black', marker='s' , s=12**2 , label = 'RUWE >= 1.2') temp3 = ax1.scatter([] , [] , c='white' , edgecolors='blue' , marker='o' , s=12**2 , label = 'RV Comoving') temp4 = ax1.scatter([] , [] , c='black' , marker='+' , s=12**2 , label = 'RV Outlier') ax1.plot( Pgaia['pmra'][minpos] , Pgaia['pmdec'][minpos] , \ 'rx' , markersize=18 , mew=3 , markeredgecolor='red' , zorder=3 , label=targname) ax1.set_xlabel(r'$\mu_{RA}$ (mas/yr)' , fontsize=22 , labelpad=10) ax1.set_ylabel(r'$\mu_{DEC}$ (mas/yr)' , fontsize=22 , labelpad=10) ax1.legend(fontsize=12) cb = plt.colorbar(ccc , ax=ax1) cb.set_label(label='Tangential Velocity Difference (km/s)',fontsize=18 , labelpad=10) plt.savefig(figname , bbox_inches='tight', pad_inches=0.2 , dpi=200) if showplots == True: plt.show() plt.close('all') # Create RV plot zz2= np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) & (sep.degree > 0.00001) & \ (np.isnan(RV) == False) ) yy2= zz2[0][np.argsort((-Gchi2)[zz2])] zz3= np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) & (sep.degree > 0.00001) & \ (np.isnan(RV) == False) & (np.isnan(r['phot_g_mean_mag']) == False) & \ (np.abs(RV-Gvrpmllpmbb[:,0]) < 20.0) ) # Just to set Y axis fig,ax1 = plt.subplots(figsize=(12,8)) ax1.axis([ -20.0 , +20.0, \ max( np.append( np.array(r['phot_g_mean_mag'][zz3] - (5.0*np.log10(gaiacoord.distance[zz3].value)-5.0)) , 0.0 )) + 0.3 , \ min( np.append( np.array(r['phot_g_mean_mag'][zz3] - (5.0*np.log10(gaiacoord.distance[zz3].value)-5.0)) , 15.0 )) - 0.3 ]) ax1.tick_params(axis='both',which='major',labelsize=16) ax1.plot( [0.0,0.0] , [-20.0,25.0] , 'k--' , linewidth=1 ) ax1.errorbar( (RV[yy2]-Gvrpmllpmbb[yy2,0]) , \ (r['phot_g_mean_mag'][yy2] - (5.0*np.log10(gaiacoord.distance[yy2].value)-5.0)) , \ yerr=None,xerr=(RVerr[yy2]) , fmt='none' , ecolor='k' ) for x in range(0 , np.array(yy2).size): msize = (17-12.0*(sep3d[yy2[x]].value/searchradpc.value))**2 mcolor = Gchi2[yy2[x]] medge = 'black' mzorder= 2 if (r['ruwe'][yy2[x]] < 1.2): mshape='o' if (r['ruwe'][yy2[x]] >= 1.2): mshape='s' ccc = ax1.scatter( (RV[yy2[x]]-Gvrpmllpmbb[yy2[x],0]) , \ (r['phot_g_mean_mag'][yy2[x]] - (5.0*np.log10(gaiacoord.distance[yy2[x]].value)-5.0)) , \ s=msize , c=mcolor , marker=mshape , edgecolors=medge , zorder=mzorder , \ vmin=0.0 , vmax=vlim.value , cmap='cubehelix' , label='_nolabel' ) temp1 = ax1.scatter([] , [] , c='white' , edgecolors='black', marker='o' , s=12**2 , label = 'RUWE < 1.2') temp2 = ax1.scatter([] , [] , c='white' , edgecolors='black', marker='s' , s=12**2 , label = 'RUWE >= 1.2') temp3 = ax1.scatter([] , [] , c='white' , edgecolors='blue' , marker='o' , s=12**2 , label = 'RV Comoving') if ( (Pgaia['phot_g_mean_mag'][minpos] - (5.0*np.log10(Pcoord.distance.value)-5.0)) < \ (max( np.append( np.array(r['phot_g_mean_mag'][zz3] - (5.0*np.log10(gaiacoord.distance[zz3].value)-5.0)) , 0.0 )) + 0.3) ): ax1.plot( [0.0] , (Pgaia['phot_g_mean_mag'][minpos] - (5.0*np.log10(Pcoord.distance.value)-5.0)) , \ 'rx' , markersize=18 , mew=3 , markeredgecolor='red' , zorder=3 , label=targname) ax1.set_ylabel(r'$M_G$ (mag)' , fontsize=22 , labelpad=10) ax1.set_xlabel(r'$v_{r,obs}-v_{r,pred}$ (km/s)' , fontsize=22 , labelpad=10) ax1.legend(fontsize=12) cb = plt.colorbar(ccc , ax=ax1) cb.set_label(label='Tangential Velocity Difference (km/s)',fontsize=18 , labelpad=10) figname=outdir + targname.replace(" ", "") + "drv.png" plt.savefig(figname , bbox_inches='tight', pad_inches=0.2 , dpi=200) if showplots == True: plt.show() plt.close('all') # Create XYZ plot Pxyz = bc.lbd_to_XYZ( Pllbb[0] , Pllbb[1] , Pcoord.distance.value/1000.0 , degree=True) fig,axs = plt.subplots(2,2) fig.set_figheight(16) fig.set_figwidth(16) fig.subplots_adjust(hspace=0.03,wspace=0.03) zz2= np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) & (sep.degree > 0.00001) ) yy2= zz2[0][np.argsort((-Gchi2)[zz2])] for x in range(0 , np.array(yy2).size): msize = (17-12.0*(sep3d[yy2[x]].value/searchradpc.value))**2 mcolor = Gchi2[yy2[x]] medge = 'black' mzorder= 3 if (r['ruwe'][yy2[x]] < 1.2): mshape='o' if (r['ruwe'][yy2[x]] >= 1.2): mshape='s' if (np.isnan(rvcut) == False): if (np.isnan(RV[yy2[x]])==False) & (np.abs(RV[yy2[x]]-Gvrpmllpmbb[yy2[x],0]) > rvcut): mshape='+' mcolor='black' mzorder=2 if (np.isnan(RV[yy2[x]])==False) & (np.abs(RV[yy2[x]]-Gvrpmllpmbb[yy2[x],0]) <= rvcut): medge='blue' ccc = axs[0,0].scatter( 1000.0*Gxyz[yy2[x],0] , 1000.0*Gxyz[yy2[x],1] , \ s=msize , c=mcolor , marker=mshape , edgecolors=medge , zorder=mzorder , \ vmin=0.0 , vmax=vlim.value , cmap='cubehelix' , label='_nolabel' ) ccc = axs[0,1].scatter( 1000.0*Gxyz[yy2[x],2] , 1000.0*Gxyz[yy2[x],1] , \ s=msize , c=mcolor , marker=mshape , edgecolors=medge , zorder=mzorder , \ vmin=0.0 , vmax=vlim.value , cmap='cubehelix' , label='_nolabel' ) ccc = axs[1,0].scatter( 1000.0*Gxyz[yy2[x],0] , 1000.0*Gxyz[yy2[x],2] , \ s=msize , c=mcolor , marker=mshape , edgecolors=medge , zorder=mzorder , \ vmin=0.0 , vmax=vlim.value , cmap='cubehelix' , label='_nolabel' ) temp1 = axs[0,0].scatter([] , [] , c='white' , edgecolors='black', marker='o' , s=12**2 , label = 'RUWE < 1.2') temp2 = axs[0,0].scatter([] , [] , c='white' , edgecolors='black', marker='s' , s=12**2 , label = 'RUWE >= 1.2') temp3 = axs[0,0].scatter([] , [] , c='white' , edgecolors='blue' , marker='o' , s=12**2 , label = 'RV Comoving') temp4 = axs[0,0].scatter([] , [] , c='black' , marker='+' , s=12**2 , label = 'RV Outlier') axs[0,0].plot( 1000.0*Pxyz[0] , 1000.0*Pxyz[1] , 'rx' , markersize=18 , mew=3 , markeredgecolor='red') axs[0,1].plot( 1000.0*Pxyz[2] , 1000.0*Pxyz[1] , 'rx' , markersize=18 , mew=3 , markeredgecolor='red') axs[1,0].plot( 1000.0*Pxyz[0] , 1000.0*Pxyz[2] , 'rx' , markersize=18 , mew=3 , markeredgecolor='red' , zorder=1 , label = targname) axs[0,0].set_xlim( [1000.0*Pxyz[0]-(search_radius+1.0) , 1000.0*Pxyz[0]+(search_radius+1.0)] ) axs[0,0].set_ylim( [1000.0*Pxyz[1]-(search_radius+1.0) , 1000.0*Pxyz[1]+(search_radius+1.0)] ) axs[0,1].set_xlim( [1000.0*Pxyz[2]-(search_radius+1.0) , 1000.0*Pxyz[2]+(search_radius+1.0)] ) axs[0,1].set_ylim( [1000.0*Pxyz[1]-(search_radius+1.0) , 1000.0*Pxyz[1]+(search_radius+1.0)] ) axs[1,0].set_xlim( [1000.0*Pxyz[0]-(search_radius+1.0) , 1000.0*Pxyz[0]+(search_radius+1.0)] ) axs[1,0].set_ylim( [1000.0*Pxyz[2]-(search_radius+1.0) , 1000.0*Pxyz[2]+(search_radius+1.0)] ) axs[0,0].set_xlabel(r'$X$ (pc)',fontsize=20,labelpad=10) axs[0,0].set_ylabel(r'$Y$ (pc)',fontsize=20,labelpad=10) axs[1,0].set_xlabel(r'$X$ (pc)',fontsize=20,labelpad=10) axs[1,0].set_ylabel(r'$Z$ (pc)',fontsize=20,labelpad=10) axs[0,1].set_xlabel(r'$Z$ (pc)',fontsize=20,labelpad=10) axs[0,1].set_ylabel(r'$Y$ (pc)',fontsize=20,labelpad=10) axs[0,0].xaxis.set_ticks_position('top') axs[0,1].xaxis.set_ticks_position('top') axs[0,1].yaxis.set_ticks_position('right') axs[0,0].xaxis.set_label_position('top') axs[0,1].xaxis.set_label_position('top') axs[0,1].yaxis.set_label_position('right') for aa in [0,1]: for bb in [0,1]: axs[aa,bb].tick_params(top=True,bottom=True,left=True,right=True,direction='in',labelsize=18) fig.delaxes(axs[1][1]) strsize = 26 if (len(targname) > 12.0): strsize = np.floor(24 / (len(targname)/14.5)) fig.legend( bbox_to_anchor=(0.92,0.37) , prop={'size':strsize}) cbaxes = fig.add_axes([0.55,0.14,0.02,0.34]) cb = plt.colorbar( ccc , cax=cbaxes ) cb.set_label( label='Velocity Difference (km/s)' , fontsize=24 , labelpad=20 ) cb.ax.tick_params(labelsize=18) figname=outdir + targname.replace(" ", "") + "xyz.png" plt.savefig(figname , bbox_inches='tight', pad_inches=0.2 , dpi=200) if showplots == True: plt.show() plt.close('all') # Create sky map # Hacked from cartopy.mpl.gridliner _DEGREE_SYMBOL = u'\u00B0' def _east_west_formatted(longitude, num_format='g'): fmt_string = u'{longitude:{num_format}}{degree}' return fmt_string.format(longitude=(longitude if (longitude >= 0) else (longitude + 360)) , \ num_format=num_format,degree=_DEGREE_SYMBOL) def _north_south_formatted(latitude, num_format='g'): fmt_string = u'{latitude:{num_format}}{degree}' return fmt_string.format(latitude=latitude, num_format=num_format,degree=_DEGREE_SYMBOL) LONGITUDE_FORMATTER = mticker.FuncFormatter(lambda v, pos: _east_west_formatted(v)) LATITUDE_FORMATTER = mticker.FuncFormatter(lambda v, pos: _north_south_formatted(v)) zz = np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) & (sep.degree > 0.00001) ) yy = zz[0][np.argsort((-Gchi2)[zz])] searchcircle = Pcoord.directional_offset_by( (np.arange(0,360)*u.degree) , searchraddeg*np.ones(360)) circleRA = searchcircle.ra.value circleDE = searchcircle.dec.value ww = np.where(circleRA > 180.0) circleRA[ww] = circleRA[ww] - 360.0 RAlist = gaiacoord.ra[yy].value DElist = gaiacoord.dec[yy].value ww = np.where( RAlist > 180.0 ) RAlist[ww] = RAlist[ww] - 360.0 polelat = ((Pcoord.dec.value+90) if (Pcoord.dec.value<0) else (90-Pcoord.dec.value)) polelong= (Pcoord.ra.value if (Pcoord.dec.value<0.0) else (Pcoord.ra.value+180.0)) polelong= (polelong if polelong < 180 else polelong - 360.0) if verbose == True: print('Alignment variables: ',polelat,polelong,Pcoord.ra.value) print(Pcoord.dec.value+searchraddeg.value) rotated_pole = ccrs.RotatedPole( \ pole_latitude=polelat , \ pole_longitude=polelong , \ central_rotated_longitude=90.0 )#\ # (Pcoord.ra.value if (Pcoord.dec.value > 0.0) else (Pcoord.ra.value+180.0)) ) fig = plt.figure(figsize=(8,8)) ax = fig.add_subplot(1, 1, 1, projection=rotated_pole) ax.gridlines(draw_labels=True,x_inline=True,y_inline=True, \ xformatter=LONGITUDE_FORMATTER,yformatter=LATITUDE_FORMATTER) ax.plot( circleRA , circleDE , c="gray" , ls="--" , transform=ccrs.Geodetic()) figname=outdir + targname.replace(" ", "") + "sky.png" base=plt.cm.get_cmap('cubehelix') for x in range(0 , np.array(yy).size): msize = (17-12.0*(sep3d[yy[x]].value/searchradpc.value)) mcolor = base(Gchi2[yy[x]]/vlim.value) medge = 'black' mzorder= 3 if (r['ruwe'][yy[x]] < 1.2): mshape='o' if (r['ruwe'][yy[x]] >= 1.2): mshape='s' if (np.isnan(rvcut) == False): if (np.isnan(RV[yy[x]])==False) & (np.abs(RV[yy[x]]-Gvrpmllpmbb[yy[x],0]) > rvcut): mshape='+' mcolor='black' mzorder=2 if (np.isnan(RV[yy[x]])==False) & (np.abs(RV[yy[x]]-Gvrpmllpmbb[yy[x],0]) <= rvcut): medge='blue' ccc = ax.plot( RAlist[x] , DElist[x] , marker=mshape , \ markeredgecolor=medge , ms = msize , mfc = mcolor , transform=ccrs.Geodetic() ) ax.plot( (Pcoord.ra.value-360.0) , Pcoord.dec.value , \ 'rx' , markersize=18 , mew=3 , transform=ccrs.Geodetic()) plt.savefig(figname , bbox_inches='tight', pad_inches=0.2 , dpi=200) if showplots == True: plt.show() plt.close('all') ## Query GALEX and 2MASS data zz = np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) ) yy = zz[0][np.argsort((-Gchi2)[zz])] NUVmag = np.empty(np.array(r['ra']).size) NUVerr = np.empty(np.array(r['ra']).size) NUVmag[:] = np.nan NUVerr[:] = np.nan print('Searching on neighbors in GALEX') ##suppress the stupid noresultswarning from the catalogs package warnings.filterwarnings("ignore",category=NoResultsWarning) for x in range(0 , np.array(yy).size): querystring=((str(gaiacoord.ra[yy[x]].value) if (gaiacoord.ra[yy[x]].value > 0) \ else str(gaiacoord.ra[yy[x]].value+360.0)) + " " + str(gaiacoord.dec[yy[x]].value)) print('GALEX query ',x,' of ',np.array(yy).size, end='\r') if verbose == True: print('GALEX query ',x,' of ',np.array(yy).size) if verbose == True: print(querystring) if (DoGALEX == True): galex = Catalogs.query_object(querystring , catalog="Galex" , radius=0.0028 , TIMEOUT=600) if ((np.where(galex['nuv_magerr'] > 0.0)[0]).size > 0): ww = np.where( (galex['nuv_magerr'] == min(galex['nuv_magerr'][np.where(galex['nuv_magerr'] > 0.0)]))) NUVmag[yy[x]] = galex['nuv_mag'][ww][0] NUVerr[yy[x]] = galex['nuv_magerr'][ww][0] if verbose == True: print(galex['distance_arcmin','ra','nuv_mag','nuv_magerr'][ww]) Jmag = np.empty(np.array(r['ra']).size) Jerr = np.empty(np.array(r['ra']).size) Jmag[:] = np.nan Jerr[:] = np.nan print('Searching on neighbors in 2MASS') for x in range(0 , np.array(yy).size): if ( np.isnan(NUVmag[yy[x]]) == False ): querycoord = SkyCoord((str(gaiacoord.ra[yy[x]].value) if (gaiacoord.ra[yy[x]].value > 0) else \ str(gaiacoord.ra[yy[x]].value+360.0)) , str(gaiacoord.dec[yy[x]].value) , \ unit=(u.deg,u.deg) , frame='icrs') print('2MASS query ',x,' of ',np.array(yy).size, end='\r') if verbose == True: print('2MASS query ',x,' of ',np.array(yy).size) if verbose == True: print(querycoord) tmass = [] if (DoGALEX == True): tmass = Irsa.query_region(querycoord , catalog='fp_psc' , radius='0d0m10s' ) if ((np.where(tmass['j_m'] > -10.0)[0]).size > 0): ww = np.where( (tmass['j_m'] == min(tmass['j_m'][np.where(tmass['j_m'] > 0.0)]))) Jmag[yy[x]] = tmass['j_m'][ww][0] Jerr[yy[x]] = tmass['j_cmsig'][ww][0] if verbose == True: print(tmass['j_m','j_cmsig'][ww]) # Create GALEX plots mamajek = np.loadtxt(datapath+'/sptGBpRp.txt') f = interp1d( mamajek[:,2] , mamajek[:,0] , kind='cubic') zz2 = np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) ) yy2 = zz[0][np.argsort(sep3d[zz])] zz = np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) & (sep.degree > 0.00001) ) yy = zz[0][np.argsort((-Gchi2)[zz])] fnuvj = (3631.0 * 10**6 * 10**(-0.4 * NUVmag)) / (1594.0 * 10**6 * 10**(-0.4 * Jmag)) spt = f(r['bp_rp'].filled(np.nan)) sptstring = ["nan" for x in range(np.array(r['bp_rp']).size)] for x in range(0 , np.array(zz2).size): if (round(spt[yy2[x]],1) >= 17.0) and (round(spt[yy2[x]],1) < 27.0): sptstring[yy2[x]] = 'M' + ('% 3.1f' % (round(spt[yy2[x]],1)-17.0)).strip() if (round(spt[yy2[x]],1) >= 16.0) and (round(spt[yy2[x]],1) < 17.0): sptstring[yy2[x]] = 'K' + ('% 3.1f' % (round(spt[yy2[x]],1)-9.0)).strip() if (round(spt[yy2[x]],1) >= 10.0) and (round(spt[yy2[x]],1) < 16.0): sptstring[yy2[x]] = 'K' + ('% 3.1f' % (round(spt[yy2[x]],1)-10.0)).strip() if (round(spt[yy2[x]],1) >= 0.0) and (round(spt[yy2[x]],1) < 10.0): sptstring[yy2[x]] = 'G' + ('% 3.1f' % (round(spt[yy2[x]],1)-0.0)).strip() if (round(spt[yy2[x]],1) >= -10.0) and (round(spt[yy2[x]],1) < 0.0): sptstring[yy2[x]] = 'F' + ('% 3.1f' % (round(spt[yy2[x]],1)+10.0)).strip() if (round(spt[yy2[x]],1) >= -20.0) and (round(spt[yy2[x]],1) < -10.0): sptstring[yy2[x]] = 'A' + ('% 3.1f' % (round(spt[yy2[x]],1)+20.0)).strip() if (round(spt[yy2[x]],1) >= -30.0) and (round(spt[yy2[x]],1) < -20.0): sptstring[yy2[x]] = 'B' + ('% 3.1f' % (round(spt[yy2[x]],1)+30.0)).strip() figname=outdir + targname.replace(" ", "") + "galex.png" if verbose == True: print(figname) ##Muck with the axis to get two x axes fig,ax1 = plt.subplots(figsize=(12,8)) ax1.set_yscale('log') ax1.axis([5.0 , 24.0 , 0.000004 , 0.02]) ax2 = ax1.twiny() ax2.set_xlim(ax1.get_xlim()) ax1.set_xticks(np.array([5.0 , 10.0 , 15.0 , 17.0 , 22.0 , 24.0])) ax1.set_xticklabels(['G5','K0','K5','M0','M5','M7']) ax1.set_xlabel('SpT' , fontsize=20, labelpad=15) ax1.tick_params(axis='both',which='major',labelsize=16) ax2.set_xticks(np.array([5.0 , 10.0 , 15.0 , 17.0 , 22.0 , 24.0])) ax2.set_xticklabels(['0.85','0.98','1.45','1.84','3.36','4.75']) ax2.set_xlabel(r'$B_p-R_p$ (mag)' , fontsize=20, labelpad=15) ax2.tick_params(axis='both',which='major',labelsize=16) ax1.set_ylabel(r'$F_{NUV}/F_{J}$' , fontsize=22, labelpad=0) ##Hyades hyades = readsav(datapath +'/HYsaved.sav') hyadesfnuvj = (3631.0 * 10**6 * 10**(-0.4 * hyades['clnuv'])) / (1594.0 * 10**6 * 10**(-0.4 * hyades['clJ'])) ax1.plot(hyades['clspt'] , hyadesfnuvj , 'x' , markersize=4 , mew=1 , markeredgecolor='black' , zorder=1 , label='Hyades' ) for x in range(0 , np.array(yy).size): msize = (17-12.0*(sep3d[yy[x]].value/searchradpc.value))**2 mcolor = Gchi2[yy[x]] medge = 'black' mzorder= 3 if (r['ruwe'][yy[x]] < 1.2): mshape='o' if (r['ruwe'][yy[x]] >= 1.2): mshape='s' if (np.isnan(rvcut) == False): if (np.isnan(RV[yy[x]])==False) & (np.abs(RV[yy[x]]-Gvrpmllpmbb[yy[x],0]) > rvcut): mshape='+' mcolor='black' mzorder=2 if (np.isnan(RV[yy[x]])==False) & (np.abs(RV[yy[x]]-Gvrpmllpmbb[yy[x],0]) <= rvcut): medge='blue' ccc = ax1.scatter( spt[yy[x]] , fnuvj[yy[x]] , \ s=msize , c=mcolor , marker=mshape , edgecolors=medge , zorder=mzorder , \ vmin=0.0 , vmax=vlim.value , cmap='cubehelix' , label='_nolabel' ) temp1 = ax1.scatter([] , [] , c='white' , edgecolors='black', marker='o' , s=12**2 , label = 'RUWE < 1.2') temp2 = ax1.scatter([] , [] , c='white' , edgecolors='black', marker='s' , s=12**2 , label = 'RUWE >= 1.2') temp3 = ax1.scatter([] , [] , c='white' , edgecolors='blue' , marker='o' , s=12**2 , label = 'RV Comoving') temp4 = ax1.scatter([] , [] , c='black' , marker='+' , s=12**2 , label = 'RV Outlier') # Plot science target if (spt[yy[0]] > 5): ax1.plot(spt[yy[0]] , fnuvj[yy[0]] , 'rx' , markersize=18 , mew=3 , markeredgecolor='red' , zorder=3 , label=targname ) ax1.legend(fontsize=16 , loc='lower left') cb = fig.colorbar(ccc , ax=ax1) cb.set_label(label='Velocity Offset (km/s)',fontsize=13) if (DoGALEX == True): plt.savefig(figname , bbox_inches='tight', pad_inches=0.2 , dpi=200) if showplots == True: plt.show() plt.close('all') # Query CatWISE for W1+W2 and AllWISE for W3+W4 zz = np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) ) yy = zz[0][np.argsort((-Gchi2)[zz])] WISEmag = np.empty([np.array(r['ra']).size,4]) WISEerr = np.empty([np.array(r['ra']).size,4]) WISEmag[:] = np.nan WISEerr[:] = np.nan print('Searching on neighbors in WISE') ##there's an annoying nan warning here, hide it for now as it's not a problem warnings.filterwarnings("ignore",category=UserWarning) for x in range(0 , np.array(yy).size): querycoord = SkyCoord((str(gaiacoord.ra[yy[x]].value) if (gaiacoord.ra[yy[x]].value > 0) else \ str(gaiacoord.ra[yy[x]].value+360.0)) , str(gaiacoord.dec[yy[x]].value) , \ unit=(u.deg,u.deg) , frame='icrs') print('WISE query ',x,' of ',np.array(yy).size, end='\r') if verbose == True: print('WISE query ',x,' of ',np.array(yy).size) if verbose == True: print(querycoord) wisecat = [] if (DoWISE == True): wisecat = Irsa.query_region(querycoord,catalog='catwise_2020' , radius='0d0m10s') if ((np.where(wisecat['w1mpro'] > -10.0)[0]).size > 0): ww = np.where( (wisecat['w1mpro'] == min( wisecat['w1mpro'][np.where(wisecat['w1mpro'] > -10.0)]) )) WISEmag[yy[x],0] = wisecat['w1mpro'][ww][0] WISEerr[yy[x],0] = wisecat['w1sigmpro'][ww][0] if ((np.where(wisecat['w2mpro'] > -10.0)[0]).size > 0): ww = np.where( (wisecat['w2mpro'] == min( wisecat['w2mpro'][np.where(wisecat['w2mpro'] > -10.0)]) )) WISEmag[yy[x],1] = wisecat['w2mpro'][ww][0] WISEerr[yy[x],1] = wisecat['w2sigmpro'][ww][0] if (DoWISE == True): wisecat = Irsa.query_region(querycoord,catalog='allwise_p3as_psd' , radius='0d0m10s') if ((np.where(wisecat['w1mpro'] > -10.0)[0]).size > 0): ww = np.where( (wisecat['w1mpro'] == min( wisecat['w1mpro'][np.where(wisecat['w1mpro'] > -10.0)]) )) if (np.isnan(WISEmag[yy[x],0]) == True) | (wisecat['w1mpro'][ww][0] < 11.0): # Note, only if CatWISE absent/saturated WISEmag[yy[x],0] = wisecat['w1mpro'][ww][0] WISEerr[yy[x],0] = wisecat['w1sigmpro'][ww][0] if ((np.where(wisecat['w2mpro'] > -10.0)[0]).size > 0): ww = np.where( (wisecat['w2mpro'] == min( wisecat['w2mpro'][np.where(wisecat['w2mpro'] > -10.0)]) )) if (np.isnan(WISEmag[yy[x],1]) == True) | (wisecat['w2mpro'][ww][0] < 11.0): # Note, only if CatWISE absent/saturated WISEmag[yy[x],1] = wisecat['w2mpro'][ww][0] WISEerr[yy[x],1] = wisecat['w2sigmpro'][ww][0] if ((np.where(wisecat['w3mpro'] > -10.0)[0]).size > 0): ww = np.where( (wisecat['w3mpro'] == min( wisecat['w3mpro'][np.where(wisecat['w3mpro'] > -10.0)]) )) WISEmag[yy[x],2] = wisecat['w3mpro'][ww][0] WISEerr[yy[x],2] = wisecat['w3sigmpro'][ww][0] if ((np.where(wisecat['w4mpro'] > -10.0)[0]).size > 0): ww = np.where( (wisecat['w4mpro'] == min( wisecat['w4mpro'][np.where(wisecat['w4mpro'] > -10.0)]) )) WISEmag[yy[x],3] = wisecat['w4mpro'][ww][0] WISEerr[yy[x],3] = wisecat['w4sigmpro'][ww][0] if verbose == True: print(yy[x],WISEmag[yy[x],:],WISEerr[yy[x],:]) # Create WISE plots W13 = WISEmag[:,0]-WISEmag[:,2] W13err = ( WISEerr[:,0]**2 + WISEerr[:,2]**2 )**0.5 zz = np.argwhere( np.isnan(W13err) ) W13[zz] = np.nan W13err[zz] = np.nan zz = np.where( (W13err > 0.15) ) W13[zz] = np.nan W13err[zz] = np.nan warnings.filterwarnings("default",category=UserWarning) zz2 = np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value)) yy2 = zz[0][np.argsort(sep3d[zz])] zz = np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) & (sep.degree > 0.00001) ) yy = zz[0][np.argsort((-Gchi2)[zz])] figname=outdir + targname.replace(" ", "") + "wise.png" if verbose == True: print(figname) plt.figure(figsize=(12,8)) if (verbose == True) & ((np.where(np.isfinite(W13+W13err))[0]).size > 0): print('Max y value: ' , (max((W13+W13err)[np.isfinite(W13+W13err)])+0.1) ) plt.axis([ 5.0 , 24.0 , \ max( [(min(np.append((W13-W13err)[ np.isfinite(W13-W13err) ],-0.1))-0.1) , -0.3]) , \ max( [(max(np.append((W13+W13err)[ np.isfinite(W13+W13err) ],+0.0))+0.2) , +0.6]) ]) ax1 = plt.gca() ax2 = ax1.twiny() ax2.set_xlim(5.0,24.0) ax1.set_xticks(np.array([5.0 , 10.0 , 15.0 , 17.0 , 22.0 , 24.0])) ax1.set_xticklabels(['G5','K0','K5','M0','M5','M7']) ax1.set_xlabel('SpT' , fontsize=20, labelpad=15) ax1.tick_params(axis='both',which='major',labelsize=16) ax2.set_xticks(np.array([5.0 , 10.0 , 15.0 , 17.0 , 22.0 , 24.0])) ax2.set_xticklabels(['0.85','0.98','1.45','1.84','3.36','4.75']) ax2.set_xlabel(r'$B_p-R_p$ (mag)' , fontsize=20, labelpad=15) ax2.tick_params(axis='both',which='major',labelsize=16) ax1.set_ylabel(r'$W1-W3$ (mag)' , fontsize=22, labelpad=0) # Plot field sequence from Tuc-Hor (Kraus et al. 2014) fldspt = [ 5 , 7 , 10 , 12 , 15 , 17 , 20 , 22 , 24 ] fldW13 = [ 0 , 0 , 0 , .02, .06, .12, .27, .40, .60] plt.plot(fldspt , fldW13 , zorder=0 , label='Photosphere') # Plot neighbors ax1.errorbar( spt[yy] , W13[yy] , yerr=W13err[yy] , fmt='none' , ecolor='k') for x in range(0 , np.array(yy).size): msize = (17-12.0*(sep3d[yy[x]].value/searchradpc.value))**2 mcolor = Gchi2[yy[x]] medge = 'black' mzorder= 3 if (r['ruwe'][yy[x]] < 1.2): mshape='o' if (r['ruwe'][yy[x]] >= 1.2): mshape='s' if (np.isnan(rvcut) == False): if (np.isnan(RV[yy[x]])==False) & (np.abs(RV[yy[x]]-Gvrpmllpmbb[yy[x],0]) > rvcut): mshape='+' mcolor='black' mzorder=2 if (np.isnan(RV[yy[x]])==False) & (np.abs(RV[yy[x]]-Gvrpmllpmbb[yy[x],0]) <= rvcut): medge='blue' ccc = ax1.scatter( spt[yy[x]] , W13[yy[x]] , \ s=msize , c=mcolor , marker=mshape , edgecolors=medge , zorder=mzorder , \ vmin=0.0 , vmax=vlim.value , cmap='cubehelix' , label='_nolabel' ) temp1 = ax1.scatter([] , [] , c='white' , edgecolors='black', marker='o' , s=12**2 , label = 'RUWE < 1.2') temp2 = ax1.scatter([] , [] , c='white' , edgecolors='black', marker='s' , s=12**2 , label = 'RUWE >= 1.2') temp3 = ax1.scatter([] , [] , c='white' , edgecolors='blue' , marker='o' , s=12**2 , label = 'RV Comoving') temp4 = ax1.scatter([] , [] , c='black' , marker='+' , s=12**2 , label = 'RV Outlier') # Plot science target if (spt[yy2[0]] > 5): plt.plot(spt[yy2[0]] , W13[yy2[0]] , 'rx' , markersize=18 , mew=3 , markeredgecolor='red' , zorder=3 , label=targname ) plt.legend(fontsize=16 , loc='upper left') cb = plt.colorbar(ccc , ax=ax1) cb.set_label(label='Velocity Offset (km/s)',fontsize=14) if (DoWISE == True): plt.savefig(figname , bbox_inches='tight', pad_inches=0.2 , dpi=200) if showplots == True: plt.show() plt.close('all') # Cross-reference with ROSAT v = Vizier(columns=["**", "+_R"] , catalog='J/A+A/588/A103/cat2rxs' ) zz = np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) ) yy = zz[0][np.argsort(sep3d[zz])] ROSATflux = np.empty([np.array(r['ra']).size]) ROSATflux[:] = np.nan print('Searching on neighbors in ROSAT') for x in range(0 , np.array(yy).size): querycoord = SkyCoord((str(gaiacoord.ra[yy[x]].value) if (gaiacoord.ra[yy[x]].value > 0) else \ str(gaiacoord.ra[yy[x]].value+360.0)) , str(gaiacoord.dec[yy[x]].value) , \ unit=(u.deg,u.deg) , frame='icrs') print('ROSAT query ',x,' of ',np.array(yy).size, end='\r') if verbose == True: print('ROSAT query ',x,' of ',np.array(yy).size) if verbose == True: print(querycoord) if (DoROSAT == True): rosatcat = v.query_region(querycoord , radius='0d1m0s' ) if (len(rosatcat) > 0): rosatcat = rosatcat['J/A+A/588/A103/cat2rxs'] if verbose == True: print(rosatcat) if ((np.where(rosatcat['CRate'] > -999)[0]).size > 0): ww = np.where( (rosatcat['CRate'] == max(rosatcat['CRate'][np.where(rosatcat['CRate'] > -999)]))) ROSATflux[yy[x]] = rosatcat['CRate'][ww][0] if verbose == True: print(x,yy[x],ROSATflux[yy[x]]) # Create output table with results print('Creating Output Tables with Results') if verbose == True: print('Reminder, there were this many input entries: ',len(Gxyz[:,0])) print('The search radius in velocity space is: ',vlim) print() zz = np.where( (sep3d.value < searchradpc.value) & (Gchi2 < vlim.value) ) sortlist = np.argsort(sep3d[zz]) yy = zz[0][sortlist] fmt1 = "%11.7f %11.7f %6.3f %6.3f %11.3f %8.4f %8.4f %8.2f %8.2f %8.2f %8.3f %4s %8.6f %6.2f %7.3f %7.3f %35s" fmt2 = "%11.7f %11.7f %6.3f %6.3f %11.3f %8.4f %8.4f %8.2f %8.2f %8.2f %8.3f %4s %8.6f %6.2f %7.3f %7.3f %35s" filename=outdir + targname.replace(" ", "") + ".txt" warnings.filterwarnings("ignore",category=UserWarning) if verbose == True: print('Also creating SIMBAD query table') print(filename) print('RA DEC Gmag Bp-Rp Voff(km/s) Sep(deg) 3D(pc) Vr(pred) Vr(obs) Vrerr Plx(mas) SpT FnuvJ W1-W3 RUWE XCrate RVsrc') with open(filename,'w') as file1: file1.write('RA DEC Gmag Bp-Rp Voff(km/s) Sep(deg) 3D(pc) Vr(pred) Vr(obs) Vrerr Plx(mas) SpT FnuvJ W1-W3 RUWE XCrate RVsrc \n') for x in range(0 , np.array(zz).size): if verbose == True: print(fmt1 % (gaiacoord.ra[yy[x]].value,gaiacoord.dec[yy[x]].value, \ r['phot_g_mean_mag'][yy[x]], r['bp_rp'][yy[x]] , \ Gchi2[yy[x]] , sep[yy[x]].value , sep3d[yy[x]].value , \ Gvrpmllpmbb[yy[x],0] , RV[yy[x]] , RVerr[yy[x]] , \ r['parallax'][yy[x]], \ sptstring[yy[x]] , fnuvj[yy[x]] , W13[yy[x]] , r['ruwe'][yy[x]] , ROSATflux[yy[x]] , RVsrc[yy[x]]) ) with open(filename,'a') as file1: file1.write(fmt2 % (gaiacoord.ra[yy[x]].value,gaiacoord.dec[yy[x]].value, \ r['phot_g_mean_mag'][yy[x]], r['bp_rp'][yy[x]] , \ Gchi2[yy[x]],sep[yy[x]].value,sep3d[yy[x]].value , \ Gvrpmllpmbb[yy[x],0] , RV[yy[x]] , RVerr[yy[x]] , \ r['parallax'][yy[x]], \ sptstring[yy[x]] , fnuvj[yy[x]] , W13[yy[x]] , r['ruwe'][yy[x]] , ROSATflux[yy[x]] , RVsrc[yy[x]]) ) file1.write("\n") filename=outdir + targname.replace(" ", "") + ".csv" with open(filename,mode='w') as result_file: wr = csv.writer(result_file) wr.writerow(['RA','DEC','Gmag','Bp-Rp','Voff(km/s)','Sep(deg)','3D(pc)','Vr(pred)','Vr(obs)','Vrerr','Plx(mas)','SpT','FnuvJ','W1-W3','RUWE','XCrate','RVsrc']) for x in range(0 , np.array(zz).size): wr.writerow(( "{0:.7f}".format(gaiacoord.ra[yy[x]].value) , "{0:.7f}".format(gaiacoord.dec[yy[x]].value) , \ "{0:.3f}".format(r['phot_g_mean_mag'][yy[x]]), "{0:.3f}".format(r['bp_rp'][yy[x]]) , \ "{0:.3f}".format(Gchi2[yy[x]]) , "{0:.4f}".format(sep[yy[x]].value) , "{0:.4f}".format(sep3d[yy[x]].value) , \ "{0:.2f}".format(Gvrpmllpmbb[yy[x],0]) , "{0:.2f}".format(RV[yy[x]]) , "{0:.2f}".format(RVerr[yy[x]]) , \ "{0:.3f}".format(r['parallax'][yy[x]]), \ sptstring[yy[x]] , "{0:.6f}".format(fnuvj[yy[x]]) , "{0:.2f}".format(W13[yy[x]]) , \ "{0:.3f}".format(r['ruwe'][yy[x]]) , "{0:.3f}".format(ROSATflux[yy[x]]) , RVsrc[yy[x]].strip()) ) if verbose == True: print('All output can be found in ' + outdir) return outdir
def make_rcsample(parser): options, args = parser.parse_args() savefilename = options.savefilename if savefilename is None: #Create savefilename if not given savefilename = os.path.join( appath._APOGEE_DATA, 'rcsample_' + appath._APOGEE_REDUX + '.fits') print("Saving to %s ..." % savefilename) #Read the base-sample data = apread.allStar(adddist=_ADDHAYDENDIST, rmdups=options.rmdups) #Remove a bunch of fields that we do not want to keep data = esutil.numpy_util.remove_fields(data, [ 'TARGET_ID', 'FILE', 'AK_WISE', 'SFD_EBV', 'SYNTHVHELIO_AVG', 'SYNTHVSCATTER', 'SYNTHVERR', 'SYNTHVERR_MED', 'RV_TEFF', 'RV_LOGG', 'RV_FEH', 'RV_ALPHA', 'RV_CARB', 'RV_CCFWHM', 'RV_AUTOFWHM', 'SYNTHSCATTER', 'STABLERV_CHI2', 'STABLERV_RCHI2', 'STABLERV_CHI2_PROB', 'CHI2_THRESHOLD', 'APSTAR_VERSION', 'ASPCAP_VERSION', 'RESULTS_VERSION', 'WASH_M', 'WASH_M_ERR', 'WASH_T2', 'WASH_T2_ERR', 'DDO51', 'DDO51_ERR', 'IRAC_3_6', 'IRAC_3_6_ERR', 'IRAC_4_5', 'IRAC_4_5_ERR', 'IRAC_5_8', 'IRAC_5_8_ERR', 'IRAC_8_0', 'IRAC_8_0_ERR', 'WISE_4_5', 'WISE_4_5_ERR', 'TARG_4_5', 'TARG_4_5_ERR', 'WASH_DDO51_GIANT_FLAG', 'WASH_DDO51_STAR_FLAG', 'REDUCTION_ID', 'SRC_H', 'PM_SRC' ]) if not appath._APOGEE_REDUX.lower() == 'current' \ and not 'l30' in appath._APOGEE_REDUX \ and int(appath._APOGEE_REDUX[1:]) < 500: data = esutil.numpy_util.remove_fields(data, ['ELEM']) #Select red-clump stars jk = data['J0'] - data['K0'] z = isodist.FEH2Z(data['METALS'], zsolar=0.017) if 'l30' in appath._APOGEE_REDUX: logg = data['LOGG'] elif appath._APOGEE_REDUX.lower() == 'current' \ or int(appath._APOGEE_REDUX[1:]) > 600: from apogee.tools import paramIndx if False: #Use my custom logg calibration that's correct for the RC logg = (1. - 0.042) * data['FPARAM'][:, paramIndx('logg')] - 0.213 lowloggindx = data['FPARAM'][:, paramIndx('logg')] < 1. logg[lowloggindx] = data['FPARAM'][lowloggindx, paramIndx('logg')] - 0.255 hiloggindx = data['FPARAM'][:, paramIndx('logg')] > 3.8 logg[hiloggindx] = data['FPARAM'][hiloggindx, paramIndx('logg')] - 0.3726 else: #Use my custom logg calibration that's correct on average logg = (1. + 0.03) * data['FPARAM'][:, paramIndx('logg')] - 0.37 lowloggindx = data['FPARAM'][:, paramIndx('logg')] < 1. logg[lowloggindx] = data['FPARAM'][lowloggindx, paramIndx('logg')] - 0.34 hiloggindx = data['FPARAM'][:, paramIndx('logg')] > 3.8 logg[hiloggindx] = data['FPARAM'][hiloggindx, paramIndx('logg')] - 0.256 else: logg = data['LOGG'] indx= (jk < 0.8)*(jk >= 0.5)\ *(z <= 0.06)\ *(z <= rcmodel.jkzcut(jk,upper=True))\ *(z >= rcmodel.jkzcut(jk))\ *(logg >= rcmodel.loggteffcut(data['TEFF'],z,upper=False))\ *(logg <= rcmodel.loggteffcut(data['TEFF'],z,upper=True)) data = data[indx] #Add more aggressive flag cut data = esutil.numpy_util.add_fields(data, [('ADDL_LOGG_CUT', numpy.int32)]) data['ADDL_LOGG_CUT'] = ( (data['TEFF'] - 4800.) / 1000. + 2.75) > data['LOGG'] if options.loggcut: data = data[data['ADDL_LOGG_CUT'] == 1] print("Making catalog of %i objects ..." % len(data)) #Add distances data = esutil.numpy_util.add_fields(data, [('RC_DIST', float), ('RC_DM', float), ('RC_GALR', float), ('RC_GALPHI', float), ('RC_GALZ', float)]) rcd = rcmodel.rcdist() jk = data['J0'] - data['K0'] z = isodist.FEH2Z(data['METALS'], zsolar=0.017) data['RC_DIST'] = rcd(jk, z, appmag=data['K0']) * options.distfac data['RC_DM'] = 5. * numpy.log10(data['RC_DIST']) + 10. XYZ = bovy_coords.lbd_to_XYZ(data['GLON'], data['GLAT'], data['RC_DIST'], degree=True) R, phi, Z = bovy_coords.XYZ_to_galcencyl(XYZ[:, 0], XYZ[:, 1], XYZ[:, 2], Xsun=8., Zsun=0.025) data['RC_GALR'] = R data['RC_GALPHI'] = phi data['RC_GALZ'] = Z #Save fitsio.write(savefilename, data, clobber=True) # Add Tycho-2 matches if options.tyc2: data = esutil.numpy_util.add_fields(data, [('TYC2MATCH', numpy.int32), ('TYC1', numpy.int32), ('TYC2', numpy.int32), ('TYC3', numpy.int32)]) data['TYC2MATCH'] = 0 data['TYC1'] = -1 data['TYC2'] = -1 data['TYC3'] = -1 # Write positions posfilename = tempfile.mktemp('.csv', dir=os.getcwd()) resultfilename = tempfile.mktemp('.csv', dir=os.getcwd()) with open(posfilename, 'w') as csvfile: wr = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) wr.writerow(['RA', 'DEC']) for ii in range(len(data)): wr.writerow([data[ii]['RA'], data[ii]['DEC']]) # Send to CDS for matching result = open(resultfilename, 'w') try: subprocess.check_call([ 'curl', '-X', 'POST', '-F', 'request=xmatch', '-F', 'distMaxArcsec=2', '-F', 'RESPONSEFORMAT=csv', '-F', 'cat1=@%s' % os.path.basename(posfilename), '-F', 'colRA1=RA', '-F', 'colDec1=DEC', '-F', 'cat2=vizier:Tycho2', 'http://cdsxmatch.u-strasbg.fr/xmatch/api/v1/sync' ], stdout=result) except subprocess.CalledProcessError: os.remove(posfilename) if os.path.exists(resultfilename): result.close() os.remove(resultfilename) result.close() # Directly match on input RA ma = numpy.loadtxt(resultfilename, delimiter=',', skiprows=1, usecols=(1, 2, 7, 8, 9)) iis = numpy.arange(len(data)) mai = [iis[data['RA'] == ma[ii, 0]][0] for ii in range(len(ma))] data['TYC2MATCH'][mai] = 1 data['TYC1'][mai] = ma[:, 2] data['TYC2'][mai] = ma[:, 3] data['TYC3'][mai] = ma[:, 4] os.remove(posfilename) os.remove(resultfilename) if not options.nostat: #Determine statistical sample and add flag apo = apogee.select.apogeeSelect() statIndx = apo.determine_statistical(data) mainIndx = apread.mainIndx(data) data = esutil.numpy_util.add_fields(data, [('STAT', numpy.int32), ('INVSF', float)]) data['STAT'] = 0 data['STAT'][statIndx * mainIndx] = 1 for ii in range(len(data)): if (statIndx * mainIndx)[ii]: data['INVSF'][ii] = 1. / apo(data['LOCATION_ID'][ii], data['H'][ii]) else: data['INVSF'][ii] = -1. if options.nopm: fitsio.write(savefilename, data, clobber=True) return None #Get proper motions, in a somewhat roundabout way pmfile = savefilename.split('.')[0] + '_pms.fits' if os.path.exists(pmfile): pmdata = fitsio.read(pmfile, 1) else: pmdata = numpy.recarray( len(data), formats=['f8', 'f8', 'f8', 'f8', 'f8', 'f8', 'i4'], names=[ 'RA', 'DEC', 'PMRA', 'PMDEC', 'PMRA_ERR', 'PMDEC_ERR', 'PMMATCH' ]) # Write positions, again ... posfilename = tempfile.mktemp('.csv', dir=os.getcwd()) resultfilename = tempfile.mktemp('.csv', dir=os.getcwd()) with open(posfilename, 'w') as csvfile: wr = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) wr.writerow(['RA', 'DEC']) for ii in range(len(data)): wr.writerow([data[ii]['RA'], data[ii]['DEC']]) # Send to CDS for matching result = open(resultfilename, 'w') try: subprocess.check_call([ 'curl', '-X', 'POST', '-F', 'request=xmatch', '-F', 'distMaxArcsec=4', '-F', 'RESPONSEFORMAT=csv', '-F', 'cat1=@%s' % os.path.basename(posfilename), '-F', 'colRA1=RA', '-F', 'colDec1=DEC', '-F', 'cat2=vizier:UCAC4', 'http://cdsxmatch.u-strasbg.fr/xmatch/api/v1/sync' ], stdout=result) except subprocess.CalledProcessError: os.remove(posfilename) if os.path.exists(resultfilename): result.close() os.remove(resultfilename) result.close() # Match back and only keep the closest one ma = numpy.loadtxt(resultfilename, delimiter=',', skiprows=1, converters={ 15: lambda s: float(s.strip() or -9999), 16: lambda s: float(s.strip() or -9999), 17: lambda s: float(s.strip() or -9999), 18: lambda s: float(s.strip() or -9999) }, usecols=(4, 5, 15, 16, 17, 18)) h = esutil.htm.HTM() m1, m2, d12 = h.match(data['RA'], data['DEC'], ma[:, 0], ma[:, 1], 4. / 3600., maxmatch=1) pmdata['PMMATCH'] = 0 pmdata['RA'] = data['RA'] pmdata['DEC'] = data['DEC'] pmdata['PMMATCH'][m1] = 1 pmdata['PMRA'][m1] = ma[m2, 2] pmdata['PMDEC'][m1] = ma[m2, 3] pmdata['PMRA_ERR'][m1] = ma[m2, 4] pmdata['PMDEC_ERR'][m1] = ma[m2, 5] pmdata['PMMATCH'][(pmdata['PMRA'] == -9999) \ +(pmdata['PMDEC'] == -9999) \ +(pmdata['PMRA_ERR'] == -9999) \ +(pmdata['PMDEC_ERR'] == -9999)]= 0 fitsio.write(pmfile, pmdata, clobber=True) #To make sure we're using the same format below pmdata = fitsio.read(pmfile, 1) os.remove(posfilename) os.remove(resultfilename) #Match proper motions try: #These already exist currently, but may not always exist data = esutil.numpy_util.remove_fields(data, ['PMRA', 'PMDEC']) except ValueError: pass data = esutil.numpy_util.add_fields(data, [('PMRA', numpy.float), ('PMDEC', numpy.float), ('PMRA_ERR', numpy.float), ('PMDEC_ERR', numpy.float), ('PMMATCH', numpy.int32)]) data['PMMATCH'] = 0 h = esutil.htm.HTM() m1, m2, d12 = h.match(pmdata['RA'], pmdata['DEC'], data['RA'], data['DEC'], 2. / 3600., maxmatch=1) data['PMRA'][m2] = pmdata['PMRA'][m1] data['PMDEC'][m2] = pmdata['PMDEC'][m1] data['PMRA_ERR'][m2] = pmdata['PMRA_ERR'][m1] data['PMDEC_ERR'][m2] = pmdata['PMDEC_ERR'][m1] data['PMMATCH'][m2] = pmdata['PMMATCH'][m1].astype(numpy.int32) pmindx = data['PMMATCH'] == 1 data['PMRA'][True - pmindx] = -9999.99 data['PMDEC'][True - pmindx] = -9999.99 data['PMRA_ERR'][True - pmindx] = -9999.99 data['PMDEC_ERR'][True - pmindx] = -9999.99 #Calculate Galactocentric velocities data = esutil.numpy_util.add_fields(data, [('GALVR', numpy.float), ('GALVT', numpy.float), ('GALVZ', numpy.float)]) lb = bovy_coords.radec_to_lb(data['RA'], data['DEC'], degree=True) XYZ = bovy_coords.lbd_to_XYZ(lb[:, 0], lb[:, 1], data['RC_DIST'], degree=True) pmllpmbb = bovy_coords.pmrapmdec_to_pmllpmbb(data['PMRA'], data['PMDEC'], data['RA'], data['DEC'], degree=True) vxvyvz = bovy_coords.vrpmllpmbb_to_vxvyvz(data['VHELIO_AVG'], pmllpmbb[:, 0], pmllpmbb[:, 1], lb[:, 0], lb[:, 1], data['RC_DIST'], degree=True) vR, vT, vZ = bovy_coords.vxvyvz_to_galcencyl( vxvyvz[:, 0], vxvyvz[:, 1], vxvyvz[:, 2], 8. - XYZ[:, 0], XYZ[:, 1], XYZ[:, 2] + 0.025, vsun=[-11.1, 30.24 * 8., 7.25]) #Assumes proper motion of Sgr A* and R0=8 kpc, zo= 25 pc data['GALVR'] = vR data['GALVT'] = vT data['GALVZ'] = vZ data['GALVR'][True - pmindx] = -9999.99 data['GALVT'][True - pmindx] = -9999.99 data['GALVZ'][True - pmindx] = -9999.99 #Get PPMXL proper motions, in a somewhat roundabout way pmfile = savefilename.split('.')[0] + '_pms_ppmxl.fits' if os.path.exists(pmfile): pmdata = fitsio.read(pmfile, 1) else: pmdata = numpy.recarray( len(data), formats=['f8', 'f8', 'f8', 'f8', 'f8', 'f8', 'i4'], names=[ 'RA', 'DEC', 'PMRA', 'PMDEC', 'PMRA_ERR', 'PMDEC_ERR', 'PMMATCH' ]) # Write positions, again ... posfilename = tempfile.mktemp('.csv', dir=os.getcwd()) resultfilename = tempfile.mktemp('.csv', dir=os.getcwd()) with open(posfilename, 'w') as csvfile: wr = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) wr.writerow(['RA', 'DEC']) for ii in range(len(data)): wr.writerow([data[ii]['RA'], data[ii]['DEC']]) # Send to CDS for matching result = open(resultfilename, 'w') try: subprocess.check_call([ 'curl', '-X', 'POST', '-F', 'request=xmatch', '-F', 'distMaxArcsec=4', '-F', 'RESPONSEFORMAT=csv', '-F', 'cat1=@%s' % os.path.basename(posfilename), '-F', 'colRA1=RA', '-F', 'colDec1=DEC', '-F', 'cat2=vizier:PPMXL', 'http://cdsxmatch.u-strasbg.fr/xmatch/api/v1/sync' ], stdout=result) except subprocess.CalledProcessError: os.remove(posfilename) if os.path.exists(resultfilename): result.close() os.remove(resultfilename) result.close() # Match back and only keep the closest one ma = numpy.loadtxt(resultfilename, delimiter=',', skiprows=1, converters={ 15: lambda s: float(s.strip() or -9999), 16: lambda s: float(s.strip() or -9999), 17: lambda s: float(s.strip() or -9999), 18: lambda s: float(s.strip() or -9999) }, usecols=(4, 5, 15, 16, 19, 20)) h = esutil.htm.HTM() m1, m2, d12 = h.match(data['RA'], data['DEC'], ma[:, 0], ma[:, 1], 4. / 3600., maxmatch=1) pmdata['PMMATCH'] = 0 pmdata['RA'] = data['RA'] pmdata['DEC'] = data['DEC'] pmdata['PMMATCH'][m1] = 1 pmdata['PMRA'][m1] = ma[m2, 2] pmdata['PMDEC'][m1] = ma[m2, 3] pmdata['PMRA_ERR'][m1] = ma[m2, 4] pmdata['PMDEC_ERR'][m1] = ma[m2, 5] pmdata['PMMATCH'][(pmdata['PMRA'] == -9999) \ +(pmdata['PMDEC'] == -9999) \ +(pmdata['PMRA_ERR'] == -9999) \ +(pmdata['PMDEC_ERR'] == -9999)]= 0 fitsio.write(pmfile, pmdata, clobber=True) #To make sure we're using the same format below pmdata = fitsio.read(pmfile, 1) os.remove(posfilename) os.remove(resultfilename) #Match proper motions to ppmxl data = esutil.numpy_util.add_fields(data, [('PMRA_PPMXL', numpy.float), ('PMDEC_PPMXL', numpy.float), ('PMRA_ERR_PPMXL', numpy.float), ('PMDEC_ERR_PPMXL', numpy.float), ('PMMATCH_PPMXL', numpy.int32)]) data['PMMATCH_PPMXL'] = 0 h = esutil.htm.HTM() m1, m2, d12 = h.match(pmdata['RA'], pmdata['DEC'], data['RA'], data['DEC'], 2. / 3600., maxmatch=1) data['PMRA_PPMXL'][m2] = pmdata['PMRA'][m1] data['PMDEC_PPMXL'][m2] = pmdata['PMDEC'][m1] data['PMRA_ERR_PPMXL'][m2] = pmdata['PMRA_ERR'][m1] data['PMDEC_ERR_PPMXL'][m2] = pmdata['PMDEC_ERR'][m1] data['PMMATCH_PPMXL'][m2] = pmdata['PMMATCH'][m1].astype(numpy.int32) pmindx = data['PMMATCH_PPMXL'] == 1 data['PMRA_PPMXL'][True - pmindx] = -9999.99 data['PMDEC_PPMXL'][True - pmindx] = -9999.99 data['PMRA_ERR_PPMXL'][True - pmindx] = -9999.99 data['PMDEC_ERR_PPMXL'][True - pmindx] = -9999.99 #Calculate Galactocentric velocities data = esutil.numpy_util.add_fields(data, [('GALVR_PPMXL', numpy.float), ('GALVT_PPMXL', numpy.float), ('GALVZ_PPMXL', numpy.float)]) lb = bovy_coords.radec_to_lb(data['RA'], data['DEC'], degree=True) XYZ = bovy_coords.lbd_to_XYZ(lb[:, 0], lb[:, 1], data['RC_DIST'], degree=True) pmllpmbb = bovy_coords.pmrapmdec_to_pmllpmbb(data['PMRA_PPMXL'], data['PMDEC_PPMXL'], data['RA'], data['DEC'], degree=True) vxvyvz = bovy_coords.vrpmllpmbb_to_vxvyvz(data['VHELIO_AVG'], pmllpmbb[:, 0], pmllpmbb[:, 1], lb[:, 0], lb[:, 1], data['RC_DIST'], degree=True) vR, vT, vZ = bovy_coords.vxvyvz_to_galcencyl( vxvyvz[:, 0], vxvyvz[:, 1], vxvyvz[:, 2], 8. - XYZ[:, 0], XYZ[:, 1], XYZ[:, 2] + 0.025, vsun=[-11.1, 30.24 * 8., 7.25]) #Assumes proper motion of Sgr A* and R0=8 kpc, zo= 25 pc data['GALVR_PPMXL'] = vR data['GALVT_PPMXL'] = vT data['GALVZ_PPMXL'] = vZ data['GALVR_PPMXL'][True - pmindx] = -9999.99 data['GALVT_PPMXL'][True - pmindx] = -9999.99 data['GALVZ_PPMXL'][True - pmindx] = -9999.99 #Save fitsio.write(savefilename, data, clobber=True) return None
def dust_correction(self, r_ks=0.306, r_j=0.72, r_h=0.46): """ For 2MASS bandpasses: ks, j and h magnitudes, this function will return the corrected magnitudes based of the SFD E(B-V) values at a given for a line of sight in Galactic coordinates (l,b). Exctinction coefficients r_ are bandpassses taken by Yuan et al. 2013. Input ------ data(astropy.table): Astropy table contaning (contains: ks_mag, j_mag, h_mag) Output ------- data(astropy.table): Initial data table in addition to new columns: (ks0, j0, h0, aks, aj, ah) """ # Transform RA, DEC to l,b lb = bovy_coords.radec_to_lb(self.data['ra'], self.data['dec'], degree=True) l, b = lb[:, 0], lb[:, 1] N = len(l) # Total number of stars in data file query_max = 1000000 # maximum number of sources we can query N_int = N / query_max # Split the data to query L = np.arange(0, (int(N_int) + 1) * query_max, step=query_max) L = np.append(L, N) # add last value of total N points sfd = SFDWebQuery() # call SFD query function ks0 = np.ndarray(shape=(N, 1)) # empty array for corrected magnitudes j0 = np.ndarray(shape=(N, 1)) # empty array for corrected magnitudes h0 = np.ndarray(shape=(N, 1)) # empty array for corrected magnitudes aks = np.ndarray(shape=(N, 1)) # empty array for corrected magnitudes aj = np.ndarray(shape=(N, 1)) # empty array for corrected magnitudes ah = np.ndarray(shape=(N, 1)) # empty array for corrected magnitudes for i in range(0, len(L) - 1): # Select the Galactic coordinates we want to estimate E(B-V) l_ad = l[L[i]:L[i + 1]] b_ad = b[L[i]:L[i + 1]] coords = SkyCoord(l_ad * u.deg, b_ad * u.deg, frame='galactic') # Query coords and return E(B-V) SFD for each source ebv_sfd = sfd(coords) # Apply corrections to each magnitude band based on E(B-V) estimates corr_ks = ((self.data['ks_m'])[L[i]:L[i + 1]]) - (r_ks * ebv_sfd) corr_j = ((self.data['j_m'])[L[i]:L[i + 1]]) - (r_j * ebv_sfd) corr_h = ((self.data['h_m'])[L[i]:L[i + 1]]) - (r_h * ebv_sfd) # corrected magnitudes ks0[L[i]:L[i + 1], 0] = corr_ks j0[L[i]:L[i + 1], 0] = corr_j h0[L[i]:L[i + 1], 0] = corr_h # exctinction coefficient appends aks[L[i]:L[i + 1], 0] = r_ks * ebv_sfd aj[L[i]:L[i + 1], 0] = r_j * ebv_sfd ah[L[i]:L[i + 1], 0] = r_h * ebv_sfd dat = Table([ks0, j0, h0, aks, aj, ah], names=('ks0', 'j0', 'h0', 'A_ks', 'A_j', 'A_h')) self.data.add_columns([ dat['ks0'], dat['j0'], dat['h0'], dat['A_ks'], dat['A_j'], dat['A_h'] ]) return (self.data)
def photometry(self, dustmap=None, v=True): ''' Computes the Grvs-magnitudes and total velocity in Galactocentric restframe. Parameters ---------- dustmap : DustMap Dustmap object to be used ''' from hvs.utils import DustMap from hvs.utils.gaia import get_GRVS from galpy.util.bovy_coords import radec_to_lb if (self.cattype < 1): raise RuntimeError('The catalog needs to be propagated!') if (not isinstance(dustmap, DustMap)): raise ValueError( 'You must provide an instance of the class DustMap.') if (hasattr(self, 'll')): self.GRVS, self.V, self.G, self.e_par, self.e_pmra, self.pmdec = get_GRVS( self.dist.to('kpc').value, self.ll, self.bb, self.m.to('Msun').value, self.tage.to('Myr').value, dustmap) else: data = radec_to_lb(self.ra.to('deg').value, self.dec.to('deg').value, degree=True) l, b = data[:, 0], data[:, 1] self.GRVS, self.V, self.G, self.e_par, self.e_pmra, self.e_pmdec = get_GRVS( self.dist.to('kpc').value, l, b, self.m.to('Msun').value, self.tage.to('Myr').value, dustmap) self.e_par = self.e_par * u.uas self.e_pmra = self.e_pmra * u.uas / u.yr self.e_pmdec = self.e_pmdec * u.uas / u.yr if (v): import astropy.coordinates as coord from galpy.util.bovy_coords import radec_to_lb, pmrapmdec_to_pmllpmbb vSun = [ -self.solarmotion[0], self.solarmotion[1], self.solarmotion[2] ] * u.km / u.s # (U, V, W) vrot = [0., 220., 0.] * u.km / u.s RSun = 8. * u.kpc zSun = 0 * u.pc v_sun = coord.CartesianDifferential(vSun + vrot) GCCS = coord.Galactocentric(galcen_distance=RSun, z_sun=zSun, galcen_v_sun=v_sun) data = radec_to_lb(self.ra.to('deg').value, self.dec.to('deg').value, degree=True) ll, bb = data[:, 0], data[:, 1] data = pmrapmdec_to_pmllpmbb(self.pmra, self.pmdec, self.ra.to('deg').value, self.dec.to('deg').value, degree=True) pmll, pmbb = data[:, 0], data[:, 1] galactic_coords = coord.Galactic(l=ll * u.deg, b=bb * u.deg, distance=self.dist, pm_l_cosb=pmll * u.mas / u.yr, pm_b=pmbb * u.mas / u.yr, radial_velocity=self.vlos) galactocentric_coords = galactic_coords.transform_to(GCCS) self.GCv = np.sqrt(galactocentric_coords.v_x**2. + galactocentric_coords.v_y**2. + galactocentric_coords.v_z**2.).to(u.km / u.s) self.GCdist = np.sqrt(galactocentric_coords.x**2. + galactocentric_coords.y**2. + galactocentric_coords.z**2.).to(u.kpc) self.cattype = 2
def volume(self, vol_func, xyz=False, MJ=None, JK=None, ndists=101, linearDist=False, relative=False, ncpu=None): """ NAME: volume PURPOSE: Compute the effective volume of a spatial volume under this effective selection function INPUT: vol_func - function of (a) (ra/deg,dec/deg,dist/kpc) (b) heliocentric Galactic X,Y,Z if xyz that returns 1. inside the spatial volume under consideration and 0. outside of it, should be able to take array input of a certain shape and return an array with the same shape xyz= (False) if True, vol_func is a function of X,Y,Z (see above) MJ= (object-wide default) absolute magnitude in J or an array of samples of absolute magnitudes in J for the tracer population JK= (object-wide default) J-Ks color or an array of samples of the J-Ks color relative= (False) if True, compute the effective volume completeness = effective volume / true volume; computed using the same integration grid, so will be more robust against integration errors (especially due to the finite HEALPix grid for the angular integration). For simple volumes, a more precise effective volume can be computed by using relative=True and multiplying in the correct true volume ndists= (101) number of distances to use in the distance integration linearDist= (False) if True, integrate in distance rather than distance modulus ncpu= (None) if set to an integer, use this many CPUs to compute the effective selection function (only for non-zero extinction) OUTPUT effective volume HISTORY: 2017-01-18 - Written - Bovy (UofT/CCA) """ # Pre-compute coordinates for integrand evaluation if not hasattr(self,'_ra_cen_4vol') or \ (hasattr(self,'_ndists_4vol') and (ndists != self._ndists_4vol or linearDist != self._linearDist_4vol)): theta,phi= healpy.pix2ang(\ _BASE_NSIDE,numpy.arange(_BASE_NPIX)\ [True^self._tgasSel._exclude_mask_skyonly],nest=True) self._ra_cen_4vol = 180. / numpy.pi * phi self._dec_cen_4vol = 90. - 180. / numpy.pi * theta if linearDist: dists = numpy.linspace(0.001, 10., ndists) dms = 5. * numpy.log10(dists) + 10. self._deltadm_4vol = dists[1] - dists[0] else: dms = numpy.linspace(0., 18., ndists) self._deltadm_4vol = (dms[1] - dms[0]) * numpy.log(10.) / 5. self._dists_4vol = 10.**(0.2 * dms - 2.) self._tiled_dists3_4vol= numpy.tile(\ self._dists_4vol**(3.-linearDist),(len(self._ra_cen_4vol),1)) self._tiled_ra_cen_4vol = numpy.tile(self._ra_cen_4vol, (len(self._dists_4vol), 1)).T self._tiled_dec_cen_4vol = numpy.tile(self._dec_cen_4vol, (len(self._dists_4vol), 1)).T lb = bovy_coords.radec_to_lb(phi, numpy.pi / 2. - theta) l = numpy.tile(lb[:, 0], (len(self._dists_4vol), 1)).T.flatten() b = numpy.tile(lb[:, 1], (len(self._dists_4vol), 1)).T.flatten() XYZ_4vol= \ bovy_coords.lbd_to_XYZ(l,b, numpy.tile(self._dists_4vol, (len(self._ra_cen_4vol),1)).flatten()) self._X_4vol = numpy.reshape( XYZ_4vol[:, 0], (len(self._ra_cen_4vol), len(self._dists_4vol))) self._Y_4vol = numpy.reshape( XYZ_4vol[:, 1], (len(self._ra_cen_4vol), len(self._dists_4vol))) self._Z_4vol = numpy.reshape( XYZ_4vol[:, 2], (len(self._ra_cen_4vol), len(self._dists_4vol))) # Cache effective-selection function MJ, JK = self._parse_mj_jk(MJ, JK) new_hash = hashlib.md5(numpy.array([MJ, JK])).hexdigest() if not hasattr(self,'_vol_MJ_hash') or new_hash != self._vol_MJ_hash \ or (hasattr(self,'_ndists_4vol') and (ndists != self._ndists_4vol or linearDist != self._linearDist_4vol)): # Need to update the effective-selection function if isinstance(self._dmap3d, mwdust.Zero): #easy bc same everywhere effsel_4vol = self(self._dists_4vol, self._ra_cen_4vol[0], self._dec_cen_4vol[0], MJ=MJ, JK=JK) self._effsel_4vol = numpy.tile(effsel_4vol, (len(self._ra_cen_4vol), 1)) else: # Need to treat each los separately if ncpu is None: self._effsel_4vol = numpy.empty( (len(self._ra_cen_4vol), len(self._dists_4vol))) for ii,(ra_cen, dec_cen) \ in enumerate(tqdm.tqdm(zip(self._ra_cen_4vol, self._dec_cen_4vol))): self._effsel_4vol[ii] = self(self._dists_4vol, ra_cen, dec_cen, MJ=MJ, JK=JK) else: multiOut= multi.parallel_map(\ lambda x: self(self._dists_4vol, self._ra_cen_4vol[x], self._dec_cen_4vol[x],MJ=MJ,JK=JK), range(len(self._ra_cen_4vol)), numcores=ncpu) self._effsel_4vol = numpy.array(multiOut) self._vol_MJ_hash = new_hash self._ndists_4vol = ndists self._linearDist_4vol = linearDist out = 0. if xyz: out= numpy.sum(\ self._effsel_4vol\ *vol_func(self._X_4vol,self._Y_4vol,self._Z_4vol)\ *self._tiled_dists3_4vol) else: out= numpy.sum(\ self._effsel_4vol\ *vol_func(self._ra_cen_4vol,self._dec_cen_4vol, self._dists_4vol)\ *self._tiled_dists3_4vol) if relative: if not hasattr(self, '_tgasEffSelUniform'): tgasSelUniform = tgasSelectUniform(comp=1.) self._tgasEffSelUniform = tgasEffectiveSelect(tgasSelUniform) true_volume = self._tgasEffSelUniform.volume(vol_func, xyz=xyz, ndists=ndists, linearDist=linearDist, relative=False) else: true_volume = 1. return out*healpy.nside2pixarea(_BASE_NSIDE)*self._deltadm_4vol\ /true_volume
# not use SDSS photometry # input data infile = '/Users/dkawata/work/obs/LAMOST/DR3/LAMOSTDR3_AstarxAPASSDR9.fits' star_hdus = pyfits.open(infile) star = star_hdus[1].data star_hdus.close() # read the data # number of data points print 'number of stars read =', len(star['obsid']) # select stas with teff and logg # Galactic coordinates Tllbb = bovy_coords.radec_to_lb(star['ra'], star['dec'], degree=True, epoch=2000.0) glon = Tllbb[:, 0] glat = Tllbb[:, 1] sindx=np.where((star['teff']>7330.0) & (star['teff']<8040.0) \ & (star['logg']>3.2) \ & (star['Vmag']>0.0) & (star['Bmag']>0.0) \ & (star['rv_err']>0.0) & (star['rv_err']<10.0)) # & (glon>140.0) & (glon<220.0)) # & (glon>175.0) & (glon<185.0)) nstars = len(star['ra'][sindx]) print ' N selected=', nstars # extract the necessary particle info ra_s = star['ra'][sindx]
def mockDataSim( x, v, selectionFunction=None, kDwarfs=False, ro=8.0, phio=0.0, fehrange=None, fehdist=None, colordist=None ): """ NAME: mockDataSim PURPOSE: generate mock SEGUE data from an N-body simulation INPUT: x - position of all simulation particles [x,y,z], [:,3] (kpc) v - velocity of all simulation particles [vx,vy,vz] [:,3] (km/s) selectionFunction - instance of a selection function kDwarfs= if True, generate K dwarfs ro= mock solar radius [kpc] phio= mock solar azimuth [deg] OUTPUT: HISTORY: 2013-01-31 - Written - Bovy (IAS) """ # Calculate l and b to associate data with los Xsun = ro * numpy.cos(phio * _DEGTORAD) Ysun = ro * numpy.sin(phio * _DEGTORAD) Zsun = 0.0 X = -(x[:, 0] - Xsun) Y = x[:, 1] - Ysun Z = x[:, 2] - Zsun lbd = bovy_coords.XYZ_to_lbd(X, Y, Z, degree=True) # Now find all simulation particles for each los platelb = bovy_coords.radec_to_lb(selectionFunction.platestr.ra, selectionFunction.platestr.dec, degree=True) simIndices = [] inLos = numpy.zeros(len(x[:, 0]), dtype="bool") for ii in range(len(selectionFunction.plates)): thisIndx = findSimInLos(platelb[ii, 0], platelb[ii, 1], lbd[:, 0], lbd[:, 1]) simIndices.append(thisIndx) inLos[thisIndx] = True print platelb[ii, 0], platelb[ii, 1], numpy.sum(simIndices[-1]) return lbd # Draw colors and metallicities for all stars that belong to a los grs = numpy.empty(len(x[:, 0])) fehs = numpy.empty(len(x[:, 0])) # Calculate color and metallicity distributions if kDwarfs: grmin, grmax = 0.55, 0.77 else: grmin, grmax = 0.48, 0.55 ngr, nfeh = 21, 21 tgrs = numpy.linspace(grmin, grmax, ngr) tfehs = numpy.linspace(fehrange[0] + 0.00001, fehrange[1] - 0.00001, nfeh) # Calcuate FeH and gr distriutions fehdists = numpy.zeros(nfeh) for jj in range(nfeh): fehdists[jj] = fehdist(tfehs[jj]) fehdists = numpy.cumsum(fehdists) fehdists /= fehdists[-1] colordists = numpy.zeros(ngr) for jj in range(ngr): colordists[jj] = colordist(tgrs[jj]) colordists = numpy.cumsum(colordists) colordists /= colordists[-1] for ii in range(len(x[:, 0])): if not inLos[ii]: continue
def _add_proper_motions_pregaia(data, savefilename): #Get proper motions, in a somewhat roundabout way pmfile = savefilename.split('.')[0] + '_pms.fits' if os.path.exists(pmfile): pmdata = fitsread(pmfile, 1) else: pmdata = numpy.recarray( len(data), formats=['f8', 'f8', 'f8', 'f8', 'f8', 'f8', 'i4'], names=[ 'RA', 'DEC', 'PMRA', 'PMDEC', 'PMRA_ERR', 'PMDEC_ERR', 'PMMATCH' ]) # Write positions, again ... posfilename = tempfile.mktemp('.csv', dir=os.getcwd()) resultfilename = tempfile.mktemp('.csv', dir=os.getcwd()) with open(posfilename, 'w') as csvfile: wr = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) wr.writerow(['RA', 'DEC']) for ii in range(len(data)): wr.writerow([data[ii]['RA'], data[ii]['DEC']]) # Send to CDS for matching result = open(resultfilename, 'w') try: subprocess.check_call([ 'curl', '-X', 'POST', '-F', 'request=xmatch', '-F', 'distMaxArcsec=4', '-F', 'RESPONSEFORMAT=csv', '-F', 'cat1=@%s' % os.path.basename(posfilename), '-F', 'colRA1=RA', '-F', 'colDec1=DEC', '-F', 'cat2=vizier:UCAC4', 'http://cdsxmatch.u-strasbg.fr/xmatch/api/v1/sync' ], stdout=result) except subprocess.CalledProcessError: os.remove(posfilename) if os.path.exists(resultfilename): result.close() os.remove(resultfilename) result.close() # Match back and only keep the closest one ma = numpy.loadtxt(resultfilename, delimiter=',', skiprows=1, converters={ 15: lambda s: float(s.strip() or -9999), 16: lambda s: float(s.strip() or -9999), 17: lambda s: float(s.strip() or -9999), 18: lambda s: float(s.strip() or -9999) }, usecols=(4, 5, 15, 16, 17, 18)) h = esutil.htm.HTM() m1, m2, d12 = h.match(data['RA'], data['DEC'], ma[:, 0], ma[:, 1], 4. / 3600., maxmatch=1) pmdata['PMMATCH'] = 0 pmdata['RA'] = data['RA'] pmdata['DEC'] = data['DEC'] pmdata['PMMATCH'][m1] = 1 pmdata['PMRA'][m1] = ma[m2, 2] pmdata['PMDEC'][m1] = ma[m2, 3] pmdata['PMRA_ERR'][m1] = ma[m2, 4] pmdata['PMDEC_ERR'][m1] = ma[m2, 5] pmdata['PMMATCH'][(pmdata['PMRA'] == -9999) \ +(pmdata['PMDEC'] == -9999) \ +(pmdata['PMRA_ERR'] == -9999) \ +(pmdata['PMDEC_ERR'] == -9999)]= 0 fitswrite(pmfile, pmdata, clobber=True) #To make sure we're using the same format below pmdata = fitsread(pmfile, 1) os.remove(posfilename) os.remove(resultfilename) #Match proper motions try: #These already exist currently, but may not always exist data = esutil.numpy_util.remove_fields(data, ['PMRA', 'PMDEC']) except ValueError: pass data = esutil.numpy_util.add_fields(data, [('PMRA', numpy.float), ('PMDEC', numpy.float), ('PMRA_ERR', numpy.float), ('PMDEC_ERR', numpy.float), ('PMMATCH', numpy.int32)]) data['PMMATCH'] = 0 h = esutil.htm.HTM() m1, m2, d12 = h.match(pmdata['RA'], pmdata['DEC'], data['RA'], data['DEC'], 2. / 3600., maxmatch=1) data['PMRA'][m2] = pmdata['PMRA'][m1] data['PMDEC'][m2] = pmdata['PMDEC'][m1] data['PMRA_ERR'][m2] = pmdata['PMRA_ERR'][m1] data['PMDEC_ERR'][m2] = pmdata['PMDEC_ERR'][m1] data['PMMATCH'][m2] = pmdata['PMMATCH'][m1].astype(numpy.int32) pmindx = data['PMMATCH'] == 1 data['PMRA'][True ^ pmindx] = -9999.99 data['PMDEC'][True ^ pmindx] = -9999.99 data['PMRA_ERR'][True ^ pmindx] = -9999.99 data['PMDEC_ERR'][True ^ pmindx] = -9999.99 #Calculate Galactocentric velocities data = esutil.numpy_util.add_fields(data, [('GALVR', numpy.float), ('GALVT', numpy.float), ('GALVZ', numpy.float)]) lb = bovy_coords.radec_to_lb(data['RA'], data['DEC'], degree=True) XYZ = bovy_coords.lbd_to_XYZ(lb[:, 0], lb[:, 1], data['RC_DIST'], degree=True) pmllpmbb = bovy_coords.pmrapmdec_to_pmllpmbb(data['PMRA'], data['PMDEC'], data['RA'], data['DEC'], degree=True) vxvyvz = bovy_coords.vrpmllpmbb_to_vxvyvz(data['VHELIO_AVG'], pmllpmbb[:, 0], pmllpmbb[:, 1], lb[:, 0], lb[:, 1], data['RC_DIST'], degree=True) vRvTvZ = bovy_coords.vxvyvz_to_galcencyl( vxvyvz[:, 0], vxvyvz[:, 1], vxvyvz[:, 2], 8. - XYZ[:, 0], XYZ[:, 1], XYZ[:, 2] + 0.025, vsun=[-11.1, 30.24 * 8., 7.25]) #Assumes proper motion of Sgr A* and R0=8 kpc, zo= 25 pc data['GALVR'] = vRvTvZ[:, 0] data['GALVT'] = vRvTvZ[:, 1] data['GALVZ'] = vRvTvZ[:, 2] data['GALVR'][True ^ pmindx] = -9999.99 data['GALVT'][True ^ pmindx] = -9999.99 data['GALVZ'][True ^ pmindx] = -9999.99 #Get HSOY proper motions, in a somewhat roundabout way pmfile = savefilename.split('.')[0] + '_pms_ppmxl.fits' if os.path.exists(pmfile): pmdata = fitsread(pmfile, 1) else: pmdata = numpy.recarray( len(data), formats=['f8', 'f8', 'f8', 'f8', 'f8', 'f8', 'i4'], names=[ 'RA', 'DEC', 'PMRA', 'PMDEC', 'PMRA_ERR', 'PMDEC_ERR', 'PMMATCH' ]) # Write positions, again ... posfilename = tempfile.mktemp('.csv', dir=os.getcwd()) resultfilename = tempfile.mktemp('.csv', dir=os.getcwd()) with open(posfilename, 'w') as csvfile: wr = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) wr.writerow(['RA', 'DEC']) for ii in range(len(data)): wr.writerow([data[ii]['RA'], data[ii]['DEC']]) # Send to CDS for matching result = open(resultfilename, 'w') try: subprocess.check_call([ 'curl', '-X', 'POST', '-F', 'request=xmatch', '-F', 'distMaxArcsec=4', '-F', 'RESPONSEFORMAT=csv', '-F', 'cat1=@%s' % os.path.basename(posfilename), '-F', 'colRA1=RA', '-F', 'colDec1=DEC', '-F', 'cat2=vizier:I/339/hsoy', 'http://cdsxmatch.u-strasbg.fr/xmatch/api/v1/sync' ], stdout=result) except subprocess.CalledProcessError: os.remove(posfilename) if os.path.exists(resultfilename): result.close() os.remove(resultfilename) result.close() # Match back and only keep the closest one ma = numpy.loadtxt(resultfilename, delimiter=',', skiprows=1, converters={ 12: lambda s: float(s.strip() or -9999), 13: lambda s: float(s.strip() or -9999), 14: lambda s: float(s.strip() or -9999), 15: lambda s: float(s.strip() or -9999) }, usecols=(3, 4, 12, 13, 14, 15)) h = esutil.htm.HTM() m1, m2, d12 = h.match(data['RA'], data['DEC'], ma[:, 0], ma[:, 1], 4. / 3600., maxmatch=1) pmdata['PMMATCH'] = 0 pmdata['RA'] = data['RA'] pmdata['DEC'] = data['DEC'] pmdata['PMMATCH'][m1] = 1 pmdata['PMRA'][m1] = ma[m2, 2] pmdata['PMDEC'][m1] = ma[m2, 3] pmdata['PMRA_ERR'][m1] = ma[m2, 4] pmdata['PMDEC_ERR'][m1] = ma[m2, 5] pmdata['PMMATCH'][(pmdata['PMRA'] == -9999) \ +(pmdata['PMDEC'] == -9999) \ +(pmdata['PMRA_ERR'] == -9999) \ +(pmdata['PMDEC_ERR'] == -9999)]= 0 fitswrite(pmfile, pmdata, clobber=True) #To make sure we're using the same format below pmdata = fitsread(pmfile, 1) os.remove(posfilename) os.remove(resultfilename) #Match proper motions to ppmxl/HSOY data = esutil.numpy_util.add_fields(data, [('PMRA_HSOY', numpy.float), ('PMDEC_HSOY', numpy.float), ('PMRA_ERR_HSOY', numpy.float), ('PMDEC_ERR_HSOY', numpy.float), ('PMMATCH_HSOY', numpy.int32)]) data['PMMATCH_HSOY'] = 0 h = esutil.htm.HTM() m1, m2, d12 = h.match(pmdata['RA'], pmdata['DEC'], data['RA'], data['DEC'], 2. / 3600., maxmatch=1) data['PMRA_HSOY'][m2] = pmdata['PMRA'][m1] data['PMDEC_HSOY'][m2] = pmdata['PMDEC'][m1] data['PMRA_ERR_HSOY'][m2] = pmdata['PMRA_ERR'][m1] data['PMDEC_ERR_HSOY'][m2] = pmdata['PMDEC_ERR'][m1] data['PMMATCH_HSOY'][m2] = pmdata['PMMATCH'][m1].astype(numpy.int32) pmindx = data['PMMATCH_HSOY'] == 1 data['PMRA_HSOY'][True ^ pmindx] = -9999.99 data['PMDEC_HSOY'][True ^ pmindx] = -9999.99 data['PMRA_ERR_HSOY'][True ^ pmindx] = -9999.99 data['PMDEC_ERR_HSOY'][True ^ pmindx] = -9999.99 #Calculate Galactocentric velocities data = esutil.numpy_util.add_fields(data, [('GALVR_HSOY', numpy.float), ('GALVT_HSOY', numpy.float), ('GALVZ_HSOY', numpy.float)]) lb = bovy_coords.radec_to_lb(data['RA'], data['DEC'], degree=True) XYZ = bovy_coords.lbd_to_XYZ(lb[:, 0], lb[:, 1], data['RC_DIST'], degree=True) pmllpmbb = bovy_coords.pmrapmdec_to_pmllpmbb(data['PMRA_HSOY'], data['PMDEC_HSOY'], data['RA'], data['DEC'], degree=True) vxvyvz = bovy_coords.vrpmllpmbb_to_vxvyvz(data['VHELIO_AVG'], pmllpmbb[:, 0], pmllpmbb[:, 1], lb[:, 0], lb[:, 1], data['RC_DIST'], degree=True) vRvTvZ = bovy_coords.vxvyvz_to_galcencyl( vxvyvz[:, 0], vxvyvz[:, 1], vxvyvz[:, 2], 8. - XYZ[:, 0], XYZ[:, 1], XYZ[:, 2] + 0.025, vsun=[-11.1, 30.24 * 8., 7.25]) #Assumes proper motion of Sgr A* and R0=8 kpc, zo= 25 pc data['GALVR_HSOY'] = vRvTvZ[:, 0] data['GALVT_HSOY'] = vRvTvZ[:, 1] data['GALVZ_HSOY'] = vRvTvZ[:, 2] data['GALVR_HSOY'][True ^ pmindx] = -9999.99 data['GALVT_HSOY'][True ^ pmindx] = -9999.99 data['GALVZ_HSOY'][True ^ pmindx] = -9999.99 #Return return data return None
def make_rcsample(parser): options,args= parser.parse_args() savefilename= options.savefilename if savefilename is None: #Create savefilename if not given savefilename= os.path.join(appath._APOGEE_DATA, 'rcsample_'+appath._APOGEE_REDUX+'.fits') print("Saving to %s ..." % savefilename) #Read the base-sample data= apread.allStar(adddist=_ADDHAYDENDIST,rmdups=options.rmdups) #Remove a bunch of fields that we do not want to keep data= esutil.numpy_util.remove_fields(data, ['TARGET_ID', 'FILE', 'AK_WISE', 'SFD_EBV', 'SYNTHVHELIO_AVG', 'SYNTHVSCATTER', 'SYNTHVERR', 'SYNTHVERR_MED', 'RV_TEFF', 'RV_LOGG', 'RV_FEH', 'RV_ALPHA', 'RV_CARB', 'RV_CCFWHM', 'RV_AUTOFWHM', 'SYNTHSCATTER', 'STABLERV_CHI2', 'STABLERV_RCHI2', 'STABLERV_CHI2_PROB', 'CHI2_THRESHOLD', 'APSTAR_VERSION', 'ASPCAP_VERSION', 'RESULTS_VERSION', 'WASH_M', 'WASH_M_ERR', 'WASH_T2', 'WASH_T2_ERR', 'DDO51', 'DDO51_ERR', 'IRAC_3_6', 'IRAC_3_6_ERR', 'IRAC_4_5', 'IRAC_4_5_ERR', 'IRAC_5_8', 'IRAC_5_8_ERR', 'IRAC_8_0', 'IRAC_8_0_ERR', 'WISE_4_5', 'WISE_4_5_ERR', 'TARG_4_5', 'TARG_4_5_ERR', 'WASH_DDO51_GIANT_FLAG', 'WASH_DDO51_STAR_FLAG', 'REDUCTION_ID', 'SRC_H', 'PM_SRC']) if not appath._APOGEE_REDUX.lower() == 'current' \ and not 'l30' in appath._APOGEE_REDUX \ and int(appath._APOGEE_REDUX[1:]) < 500: data= esutil.numpy_util.remove_fields(data, ['ELEM']) #Select red-clump stars jk= data['J0']-data['K0'] z= isodist.FEH2Z(data['METALS'],zsolar=0.017) if 'l30' in appath._APOGEE_REDUX: logg= data['LOGG'] elif appath._APOGEE_REDUX.lower() == 'current' \ or int(appath._APOGEE_REDUX[1:]) > 600: from apogee.tools import paramIndx if False: #Use my custom logg calibration that's correct for the RC logg= (1.-0.042)*data['FPARAM'][:,paramIndx('logg')]-0.213 lowloggindx= data['FPARAM'][:,paramIndx('logg')] < 1. logg[lowloggindx]= data['FPARAM'][lowloggindx,paramIndx('logg')]-0.255 hiloggindx= data['FPARAM'][:,paramIndx('logg')] > 3.8 logg[hiloggindx]= data['FPARAM'][hiloggindx,paramIndx('logg')]-0.3726 else: #Use my custom logg calibration that's correct on average logg= (1.+0.03)*data['FPARAM'][:,paramIndx('logg')]-0.37 lowloggindx= data['FPARAM'][:,paramIndx('logg')] < 1. logg[lowloggindx]= data['FPARAM'][lowloggindx,paramIndx('logg')]-0.34 hiloggindx= data['FPARAM'][:,paramIndx('logg')] > 3.8 logg[hiloggindx]= data['FPARAM'][hiloggindx,paramIndx('logg')]-0.256 else: logg= data['LOGG'] indx= (jk < 0.8)*(jk >= 0.5)\ *(z <= 0.06)\ *(z <= rcmodel.jkzcut(jk,upper=True))\ *(z >= rcmodel.jkzcut(jk))\ *(logg >= rcmodel.loggteffcut(data['TEFF'],z,upper=False))\ *(logg <= rcmodel.loggteffcut(data['TEFF'],z,upper=True)) data= data[indx] #Add more aggressive flag cut data= esutil.numpy_util.add_fields(data,[('ADDL_LOGG_CUT',numpy.int32)]) data['ADDL_LOGG_CUT']= ((data['TEFF']-4800.)/1000.+2.75) > data['LOGG'] if options.loggcut: data= data[data['ADDL_LOGG_CUT'] == 1] print("Making catalog of %i objects ..." % len(data)) #Add distances data= esutil.numpy_util.add_fields(data,[('RC_DIST', float), ('RC_DM', float), ('RC_GALR', float), ('RC_GALPHI', float), ('RC_GALZ', float)]) rcd= rcmodel.rcdist() jk= data['J0']-data['K0'] z= isodist.FEH2Z(data['METALS'],zsolar=0.017) data['RC_DIST']= rcd(jk,z,appmag=data['K0'])*options.distfac data['RC_DM']= 5.*numpy.log10(data['RC_DIST'])+10. XYZ= bovy_coords.lbd_to_XYZ(data['GLON'], data['GLAT'], data['RC_DIST'], degree=True) R,phi,Z= bovy_coords.XYZ_to_galcencyl(XYZ[:,0], XYZ[:,1], XYZ[:,2], Xsun=8.,Zsun=0.025) data['RC_GALR']= R data['RC_GALPHI']= phi data['RC_GALZ']= Z #Save fitsio.write(savefilename,data,clobber=True) # Add Tycho-2 matches if options.tyc2: data= esutil.numpy_util.add_fields(data,[('TYC2MATCH',numpy.int32), ('TYC1',numpy.int32), ('TYC2',numpy.int32), ('TYC3',numpy.int32)]) data['TYC2MATCH']= 0 data['TYC1']= -1 data['TYC2']= -1 data['TYC3']= -1 # Write positions posfilename= tempfile.mktemp('.csv',dir=os.getcwd()) resultfilename= tempfile.mktemp('.csv',dir=os.getcwd()) with open(posfilename,'w') as csvfile: wr= csv.writer(csvfile,delimiter=',',quoting=csv.QUOTE_MINIMAL) wr.writerow(['RA','DEC']) for ii in range(len(data)): wr.writerow([data[ii]['RA'],data[ii]['DEC']]) # Send to CDS for matching result= open(resultfilename,'w') try: subprocess.check_call(['curl', '-X','POST', '-F','request=xmatch', '-F','distMaxArcsec=2', '-F','RESPONSEFORMAT=csv', '-F','cat1=@%s' % os.path.basename(posfilename), '-F','colRA1=RA', '-F','colDec1=DEC', '-F','cat2=vizier:Tycho2', 'http://cdsxmatch.u-strasbg.fr/xmatch/api/v1/sync'], stdout=result) except subprocess.CalledProcessError: os.remove(posfilename) if os.path.exists(resultfilename): result.close() os.remove(resultfilename) result.close() # Directly match on input RA ma= numpy.loadtxt(resultfilename,delimiter=',',skiprows=1, usecols=(1,2,7,8,9)) iis= numpy.arange(len(data)) mai= [iis[data['RA'] == ma[ii,0]][0] for ii in range(len(ma))] data['TYC2MATCH'][mai]= 1 data['TYC1'][mai]= ma[:,2] data['TYC2'][mai]= ma[:,3] data['TYC3'][mai]= ma[:,4] os.remove(posfilename) os.remove(resultfilename) if not options.nostat: #Determine statistical sample and add flag apo= apogee.select.apogeeSelect() statIndx= apo.determine_statistical(data) mainIndx= apread.mainIndx(data) data= esutil.numpy_util.add_fields(data,[('STAT',numpy.int32), ('INVSF',float)]) data['STAT']= 0 data['STAT'][statIndx*mainIndx]= 1 for ii in range(len(data)): if (statIndx*mainIndx)[ii]: data['INVSF'][ii]= 1./apo(data['LOCATION_ID'][ii], data['H'][ii]) else: data['INVSF'][ii]= -1. if options.nopm: fitsio.write(savefilename,data,clobber=True) return None #Get proper motions, in a somewhat roundabout way pmfile= savefilename.split('.')[0]+'_pms.fits' if os.path.exists(pmfile): pmdata= fitsio.read(pmfile,1) else: pmdata= numpy.recarray(len(data), formats=['f8','f8','f8','f8','f8','f8','i4'], names=['RA','DEC','PMRA','PMDEC', 'PMRA_ERR','PMDEC_ERR','PMMATCH']) # Write positions, again ... posfilename= tempfile.mktemp('.csv',dir=os.getcwd()) resultfilename= tempfile.mktemp('.csv',dir=os.getcwd()) with open(posfilename,'w') as csvfile: wr= csv.writer(csvfile,delimiter=',',quoting=csv.QUOTE_MINIMAL) wr.writerow(['RA','DEC']) for ii in range(len(data)): wr.writerow([data[ii]['RA'],data[ii]['DEC']]) # Send to CDS for matching result= open(resultfilename,'w') try: subprocess.check_call(['curl', '-X','POST', '-F','request=xmatch', '-F','distMaxArcsec=4', '-F','RESPONSEFORMAT=csv', '-F','cat1=@%s' % os.path.basename(posfilename), '-F','colRA1=RA', '-F','colDec1=DEC', '-F','cat2=vizier:UCAC4', 'http://cdsxmatch.u-strasbg.fr/xmatch/api/v1/sync'], stdout=result) except subprocess.CalledProcessError: os.remove(posfilename) if os.path.exists(resultfilename): result.close() os.remove(resultfilename) result.close() # Match back and only keep the closest one ma= numpy.loadtxt(resultfilename,delimiter=',',skiprows=1, converters={15: lambda s: float(s.strip() or -9999), 16: lambda s: float(s.strip() or -9999), 17: lambda s: float(s.strip() or -9999), 18: lambda s: float(s.strip() or -9999)}, usecols=(4,5,15,16,17,18)) h=esutil.htm.HTM() m1,m2,d12 = h.match(data['RA'],data['DEC'], ma[:,0],ma[:,1],4./3600.,maxmatch=1) pmdata['PMMATCH']= 0 pmdata['RA']= data['RA'] pmdata['DEC']= data['DEC'] pmdata['PMMATCH'][m1]= 1 pmdata['PMRA'][m1]= ma[m2,2] pmdata['PMDEC'][m1]= ma[m2,3] pmdata['PMRA_ERR'][m1]= ma[m2,4] pmdata['PMDEC_ERR'][m1]= ma[m2,5] pmdata['PMMATCH'][(pmdata['PMRA'] == -9999) \ +(pmdata['PMDEC'] == -9999) \ +(pmdata['PMRA_ERR'] == -9999) \ +(pmdata['PMDEC_ERR'] == -9999)]= 0 fitsio.write(pmfile,pmdata,clobber=True) #To make sure we're using the same format below pmdata= fitsio.read(pmfile,1) os.remove(posfilename) os.remove(resultfilename) #Match proper motions try: #These already exist currently, but may not always exist data= esutil.numpy_util.remove_fields(data,['PMRA','PMDEC']) except ValueError: pass data= esutil.numpy_util.add_fields(data,[('PMRA', numpy.float), ('PMDEC', numpy.float), ('PMRA_ERR', numpy.float), ('PMDEC_ERR', numpy.float), ('PMMATCH',numpy.int32)]) data['PMMATCH']= 0 h=esutil.htm.HTM() m1,m2,d12 = h.match(pmdata['RA'],pmdata['DEC'], data['RA'],data['DEC'], 2./3600.,maxmatch=1) data['PMRA'][m2]= pmdata['PMRA'][m1] data['PMDEC'][m2]= pmdata['PMDEC'][m1] data['PMRA_ERR'][m2]= pmdata['PMRA_ERR'][m1] data['PMDEC_ERR'][m2]= pmdata['PMDEC_ERR'][m1] data['PMMATCH'][m2]= pmdata['PMMATCH'][m1].astype(numpy.int32) pmindx= data['PMMATCH'] == 1 data['PMRA'][True-pmindx]= -9999.99 data['PMDEC'][True-pmindx]= -9999.99 data['PMRA_ERR'][True-pmindx]= -9999.99 data['PMDEC_ERR'][True-pmindx]= -9999.99 #Calculate Galactocentric velocities data= esutil.numpy_util.add_fields(data,[('GALVR', numpy.float), ('GALVT', numpy.float), ('GALVZ', numpy.float)]) lb= bovy_coords.radec_to_lb(data['RA'],data['DEC'],degree=True) XYZ= bovy_coords.lbd_to_XYZ(lb[:,0],lb[:,1],data['RC_DIST'],degree=True) pmllpmbb= bovy_coords.pmrapmdec_to_pmllpmbb(data['PMRA'],data['PMDEC'], data['RA'],data['DEC'], degree=True) vxvyvz= bovy_coords.vrpmllpmbb_to_vxvyvz(data['VHELIO_AVG'], pmllpmbb[:,0], pmllpmbb[:,1], lb[:,0],lb[:,1],data['RC_DIST'], degree=True) vR, vT, vZ= bovy_coords.vxvyvz_to_galcencyl(vxvyvz[:,0], vxvyvz[:,1], vxvyvz[:,2], 8.-XYZ[:,0], XYZ[:,1], XYZ[:,2]+0.025, vsun=[-11.1,30.24*8.,7.25])#Assumes proper motion of Sgr A* and R0=8 kpc, zo= 25 pc data['GALVR']= vR data['GALVT']= vT data['GALVZ']= vZ data['GALVR'][True-pmindx]= -9999.99 data['GALVT'][True-pmindx]= -9999.99 data['GALVZ'][True-pmindx]= -9999.99 #Get PPMXL proper motions, in a somewhat roundabout way pmfile= savefilename.split('.')[0]+'_pms_ppmxl.fits' if os.path.exists(pmfile): pmdata= fitsio.read(pmfile,1) else: pmdata= numpy.recarray(len(data), formats=['f8','f8','f8','f8','f8','f8','i4'], names=['RA','DEC','PMRA','PMDEC', 'PMRA_ERR','PMDEC_ERR','PMMATCH']) # Write positions, again ... posfilename= tempfile.mktemp('.csv',dir=os.getcwd()) resultfilename= tempfile.mktemp('.csv',dir=os.getcwd()) with open(posfilename,'w') as csvfile: wr= csv.writer(csvfile,delimiter=',',quoting=csv.QUOTE_MINIMAL) wr.writerow(['RA','DEC']) for ii in range(len(data)): wr.writerow([data[ii]['RA'],data[ii]['DEC']]) # Send to CDS for matching result= open(resultfilename,'w') try: subprocess.check_call(['curl', '-X','POST', '-F','request=xmatch', '-F','distMaxArcsec=4', '-F','RESPONSEFORMAT=csv', '-F','cat1=@%s' % os.path.basename(posfilename), '-F','colRA1=RA', '-F','colDec1=DEC', '-F','cat2=vizier:PPMXL', 'http://cdsxmatch.u-strasbg.fr/xmatch/api/v1/sync'], stdout=result) except subprocess.CalledProcessError: os.remove(posfilename) if os.path.exists(resultfilename): result.close() os.remove(resultfilename) result.close() # Match back and only keep the closest one ma= numpy.loadtxt(resultfilename,delimiter=',',skiprows=1, converters={15: lambda s: float(s.strip() or -9999), 16: lambda s: float(s.strip() or -9999), 17: lambda s: float(s.strip() or -9999), 18: lambda s: float(s.strip() or -9999)}, usecols=(4,5,15,16,19,20)) h=esutil.htm.HTM() m1,m2,d12 = h.match(data['RA'],data['DEC'], ma[:,0],ma[:,1],4./3600.,maxmatch=1) pmdata['PMMATCH']= 0 pmdata['RA']= data['RA'] pmdata['DEC']= data['DEC'] pmdata['PMMATCH'][m1]= 1 pmdata['PMRA'][m1]= ma[m2,2] pmdata['PMDEC'][m1]= ma[m2,3] pmdata['PMRA_ERR'][m1]= ma[m2,4] pmdata['PMDEC_ERR'][m1]= ma[m2,5] pmdata['PMMATCH'][(pmdata['PMRA'] == -9999) \ +(pmdata['PMDEC'] == -9999) \ +(pmdata['PMRA_ERR'] == -9999) \ +(pmdata['PMDEC_ERR'] == -9999)]= 0 fitsio.write(pmfile,pmdata,clobber=True) #To make sure we're using the same format below pmdata= fitsio.read(pmfile,1) os.remove(posfilename) os.remove(resultfilename) #Match proper motions to ppmxl data= esutil.numpy_util.add_fields(data,[('PMRA_PPMXL', numpy.float), ('PMDEC_PPMXL', numpy.float), ('PMRA_ERR_PPMXL', numpy.float), ('PMDEC_ERR_PPMXL', numpy.float), ('PMMATCH_PPMXL',numpy.int32)]) data['PMMATCH_PPMXL']= 0 h=esutil.htm.HTM() m1,m2,d12 = h.match(pmdata['RA'],pmdata['DEC'], data['RA'],data['DEC'], 2./3600.,maxmatch=1) data['PMRA_PPMXL'][m2]= pmdata['PMRA'][m1] data['PMDEC_PPMXL'][m2]= pmdata['PMDEC'][m1] data['PMRA_ERR_PPMXL'][m2]= pmdata['PMRA_ERR'][m1] data['PMDEC_ERR_PPMXL'][m2]= pmdata['PMDEC_ERR'][m1] data['PMMATCH_PPMXL'][m2]= pmdata['PMMATCH'][m1].astype(numpy.int32) pmindx= data['PMMATCH_PPMXL'] == 1 data['PMRA_PPMXL'][True-pmindx]= -9999.99 data['PMDEC_PPMXL'][True-pmindx]= -9999.99 data['PMRA_ERR_PPMXL'][True-pmindx]= -9999.99 data['PMDEC_ERR_PPMXL'][True-pmindx]= -9999.99 #Calculate Galactocentric velocities data= esutil.numpy_util.add_fields(data,[('GALVR_PPMXL', numpy.float), ('GALVT_PPMXL', numpy.float), ('GALVZ_PPMXL', numpy.float)]) lb= bovy_coords.radec_to_lb(data['RA'],data['DEC'],degree=True) XYZ= bovy_coords.lbd_to_XYZ(lb[:,0],lb[:,1],data['RC_DIST'],degree=True) pmllpmbb= bovy_coords.pmrapmdec_to_pmllpmbb(data['PMRA_PPMXL'], data['PMDEC_PPMXL'], data['RA'],data['DEC'], degree=True) vxvyvz= bovy_coords.vrpmllpmbb_to_vxvyvz(data['VHELIO_AVG'], pmllpmbb[:,0], pmllpmbb[:,1], lb[:,0],lb[:,1],data['RC_DIST'], degree=True) vR, vT, vZ= bovy_coords.vxvyvz_to_galcencyl(vxvyvz[:,0], vxvyvz[:,1], vxvyvz[:,2], 8.-XYZ[:,0], XYZ[:,1], XYZ[:,2]+0.025, vsun=[-11.1,30.24*8.,7.25])#Assumes proper motion of Sgr A* and R0=8 kpc, zo= 25 pc data['GALVR_PPMXL']= vR data['GALVT_PPMXL']= vT data['GALVZ_PPMXL']= vZ data['GALVR_PPMXL'][True-pmindx]= -9999.99 data['GALVT_PPMXL'][True-pmindx]= -9999.99 data['GALVZ_PPMXL'][True-pmindx]= -9999.99 #Save fitsio.write(savefilename,data,clobber=True) return None
def __init__(self, vxvv=None, uvw=False, lb=False, radec=False, vo=235., ro=8.5, zo=0.025, solarmotion='hogg'): """ NAME: __init__ PURPOSE: Initialize an Orbit instance INPUT: vxvv - initial conditions 3D can be either 1) in Galactocentric cylindrical coordinates [R,vR,vT(,z,vz,phi)] 2) [ra,dec,d,mu_ra, mu_dec,vlos] in [deg,deg,kpc,mas/yr,mas/yr,km/s] (all J2000.0; mu_ra = mu_ra * cos dec) 3) [ra,dec,d,U,V,W] in [deg,deg,kpc,km/s,km/s,kms] 4) (l,b,d,mu_l, mu_b, vlos) in [deg,deg,kpc,mas/yr,mas/yr,km/s) (all J2000.0; mu_l = mu_l * cos b) 5) [l,b,d,U,V,W] in [deg,deg,kpc,km/s,km/s,kms] 4) and 5) also work when leaving out b and mu_b/W OPTIONAL INPUTS: radec - if True, input is 2) (or 3) above uvw - if True, velocities are UVW lb - if True, input is 4) or 5) above vo - circular velocity at ro ro - distance from vantage point to GC (kpc) zo - offset toward the NGP of the Sun wrt the plane (kpc) solarmotion - 'hogg' or 'dehnen', or 'schoenrich', or value in [-U,V,W] OUTPUT: instance HISTORY: 2010-07-20 - Written - Bovy (NYU) """ if isinstance(solarmotion, str) and solarmotion.lower() == 'hogg': vsolar = nu.array([-10.1, 4.0, 6.7]) / vo elif isinstance(solarmotion, str) and solarmotion.lower() == 'dehnen': vsolar = nu.array([-10., 5.25, 7.17]) / vo elif isinstance(solarmotion,str) \ and solarmotion.lower() == 'schoenrich': vsolar = nu.array([-11.1, 12.24, 7.25]) / vo else: vsolar = nu.array(solarmotion) / vo if radec or lb: if radec: l, b = coords.radec_to_lb(vxvv[0], vxvv[1], degree=True) elif len(vxvv) == 4: l, b = vxvv[0], 0. else: l, b = vxvv[0], vxvv[1] if uvw: X, Y, Z = coords.lbd_to_XYZ(l, b, vxvv[2], degree=True) vx = vxvv[3] vy = vxvv[4] vz = vxvv[5] else: if radec: pmll, pmbb = coords.pmrapmdec_to_pmllpmbb(vxvv[3], vxvv[4], vxvv[0], vxvv[1], degree=True) d, vlos = vxvv[2], vxvv[5] elif len(vxvv) == 4: pmll, pmbb = vxvv[2], 0. d, vlos = vxvv[1], vxvv[3] else: pmll, pmbb = vxvv[3], vxvv[4] d, vlos = vxvv[2], vxvv[5] X, Y, Z, vx, vy, vz = coords.sphergal_to_rectgal(l, b, d, vlos, pmll, pmbb, degree=True) X /= ro Y /= ro Z /= ro vx /= vo vy /= vo vz /= vo vsun = nu.array([ 0., 1., 0., ]) + vsolar R, phi, z = coords.XYZ_to_galcencyl(X, Y, Z, Zsun=zo / ro) vR, vT, vz = coords.vxvyvz_to_galcencyl(vx, vy, vz, R, phi, z, vsun=vsun, galcen=True) if lb and len(vxvv) == 4: vxvv = [R, vR, vT, phi] else: vxvv = [R, vR, vT, z, vz, phi] self.vxvv = vxvv if len(vxvv) == 2: self._orb = linearOrbit(vxvv=vxvv) elif len(vxvv) == 3: self._orb = planarROrbit(vxvv=vxvv) elif len(vxvv) == 4: self._orb = planarOrbit(vxvv=vxvv) elif len(vxvv) == 5: self._orb = RZOrbit(vxvv=vxvv) elif len(vxvv) == 6: self._orb = FullOrbit(vxvv=vxvv)
def obs_to_galcen(ra, dec, dist, pmra, pmdec, rv, pmra_err, pmdec_err, pmra_pmdec_corr, dist_err, rv_err, return_cov=True, verbose=True, return_rphiz=True, ro=8., vo=220., zo=0.025, parallax=False): vxvv = np.dstack([ra, dec, dist, pmra, pmdec, rv])[0] ra, dec = vxvv[:, 0], vxvv[:, 1] lb = bovy_coords.radec_to_lb(ra, dec, degree=True) pmra, pmdec = vxvv[:, 3], vxvv[:, 4] pmllpmbb = bovy_coords.pmrapmdec_to_pmllpmbb(pmra, pmdec, ra, dec, degree=True) d, vlos = vxvv[:, 2], vxvv[:, 5] if parallax: d = 1. / d rectgal = bovy_coords.sphergal_to_rectgal(lb[:, 0], lb[:, 1], d, vlos, pmllpmbb[:, 0], pmllpmbb[:, 1], degree=True) vsolar = np.array([-10.1, 4.0, 6.7]) vsun = np.array([ 0., 1., 0., ]) + vsolar / vo X = rectgal[:, 0] / ro Y = rectgal[:, 1] / ro Z = rectgal[:, 2] / ro vx = rectgal[:, 3] / vo vy = rectgal[:, 4] / vo vz = rectgal[:, 5] / vo XYZ = np.dstack([X, Y, Z])[0] vxyz = np.dstack([vx, vy, vz])[0] if return_rphiz: Rpz = bovy_coords.XYZ_to_galcencyl(XYZ[:, 0], XYZ[:, 1], XYZ[:, 2], Zsun=zo / ro) vRvTvz = bovy_coords.vxvyvz_to_galcencyl(vxyz[:, 0], vxyz[:, 1], vxyz[:, 2], Rpz[:, 0], Rpz[:, 1], Rpz[:, 2], vsun=vsun, Xsun=1., Zsun=zo / ro, galcen=True) if return_cov == True: cov_pmradec = np.empty([len(pmra_err), 2, 2]) cov_pmradec[:, 0, 0] = pmra_err**2 cov_pmradec[:, 1, 1] = pmdec_err**2 cov_pmradec[:, 0, 1] = pmra_pmdec_corr * pmra_err * pmdec_err cov_pmradec[:, 1, 0] = pmra_pmdec_corr * pmra_err * pmdec_err if verbose: print('propagating covariance in pmra pmdec -> pmll pmbb') cov_pmllbb = bovy_coords.cov_pmrapmdec_to_pmllpmbb(cov_pmradec, vxvv[:, 0], vxvv[:, 1], degree=True, epoch='J2015') if verbose: print('propagating covariance in pmll pmbb -> vx vy vz') cov_vxyz = bovy_coords.cov_dvrpmllbb_to_vxyz(vxvv[:, 2], dist_err, rv_err, pmllpmbb[:, 0], pmllpmbb[:, 1], cov_pmllbb, lb[:, 0], lb[:, 1]) if not return_rphiz: return XYZ, vxyz, cov_vxyz if verbose: print('propagating covariance in vx vy vz -> vR vT vz') cov_galcencyl = bovy_coords.cov_vxyz_to_galcencyl(cov_vxyz, Rpz[:, 1], Xsun=1., Zsun=zo / ro) return XYZ, vxyz, cov_vxyz, Rpz, vRvTvz, cov_galcencyl if not return_rphiz: return XYZ, vxyz return XYZ, vxyz, Rpz, vRvTvz
def _add_proper_motions_gaia(data): from gaia_tools import xmatch gaia2_matches, matches_indx = xmatch.cds(data, colRA='RA', colDec='DEC', xcat='vizier:I/345/gaia2') # Add matches try: #These already exist currently, but may not always exist data = esutil.numpy_util.remove_fields(data, ['PMRA', 'PMDEC']) except ValueError: pass data = esutil.numpy_util.add_fields(data, [('PLX', numpy.float), ('PMRA', numpy.float), ('PMDEC', numpy.float), ('PLX_ERR', numpy.float), ('PMRA_ERR', numpy.float), ('PMDEC_ERR', numpy.float), ('PMMATCH', numpy.int32)]) data['PMMATCH'] = 0 data['PMMATCH'][matches_indx] = 1 data['PLX'][matches_indx] = gaia2_matches['parallax'] data['PMRA'][matches_indx] = gaia2_matches['pmra'] data['PMDEC'][matches_indx] = gaia2_matches['pmdec'] data['PLX_ERR'][matches_indx] = gaia2_matches['parallax_error'] data['PMRA_ERR'][matches_indx] = gaia2_matches['pmra_error'] data['PMDEC_ERR'][matches_indx] = gaia2_matches['pmdec_error'] # Set values for those without match to -999 pmindx = data['PMMATCH'] == 1 data['PLX'][True ^ pmindx] = -9999.99 data['PMRA'][True ^ pmindx] = -9999.99 data['PMDEC'][True ^ pmindx] = -9999.99 data['PLX_ERR'][True ^ pmindx] = -9999.99 data['PMRA_ERR'][True ^ pmindx] = -9999.99 data['PMDEC_ERR'][True ^ pmindx] = -9999.99 #Calculate Galactocentric velocities data = esutil.numpy_util.add_fields(data, [('GALVR', numpy.float), ('GALVT', numpy.float), ('GALVZ', numpy.float)]) lb = bovy_coords.radec_to_lb(data['RA'], data['DEC'], degree=True) XYZ = bovy_coords.lbd_to_XYZ(lb[:, 0], lb[:, 1], data['RC_DIST'], degree=True) pmllpmbb = bovy_coords.pmrapmdec_to_pmllpmbb(data['PMRA'], data['PMDEC'], data['RA'], data['DEC'], degree=True) vxvyvz = bovy_coords.vrpmllpmbb_to_vxvyvz(data['VHELIO_AVG'], pmllpmbb[:, 0], pmllpmbb[:, 1], lb[:, 0], lb[:, 1], data['RC_DIST'], degree=True) vRvTvZ = bovy_coords.vxvyvz_to_galcencyl( vxvyvz[:, 0], vxvyvz[:, 1], vxvyvz[:, 2], 8. - XYZ[:, 0], XYZ[:, 1], XYZ[:, 2] + 0.0208, vsun=[-11.1, 30.24 * 8.15, 7.25] ) #Assumes proper motion of Sgr A* and R0=8.15 kpc, zo= 20.8 pc (Bennett & Bovy 2019) data['GALVR'] = vRvTvZ[:, 0] data['GALVT'] = vRvTvZ[:, 1] data['GALVZ'] = vRvTvZ[:, 2] data['GALVR'][True ^ pmindx] = -9999.99 data['GALVT'][True ^ pmindx] = -9999.99 data['GALVZ'][True ^ pmindx] = -9999.99 return data
def dat_to_galcen( dat, return_cov=True, return_rphiz=True, verbose=False, ro=8., vo=220., zo=0.025, keys=['ra', 'dec', 'BPG_meandist', 'pmra', 'pmdec', 'VHELIO_AVG'], cov_keys=[ 'pmra_error', 'pmdec_error', 'pmra_pmdec_corr', 'BPG_diststd', 'VERR' ], parallax=False): vxvv = np.dstack([dat[keys[i]] for i in range(len(keys))])[0] ra, dec = vxvv[:, 0], vxvv[:, 1] lb = bovy_coords.radec_to_lb(ra, dec, degree=True) pmra, pmdec = vxvv[:, 3], vxvv[:, 4] pmllpmbb = bovy_coords.pmrapmdec_to_pmllpmbb(pmra, pmdec, ra, dec, degree=True) d, vlos = vxvv[:, 2], vxvv[:, 5] if parallax: d = 1. / d rectgal = bovy_coords.sphergal_to_rectgal(lb[:, 0], lb[:, 1], d, vlos, pmllpmbb[:, 0], pmllpmbb[:, 1], degree=True) vsolar = np.array([-11.1, 245.6, 7.25]) #use SBD10 vR and vZ and SGR proper motion vT vsun = np.array([ 0., 0., 0., ]) + vsolar / vo X = rectgal[:, 0] / ro Y = rectgal[:, 1] / ro Z = rectgal[:, 2] / ro vx = rectgal[:, 3] / vo vy = rectgal[:, 4] / vo vz = rectgal[:, 5] / vo XYZ = np.dstack([X, Y, Z])[0] vxyz = np.dstack([vx, vy, vz])[0] if return_rphiz: Rpz = bovy_coords.XYZ_to_galcencyl(XYZ[:, 0], XYZ[:, 1], XYZ[:, 2], Zsun=zo / ro) vRvTvz = bovy_coords.vxvyvz_to_galcencyl(vxyz[:, 0], vxyz[:, 1], vxyz[:, 2], Rpz[:, 0], Rpz[:, 1], Rpz[:, 2], vsun=vsun, Xsun=1., Zsun=zo / ro, galcen=True) if return_cov == True: cov_pmradec = np.array([[[ dat[cov_keys[0]][i]**2, dat[cov_keys[2]][i] * dat[cov_keys[0]][i] * dat[cov_keys[1]][i] ], [ dat[cov_keys[2]][i] * dat[cov_keys[0]][i] * dat[cov_keys[1]][i], dat[cov_keys[1]][i]**2 ]] for i in range(len(dat))]) if verbose: print('propagating covariance in pmra pmdec -> pmll pmbb') cov_pmllbb = bovy_coords.cov_pmrapmdec_to_pmllpmbb(cov_pmradec, vxvv[:, 0], vxvv[:, 1], degree=True, epoch='J2015') if verbose: print('propagating covariance in pmll pmbb -> vx vy vz') cov_vxyz = bovy_coords.cov_dvrpmllbb_to_vxyz(vxvv[:, 2], dat[cov_keys[3]], dat[cov_keys[4]], pmllpmbb[:, 0], pmllpmbb[:, 1], cov_pmllbb, lb[:, 0], lb[:, 1]) if not return_rphiz: return XYZ, vxyz, cov_vxyz if verbose: print('propagating covariance in vx vy vz -> vR vT vz') cov_galcencyl = bovy_coords.cov_vxyz_to_galcencyl(cov_vxyz, Rpz[:, 1], Xsun=1., Zsun=zo / ro) return XYZ, vxyz, cov_vxyz, Rpz, vRvTvz, cov_galcencyl if not return_rphiz: return XYZ, vxyz return XYZ, vxyz, Rpz, vRvTvz
def radec_to_lb(ra,dec): val = bovy_coords.radec_to_lb(ra,dec) return val
def plot_distsystematic(options,args): if options.sample.lower() == 'g': if options.select.lower() == 'program': raw= read_gdwarfs(_GDWARFFILE,logg=True,ebv=True,sn=options.snmin) else: raw= read_gdwarfs(logg=True,ebv=True,sn=options.snmin) elif options.sample.lower() == 'k': if options.select.lower() == 'program': raw= read_kdwarfs(_KDWARFFILE,logg=True,ebv=True,sn=options.snmin) else: raw= read_kdwarfs(logg=True,ebv=True,sn=options.snmin) if not options.bmin is None: #Cut on |b| raw= raw[(numpy.fabs(raw.b) > options.bmin)] #Bin the data binned= pixelAfeFeh(raw,dfeh=options.dfeh,dafe=options.dafe) if options.tighten: tightbinned= pixelAfeFeh(raw,dfeh=options.dfeh,dafe=options.dafe, fehmin=-1.6,fehmax=0.5,afemin=-0.05, afemax=0.55) else: tightbinned= binned plotthis= numpy.zeros((tightbinned.npixfeh(),tightbinned.npixafe()))+numpy.nan #Run through the bins for ii in range(tightbinned.npixfeh()): for jj in range(tightbinned.npixafe()): data= binned(tightbinned.feh(ii),tightbinned.afe(jj)) if len(data) < options.minndata: jj+= 1 if jj == len(binned.afeedges)-1: jj= 0 ii+= 1 break continue #Create XYZ and R, vxvyvz, cov_vxvyvz R= ((8.-data.xc)**2.+data.yc**2.)**0.5 #Confine to R-range? if not options.rmin is None and not options.rmax is None: dataindx= (R >= options.rmin)*\ (R < options.rmax) data= data[dataindx] R= R[dataindx] XYZ= numpy.zeros((len(data),3)) XYZ[:,0]= data.xc XYZ[:,1]= data.yc XYZ[:,2]= data.zc+_ZSUN vxvyvz= numpy.zeros((len(data),3)) vxvyvz[:,0]= data.vxc vxvyvz[:,1]= data.vyc vxvyvz[:,2]= data.vzc """ cov_vxvyvz= numpy.zeros((len(data),3,3)) cov_vxvyvz[:,0,0]= data.vxc_err**2. cov_vxvyvz[:,1,1]= data.vyc_err**2. cov_vxvyvz[:,2,2]= data.vzc_err**2. cov_vxvyvz[:,0,1]= data.vxvyc_rho*data.vxc_err*data.vyc_err cov_vxvyvz[:,0,2]= data.vxvzc_rho*data.vxc_err*data.vzc_err cov_vxvyvz[:,1,2]= data.vyvzc_rho*data.vyc_err*data.vzc_err """ cosphi= (8.-XYZ[:,0])/R sinphi= XYZ[:,1]/R sinbeta= XYZ[:,2]/numpy.sqrt(R*R+XYZ[:,2]*XYZ[:,2]) cosbeta= R/numpy.sqrt(R*R+XYZ[:,2]*XYZ[:,2]) ndata= len(data.ra) cov_pmradec= numpy.zeros((ndata,2,2)) cov_pmradec[:,0,0]= data.pmra_err**2. cov_pmradec[:,1,1]= data.pmdec_err**2. cov_pmllbb= bovy_coords.cov_pmrapmdec_to_pmllpmbb(cov_pmradec,data.ra, data.dec,degree=True) """ vR= -vxvyvz[:,0]*cosphi+vxvyvz[:,1]*sinphi vT= vxvyvz[:,0]*sinphi+vxvyvz[:,1]*cosphi vz= vxvyvz[:,2] vxvyvz[:,0]= vR vxvyvz[:,1]= vT for rr in range(len(XYZ[:,0])): rot= numpy.array([[cosphi[rr],sinphi[rr]], [-sinphi[rr],cosphi[rr]]]) sxy= cov_vxvyvz[rr,0:2,0:2] sRT= numpy.dot(rot,numpy.dot(sxy,rot.T)) cov_vxvyvz[rr,0:2,0:2]= sRT """ #calculate x and y lb= bovy_coords.radec_to_lb(data.ra,data.dec,degree=True) lb*= _DEGTORAD tuu= 1.-numpy.cos(lb[:,1])**2.*numpy.cos(lb[:,0])**2. tuv= -0.5*numpy.cos(lb[:,1])**2.*numpy.sin(2.*lb[:,0]) tuw= -0.5*numpy.cos(lb[:,0])*numpy.sin(2.*lb[:,1]) tvv= 1.-numpy.cos(lb[:,1])**2.*numpy.sin(lb[:,0])**2. tvw= -0.5*numpy.sin(2.*lb[:,1])*numpy.sin(lb[:,0]) tww= numpy.cos(lb[:,1])**2. #x= tuu*_VRSUN+tuv*vxvyvz[:,1]+tuw*vxvyvz[:,2] #y= -tww*_VZSUN+tuw*vxvyvz[:,0]+tvw*vxvyvz[:,1] x= -tuu*numpy.mean(vxvyvz[:,0])+tuv*vxvyvz[:,1]+tuw*vxvyvz[:,2] y= -tww*numpy.mean(vxvyvz[:,2])+tuw*vxvyvz[:,0]+tvw*vxvyvz[:,1] if options.type.lower() == 'u': corcorr=0. plotthis[ii,jj]= (numpy.mean(vxvyvz[:,0]*x)-numpy.mean(vxvyvz[:,0])*numpy.mean(x))/(numpy.var(x)+numpy.mean(tuv**2.+tuw**2.)*numpy.var(vxvyvz[:,0])) elif options.type.lower() == 'meanu': plotthis[ii,jj]= numpy.mean(vxvyvz[:,0]) elif options.type.lower() == 'meanw': plotthis[ii,jj]= numpy.mean(vxvyvz[:,2]) else: corcorr= 0.25*numpy.mean(2.*sinbeta*cosbeta*numpy.sin(2.*lb[:,1])*numpy.cos(lb[:,0])*cosphi)*(numpy.var(vxvyvz[:,0])-numpy.var(vxvyvz[:,2]))\ -0.25*numpy.mean(2.*sinbeta*cosbeta*numpy.sin(2.*lb[:,1])*numpy.sin(lb[:,0])*sinphi)*(numpy.var(vxvyvz[:,0])-numpy.var(vxvyvz[:,2]))\ +0.25*numpy.mean(numpy.sin(lb[:,1])**2.*(cov_pmllbb[:,1,1]*data.dist**2.*4.74**2.-data.vr_err**2.)) plotthis[ii,jj]= (numpy.mean(vxvyvz[:,2]*y)-numpy.mean(vxvyvz[:,2])*numpy.mean(y)-corcorr)/(numpy.var(y)+numpy.mean(tvw**2.+tuw**2.)*numpy.var(vxvyvz[:,2])) #print ii, jj, plotthis[ii,jj], corcorr, numpy.mean(vxvyvz[:,2]*y)-numpy.mean(vxvyvz[:,2])*numpy.mean(y)-corcorr jj+= 1 if jj == len(binned.afeedges)-1: jj= 0 ii+= 1 if jj == 0: #this means we've reset the counter break #print plotthis #Set up plot if options.type.lower() == 'meanu': vmin, vmax= -20.,20. zlabel=r'$\mathrm{mean}\ U$' elif options.type.lower() == 'meanw': vmin, vmax= -20.,20. zlabel=r'$\mathrm{mean}\ W$' else: vmin, vmax= -0.2,0.2 zlabel=r'$\mathrm{fractional\ distance\ overestimate}$' if options.tighten: xrange=[-1.6,0.5] yrange=[-0.05,0.55] else: xrange=[-2.,0.5] yrange=[-0.2,0.6] bovy_plot.bovy_print() bovy_plot.bovy_dens2d(plotthis.T,origin='lower',cmap='jet', interpolation='nearest', xlabel=r'$[\mathrm{Fe/H}]$', ylabel=r'$[\alpha/\mathrm{Fe}]$', zlabel=zlabel, xrange=xrange,yrange=yrange, vmin=vmin,vmax=vmax, contours=False, colorbar=True,shrink=0.78) bovy_plot.bovy_text(r'$\mathrm{median} = %.2f$' % (numpy.median(plotthis[numpy.isfinite(plotthis)])), bottom_left=True,size=14.) bovy_plot.bovy_end_print(options.outfilename) return None
def __init__(self,vxvv=None,uvw=False,lb=False, radec=False,vo=235.,ro=8.5,zo=0.025, solarmotion='hogg'): """ NAME: __init__ PURPOSE: Initialize an Orbit instance INPUT: vxvv - initial conditions 3D can be either 1) in Galactocentric cylindrical coordinates [R,vR,vT(,z,vz,phi)] 2) [ra,dec,d,mu_ra, mu_dec,vlos] in [deg,deg,kpc,mas/yr,mas/yr,km/s] (all J2000.0; mu_ra = mu_ra * cos dec) 3) [ra,dec,d,U,V,W] in [deg,deg,kpc,km/s,km/s,kms] 4) (l,b,d,mu_l, mu_b, vlos) in [deg,deg,kpc,mas/yr,mas/yr,km/s) (all J2000.0; mu_l = mu_l * cos b) 5) [l,b,d,U,V,W] in [deg,deg,kpc,km/s,km/s,kms] 4) and 5) also work when leaving out b and mu_b/W OPTIONAL INPUTS: radec - if True, input is 2) (or 3) above uvw - if True, velocities are UVW lb - if True, input is 4) or 5) above vo - circular velocity at ro ro - distance from vantage point to GC (kpc) zo - offset toward the NGP of the Sun wrt the plane (kpc) solarmotion - 'hogg' or 'dehnen', or 'schoenrich', or value in [-U,V,W] OUTPUT: instance HISTORY: 2010-07-20 - Written - Bovy (NYU) """ if isinstance(solarmotion,str) and solarmotion.lower() == 'hogg': vsolar= nu.array([-10.1,4.0,6.7])/vo elif isinstance(solarmotion,str) and solarmotion.lower() == 'dehnen': vsolar= nu.array([-10.,5.25,7.17])/vo elif isinstance(solarmotion,str) \ and solarmotion.lower() == 'schoenrich': vsolar= nu.array([-11.1,12.24,7.25])/vo else: vsolar= nu.array(solarmotion)/vo if radec or lb: if radec: l,b= coords.radec_to_lb(vxvv[0],vxvv[1],degree=True) elif len(vxvv) == 4: l, b= vxvv[0], 0. else: l,b= vxvv[0],vxvv[1] if uvw: X,Y,Z= coords.lbd_to_XYZ(l,b,vxvv[2],degree=True) vx= vxvv[3] vy= vxvv[4] vz= vxvv[5] else: if radec: pmll, pmbb= coords.pmrapmdec_to_pmllpmbb(vxvv[3],vxvv[4], vxvv[0],vxvv[1], degree=True) d, vlos= vxvv[2], vxvv[5] elif len(vxvv) == 4: pmll, pmbb= vxvv[2], 0. d, vlos= vxvv[1], vxvv[3] else: pmll, pmbb= vxvv[3], vxvv[4] d, vlos= vxvv[2], vxvv[5] X,Y,Z,vx,vy,vz= coords.sphergal_to_rectgal(l,b,d, vlos,pmll, pmbb, degree=True) X/= ro Y/= ro Z/= ro vx/= vo vy/= vo vz/= vo vsun= nu.array([0.,1.,0.,])+vsolar R, phi, z= coords.XYZ_to_galcencyl(X,Y,Z,Zsun=zo/ro) vR, vT,vz= coords.vxvyvz_to_galcencyl(vx,vy,vz, R,phi,z, vsun=vsun,galcen=True) if lb and len(vxvv) == 4: vxvv= [R,vR,vT,phi] else: vxvv= [R,vR,vT,z,vz,phi] self.vxvv= vxvv if len(vxvv) == 2: self._orb= linearOrbit(vxvv=vxvv) elif len(vxvv) == 3: self._orb= planarROrbit(vxvv=vxvv) elif len(vxvv) == 4: self._orb= planarOrbit(vxvv=vxvv) elif len(vxvv) == 5: self._orb= RZOrbit(vxvv=vxvv) elif len(vxvv) == 6: self._orb= FullOrbit(vxvv=vxvv)
def calc_eccentricity(args, options): table = os.path.join(args[0], 'table2.dat') readme = os.path.join(args[0], 'ReadMe') dierickx = ascii.read(table, readme=readme) vxvv = np.dstack([ dierickx['RAdeg'], dierickx['DEdeg'], dierickx['Dist'] / 1e3, dierickx['pmRA'], dierickx['pmDE'], dierickx['HRV'] ])[0] ro, vo, zo = 8., 220., 0.025 ra, dec = vxvv[:, 0], vxvv[:, 1] lb = bovy_coords.radec_to_lb(ra, dec, degree=True) pmra, pmdec = vxvv[:, 3], vxvv[:, 4] pmllpmbb = bovy_coords.pmrapmdec_to_pmllpmbb(pmra, pmdec, ra, dec, degree=True) d, vlos = vxvv[:, 2], vxvv[:, 5] rectgal = bovy_coords.sphergal_to_rectgal(lb[:, 0], lb[:, 1], d, vlos, pmllpmbb[:, 0], pmllpmbb[:, 1], degree=True) vsolar = np.array([-10.1, 4.0, 6.7]) vsun = np.array([ 0., 1., 0., ]) + vsolar / vo X = rectgal[:, 0] / ro Y = rectgal[:, 1] / ro Z = rectgal[:, 2] / ro vx = rectgal[:, 3] / vo vy = rectgal[:, 4] / vo vz = rectgal[:, 5] / vo vsun = np.array([ 0., 1., 0., ]) + vsolar / vo Rphiz = bovy_coords.XYZ_to_galcencyl(X, Y, Z, Zsun=zo / ro) vRvTvz = bovy_coords.vxvyvz_to_galcencyl(vx, vy, vz, Rphiz[:, 0], Rphiz[:, 1], Rphiz[:, 2], vsun=vsun, Xsun=1., Zsun=zo / ro, galcen=True) #do the integration and individual analytic estimate for each object ts = np.linspace(0., 20., 10000) lp = LogarithmicHaloPotential(normalize=1.) e_ana = numpy.zeros(len(vxvv)) e_int = numpy.zeros(len(vxvv)) print( 'Performing orbit integration and analytic parameter estimates for Dierickx et al. sample...' ) for i in tqdm(range(len(vxvv))): try: orbit = Orbit(vxvv[i], radec=True, vo=220., ro=8.) e_ana[i] = orbit.e(analytic=True, pot=lp, c=True) except UnboundError: e_ana[i] = np.nan orbit.integrate(ts, lp) e_int[i] = orbit.e(analytic=False) fig = plt.figure() fig.set_size_inches(1.5 * columnwidth, 1.5 * columnwidth) plt.scatter(e_int, e_ana, s=1, color='Black', lw=0.) plt.xlabel(r'$\mathrm{galpy\ integrated}\ e$') plt.ylabel(r'$\mathrm{galpy\ analytic}\ e$') plt.xlim(0., 1.) plt.ylim(0., 1.) fig.tight_layout() plt.savefig(os.path.join(args[0], 'dierickx-integratedeanalytice.png'), format='png', dpi=200) fig = plt.figure() fig.set_size_inches(1.5 * columnwidth, 1.5 * columnwidth) plt.hist(e_int, bins=30) plt.xlim(0., 1.) plt.xlabel(r'$\mathrm{galpy}\ e$') fig.tight_layout() plt.savefig(os.path.join(args[0], 'dierickx-integratedehist.png'), format='png', dpi=200) fig = plt.figure() fig.set_size_inches(1.5 * columnwidth, 1.5 * columnwidth) plt.scatter(dierickx['e'], e_int, s=1, color='Black', lw=0.) plt.xlabel(r'$\mathrm{Dierickx\ et\ al.}\ e$') plt.ylabel(r'$\mathrm{galpy\ integrated}\ e$') plt.xlim(0., 1.) plt.ylim(0., 1.) fig.tight_layout() plt.savefig(os.path.join(args[0], 'dierickx-integratedee.png'), format='png', dpi=200) fig = plt.figure() fig.set_size_inches(1.5 * columnwidth, 1.5 * columnwidth) plt.scatter(dierickx['e'], e_ana, s=1, color='Black', lw=0.) plt.xlabel(r'$\mathrm{Dierickx\ et\ al.}\ e$') plt.ylabel(r'$\mathrm{galpy\ estimated}\ e$') plt.xlim(0., 1.) plt.ylim(0., 1.) fig.tight_layout() plt.savefig(os.path.join(args[0], 'dierickx-analyticee.png'), format='png', dpi=200) arr = numpy.recarray(len(e_ana), dtype=[('analytic_e', float), ('integrated_e', float)]) arr['analytic_e'] = e_ana arr['integrated_e'] = e_int with open(os.path.join(args[0], 'eccentricities.dat'), 'w') as file: pickle.dump(arr, file) file.close()
rdata[:, 2] = rdata[:, 2] * 1000.0 rdata[:, 8] = rdata[:, 8] * 1000.0 rdata[:, 14] = rdata[:, 14] * 1000.0 # arcsec/yr -> mas/yr rdata[:, 3] = rdata[:, 3] * 1000.0 rdata[:, 4] = rdata[:, 4] * 1000.0 rdata[:, 9] = rdata[:, 9] * 1000.0 rdata[:, 10] = rdata[:, 10] * 1000.0 rdata[:, 15] = rdata[:, 15] * 1000.0 rdata[:, 16] = rdata[:, 16] * 1000.0 # Galactic coordinates # True l and b RA_true = rdata[:, 0] DEC_true = rdata[:, 1] Tllbb = bovy_coords.radec_to_lb(RA_true, DEC_true, degree=True, epoch=2000.0) GLON_true = Tllbb[:, 0] GLAT_true = Tllbb[:, 1] # True pmGLON, pmGLAT pmRA_true = rdata[:, 3] pmDEC_true = rdata[:, 4] Tpmllbb=bovy_coords.pmrapmdec_to_pmllpmbb(pmRA_true,pmDEC_true \ ,RA_true,DEC_true,degree=True,epoch=2000.0) pmGLON_true = Tpmllbb[:, 0] pmGLAT_true = Tpmllbb[:, 1] # observed RA_obs = rdata[:, 6] DEC_obs = rdata[:, 7] pmRA_obs = rdata[:, 9] pmDEC_obs = rdata[:, 10] Tpmllbb=bovy_coords.pmrapmdec_to_pmllpmbb(pmRA_obs,pmDEC_obs \
def fakeDensData(parser): numpy.random.seed(1) (options,args)= parser.parse_args() if len(args) == 0: parser.print_help() return #Set up density model if options.model.lower() == 'hwr': densfunc= _HWRDensity if options.metal.lower() == 'rich': params= numpy.array([-1.34316986e+00,1.75402412e+00,5.14667706e-04]) else: params= numpy.array([-0.3508148171668,0.65752,0.00206572947631]) elif options.model.lower() == 'flare': densfunc= _FlareDensity if options.metal.lower() == 'rich': params= numpy.log(numpy.array([0.3,2.5,2.5])) else: params= numpy.log(numpy.array([0.3,2.5,2.5])) elif options.model.lower() == 'tiedflare': densfunc= _TiedFlareDensity if options.metal.lower() == 'rich': params= numpy.log(numpy.array([0.3,2.5])) else: params= numpy.log(numpy.array([0.3,2.5])) elif options.model.lower() == 'twovertical': densfunc= _TwoVerticalDensity if options.metal.lower() == 'rich': params= numpy.log(numpy.array([0.3,0.8,2.5,1.05])) else: params= numpy.log(numpy.array([0.3,0.8,2.5,1.05])) #Data XYZ,vxvyvz,cov_vxvyvz,rawdata= readData(metal=options.metal, sample=options.sample) if options.metal.lower() == 'rich': feh= -0.15 fehrange= [-0.4,0.5] elif options.metal.lower() == 'poor': feh= -0.65 fehrange= [-1.5,-0.5] else: feh= -0.5 #Load model distributions if options.sample.lower() == 'g': colorrange=[0.48,0.55] elif options.sample.lower() == 'k': colorrange=[0.55,0.75] #FeH fehdist= DistSpline(*numpy.histogram(rawdata.feh,bins=11,range=fehrange), xrange=fehrange) #Color colordist= DistSpline(*numpy.histogram(rawdata.dered_g-rawdata.dered_r, bins=9,range=colorrange), xrange=colorrange) #Load selection function sf= segueSelect.segueSelect(type_bright=options.sel_bright, type_faint=options.sel_faint, sample=options.sample) platelb= bovy_coords.radec_to_lb(sf.platestr.ra,sf.platestr.dec, degree=True) if options.sample.lower() == 'g': rmin, rmax= 14.5, 20.2 grmin, grmax= 0.48, 0.55 elif options.sample.lower() == 'k': rmin, rmax= 14.5, 19. grmin, grmax= 0.55, 0.75 #Calculate the r-distribution for each plate nrs= 1001 ngr, nfeh= 21, 21 grs= numpy.linspace(grmin,grmax,ngr) fehs= numpy.linspace(fehrange[0],fehrange[1],nfeh) #Calcuate FeH and gr distriutions fehdists= numpy.zeros(nfeh) for ii in range(nfeh): fehdists[ii]= fehdist(fehs[ii]) fehdists= numpy.cumsum(fehdists) fehdists/= fehdists[-1] colordists= numpy.zeros(ngr) for ii in range(ngr): colordists[ii]= colordist(grs[ii]) colordists= numpy.cumsum(colordists) colordists/= colordists[-1] rs= numpy.linspace(rmin,rmax,nrs) rdists= numpy.zeros((len(sf.plates),nrs,ngr,nfeh)) for ii in range(len(sf.plates)): p= sf.plates[ii] sys.stdout.write('\r'+"Working on plate %i (%i/%i)" % (p,ii+1,len(sf.plates))) sys.stdout.flush() rdists[ii,:,:,:]= _predict_rdist_plate(rs,densfunc,params,rmin,rmax, platelb[ii,0],platelb[ii,1], grmin,grmax, fehrange[0],fehrange[1],feh, colordist, fehdist,sf,sf.plates[ii], dontmarginalizecolorfeh=True, ngr=ngr,nfeh=nfeh) sys.stdout.write('\r'+segueSelect._ERASESTR+'\r') sys.stdout.flush() numbers= numpy.sum(rdists,axis=3) numbers= numpy.sum(numbers,axis=2) numbers= numpy.sum(numbers,axis=1) numbers= numpy.cumsum(numbers) numbers/= numbers[-1] rdists= numpy.cumsum(rdists,axis=1) for ii in range(len(sf.plates)): for jj in range(ngr): for kk in range(nfeh): rdists[ii,:,jj,kk]/= rdists[ii,-1,jj,kk] #Now sample until we're done out= [] while len(out) < options.nsamples: #First sample a plate ran= numpy.random.uniform() kk= 0 while numbers[kk] < ran: kk+= 1 #Also sample a Feh and a color ran= numpy.random.uniform() ff= 0 while fehdists[ff] < ran: ff+= 1 ran= numpy.random.uniform() cc= 0 while colordists[cc] < ran: cc+= 1 #plate==kk, feh=ff,color=cc; now sample from the rdist of this plate ran= numpy.random.uniform() jj= 0 while rdists[kk,jj,cc,ff] < ran: jj+= 1 #r=jj out.append([rs[jj],grs[cc],fehs[ff],platelb[kk,0],platelb[kk,1], sf.plates[kk]]) #Save as pickle savefile= open(args[0],'wb') pickle.dump(out,savefile) savefile.close()