def uvw_unc(req_dict, opt_dict): cov_radec = np.zeros((2, 2)) cov_radec[0, 0] = opt_dict['epmra']**2 cov_radec[1, 1] = opt_dict['epmdec']**2 covar_pmllbb = b_c.cov_pmrapmdec_to_pmllpmbb(cov_radec, req_dict['ra'], req_dict['dec'], degree=True, epoch=2000.0) cov_vxvyvz = b_c.cov_dvrpmllbb_to_vxyz(req_dict['dist'], opt_dict['edist'], opt_dict['erv'], req_dict['pml'], req_dict['pmb'], covar_pmllbb, req_dict['l'], req_dict['b'], plx=False, degree=True) du = vx_e = m.sqrt(cov_vxvyvz[0, 0]) dv = vy_e = m.sqrt(cov_vxvyvz[1, 1]) dw = vz_e = m.sqrt(cov_vxvyvz[2, 2]) return du, dv, dw
def calc_covar_pmllpmbb(self): covpmllbb = bcoords.cov_pmrapmdec_to_pmllpmbb(self.covar_pmradec, self.get_col('RA'), self.get_col('DEC'), degree=self.degree, epoch=2000.0) self.covar_pmllpmbb = covpmllbb
def test_cov_pmradec_to_pmllbb(): # This is the NGP at 1950., for this the parallactic angle is 180 ra, dec= 192.25, 27.4 cov_pmrapmdec= numpy.array([[100.,100.],[100.,400.]]) cov_pmllpmbb= bovy_coords.cov_pmrapmdec_to_pmllpmbb(cov_pmrapmdec, ra,dec, degree=True, epoch=1950.) assert numpy.fabs(cov_pmllpmbb[0,0]-100.) < 10.**-10., 'cov_pmradec_to_pmllbb conversion did not work as expected' assert numpy.fabs(cov_pmllpmbb[0,1]-100.) < 10.**-10., 'cov_pmradec_to_pmllbb conversion did not work as expected' assert numpy.fabs(cov_pmllpmbb[1,0]-100.) < 10.**-10., 'cov_pmradec_to_pmllbb conversion did not work as expected' assert numpy.fabs(cov_pmllpmbb[1,1]-400.) < 10.**-10., 'cov_pmradec_to_pmllbb conversion did not work as expected' # This is a random position, check that the conversion makes sense ra, dec= 132.25, -23.4 cov_pmrapmdec= numpy.array([[100.,100.],[100.,400.]]) cov_pmllpmbb= bovy_coords.cov_pmrapmdec_to_pmllpmbb(cov_pmrapmdec, ra/180.*numpy.pi, dec/180.*numpy.pi, degree=False, epoch=1950.) assert numpy.fabs(numpy.linalg.det(cov_pmllpmbb)-numpy.linalg.det(cov_pmrapmdec)) < 10.**-10., 'cov_pmradec_to_pmllbb conversion did not work as expected' assert numpy.fabs(numpy.trace(cov_pmllpmbb)-numpy.trace(cov_pmrapmdec)) < 10.**-10., 'cov_pmradec_to_pmllbb conversion did not work as expected' # This is a random position, check that the conversion makes sense, arrays ra, dec= 132.25, -23.4 icov_pmrapmdec= numpy.array([[100.,100.],[100.,400.]]) cov_pmrapmdec= numpy.empty((3,2,2)) for ii in range(3): cov_pmrapmdec[ii,:,:]= icov_pmrapmdec os= numpy.ones(3) cov_pmllpmbb= bovy_coords.cov_pmrapmdec_to_pmllpmbb(cov_pmrapmdec, os*ra, os*dec, degree=True, epoch=1950.) for ii in range(3): assert numpy.fabs(numpy.linalg.det(cov_pmllpmbb[ii,:,:])-numpy.linalg.det(cov_pmrapmdec[ii,:,:])) < 10.**-10., 'cov_pmradec_to_pmllbb conversion did not work as expected' assert numpy.fabs(numpy.trace(cov_pmllpmbb[ii,:,:])-numpy.trace(cov_pmrapmdec[ii,:,:])) < 10.**-10., 'cov_pmradec_to_pmllbb conversion did not work as expected' return None
def add_gaia_galactic_pm_errors(df): """Add errors in proper motions in galactic coordinates to a Gaia DR2 pandas DataFrame""" off_diag = df['pmra_error'] * df['pmdec_error'] * df['pmra_pmdec_corr'] covpmrapmdec = np.array([[df['pmra_error']**2, off_diag], [off_diag, df['pmdec_error']**2]]) try: ra_deg = np.array(df['ra_gaia'] / u.deg) dec_deg = np.array(df['dec_gaia'] / u.deg) except KeyError: ra_deg = np.array(df['ra'] / u.deg) dec_deg = np.array(df['dec'] / u.deg) cov = bovy_coords.cov_pmrapmdec_to_pmllpmbb(np.transpose( covpmrapmdec, [2, 0, 1]), ra_deg, dec_deg, degree=True) df['pml_error'] = np.sqrt(cov[:, 0, 0]) df['pmb_error'] = np.sqrt(cov[:, 1, 1]) df['pml_pmb_corr'] = cov[:, 0, 1] / (np.sqrt(cov[:, 0, 0]) * np.sqrt(cov[:, 1, 1]))
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 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 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