def test_galcencyl_to_XYZ(): gcR, gcp, gcZ= 5.,numpy.arctan(4./3.),2. XYZ= bovy_coords.galcencyl_to_XYZ(gcR,gcp,gcZ,Xsun=8.,Ysun=0.,Zsun=0.) assert numpy.fabs(XYZ[0]-5.) < 10.**-10., 'galcencyl_to_XYZ conversion did not work as expected' assert numpy.fabs(XYZ[1]-4.) < 10.**-10., 'galcencyl_to_XYZ conversion did not work as expected' assert numpy.fabs(XYZ[2]-2.) < 10.**-10., 'galcencyl_to_XYZ conversion did not work as expected' return None
def _fit_orbit_mlogl(new_vxvv,vxvv,vxvv_err,pot,radec,lb,tmockAA, ro,vo,obs): """The log likelihood for fitting an orbit""" #Use this _parse_args routine, which does forward and backward integration iR,ivR,ivT,iz,ivz,iphi= tmockAA._parse_args(True,False, new_vxvv[0], new_vxvv[1], new_vxvv[2], new_vxvv[3], new_vxvv[4], new_vxvv[5]) if radec or lb: #Need to transform to ra,dec #First transform to X,Y,Z,vX,vY,vZ (Galactic) X,Y,Z = coords.galcencyl_to_XYZ(iR.flatten(),iphi.flatten(), iz.flatten(), Xsun=obs[0]/ro, Ysun=obs[1]/ro, Zsun=obs[2]/ro) vX,vY,vZ = coords.galcencyl_to_vxvyvz(ivR.flatten(),ivT.flatten(), ivz.flatten(),iphi.flatten(), vsun=nu.array(\ obs[3:6])/vo) bad_indx= (X == 0.)*(Y == 0.)*(Z == 0.) if True in bad_indx: X[bad_indx]+= ro/10000. lbdvrpmllpmbb= coords.rectgal_to_sphergal(X*ro,Y*ro,Z*ro, vX*vo,vY*vo,vZ*vo, degree=True) if lb: orb_vxvv= nu.array([lbdvrpmllpmbb[:,0], lbdvrpmllpmbb[:,1], lbdvrpmllpmbb[:,2], lbdvrpmllpmbb[:,4], lbdvrpmllpmbb[:,5], lbdvrpmllpmbb[:,3]]).T else: #Further transform to ra,dec,pmra,pmdec radec= coords.lb_to_radec(lbdvrpmllpmbb[:,0], lbdvrpmllpmbb[:,1],degree=True) pmrapmdec= coords.pmllpmbb_to_pmrapmdec(lbdvrpmllpmbb[:,4], lbdvrpmllpmbb[:,5], lbdvrpmllpmbb[:,0], lbdvrpmllpmbb[:,1], degree=True) orb_vxvv= nu.array([radec[:,0],radec[:,1], lbdvrpmllpmbb[:,2], pmrapmdec[:,0],pmrapmdec[:,1], lbdvrpmllpmbb[:,3]]).T else: #shape=(2tintJ-1,6) orb_vxvv= nu.array([iR.flatten(),ivR.flatten(),ivT.flatten(), iz.flatten(),ivz.flatten(),iphi.flatten()]).T out= 0. for ii in range(vxvv.shape[0]): sub_vxvv= (orb_vxvv-vxvv[ii,:].flatten())**2. #print sub_vxvv[nu.argmin(nu.sum(sub_vxvv,axis=1))] if not vxvv_err is None: sub_vxvv/= vxvv_err[ii,:]**2. else: sub_vxvv/= 0.01**2. out+= logsumexp(-0.5*nu.sum(sub_vxvv,axis=1)) return -out
def galcencyl_to_lbd(R,phi,Z,degree=True): xyz=bovy_coords.galcencyl_to_XYZ(R,phi,Z) lbd=bovy_coords.XYZ_to_lbd(xyz[0],xyz[1],xyz[2],degree=degree) return lbd[0], lbd[1], lbd[2]
def _fit_orbit_mlogl(new_vxvv,vxvv,vxvv_err,pot,radec,lb, customsky,lb_to_customsky,pmllpmbb_to_customsky, tmockAA, ro,vo,obs): """The log likelihood for fitting an orbit""" #Use this _parse_args routine, which does forward and backward integration iR,ivR,ivT,iz,ivz,iphi= tmockAA._parse_args(True,False, new_vxvv[0], new_vxvv[1], new_vxvv[2], new_vxvv[3], new_vxvv[4], new_vxvv[5]) if radec or lb or customsky: #Need to transform to (l,b), (ra,dec), or a custom set #First transform to X,Y,Z,vX,vY,vZ (Galactic) X,Y,Z = coords.galcencyl_to_XYZ(iR.flatten(),iphi.flatten(), iz.flatten(), Xsun=obs[0]/ro, Ysun=obs[1]/ro, Zsun=obs[2]/ro) vX,vY,vZ = coords.galcencyl_to_vxvyvz(ivR.flatten(),ivT.flatten(), ivz.flatten(),iphi.flatten(), vsun=nu.array(\ obs[3:6])/vo) bad_indx= (X == 0.)*(Y == 0.)*(Z == 0.) if True in bad_indx: X[bad_indx]+= ro/10000. lbdvrpmllpmbb= coords.rectgal_to_sphergal(X*ro,Y*ro,Z*ro, vX*vo,vY*vo,vZ*vo, degree=True) if lb: orb_vxvv= nu.array([lbdvrpmllpmbb[:,0], lbdvrpmllpmbb[:,1], lbdvrpmllpmbb[:,2], lbdvrpmllpmbb[:,4], lbdvrpmllpmbb[:,5], lbdvrpmllpmbb[:,3]]).T elif radec: #Further transform to ra,dec,pmra,pmdec radec= coords.lb_to_radec(lbdvrpmllpmbb[:,0], lbdvrpmllpmbb[:,1],degree=True) pmrapmdec= coords.pmllpmbb_to_pmrapmdec(lbdvrpmllpmbb[:,4], lbdvrpmllpmbb[:,5], lbdvrpmllpmbb[:,0], lbdvrpmllpmbb[:,1], degree=True) orb_vxvv= nu.array([radec[:,0],radec[:,1], lbdvrpmllpmbb[:,2], pmrapmdec[:,0],pmrapmdec[:,1], lbdvrpmllpmbb[:,3]]).T elif customsky: #Further transform to ra,dec,pmra,pmdec customradec= lb_to_customsky(lbdvrpmllpmbb[:,0], lbdvrpmllpmbb[:,1],degree=True) custompmrapmdec= pmllpmbb_to_customsky(lbdvrpmllpmbb[:,4], lbdvrpmllpmbb[:,5], lbdvrpmllpmbb[:,0], lbdvrpmllpmbb[:,1], degree=True) orb_vxvv= nu.array([customradec[:,0],customradec[:,1], lbdvrpmllpmbb[:,2], custompmrapmdec[:,0],custompmrapmdec[:,1], lbdvrpmllpmbb[:,3]]).T else: #shape=(2tintJ-1,6) orb_vxvv= nu.array([iR.flatten(),ivR.flatten(),ivT.flatten(), iz.flatten(),ivz.flatten(),iphi.flatten()]).T out= 0. for ii in range(vxvv.shape[0]): sub_vxvv= (orb_vxvv-vxvv[ii,:].flatten())**2. #print(sub_vxvv[nu.argmin(nu.sum(sub_vxvv,axis=1))]) if not vxvv_err is None: sub_vxvv/= vxvv_err[ii,:]**2. else: sub_vxvv/= 0.01**2. out+= logsumexp(-0.5*nu.sum(sub_vxvv,axis=1)) return -out
def sample_and_hist_apars(pepperdf, apar, survey, nsample): (Omega, angle, dt) = pepperdf.sample(n=nsample, returnaAdt=True) RvR = pepperdf._approxaAInv(Omega[0], Omega[1], Omega[2], angle[0], angle[1], angle[2]) vo = pepperdf._vo ro = pepperdf._ro R0 = pepperdf._R0 Zsun = pepperdf._Zsun vsun = pepperdf._vsun XYZ = bovy_coords.galcencyl_to_XYZ(RvR[0] * ro, RvR[5], RvR[3] * ro, Xsun=R0, Zsun=Zsun).T slbd = bovy_coords.XYZ_to_lbd(XYZ[0], XYZ[1], XYZ[2], degree=True) l = slbd[:, 0] b = slbd[:, 1] r = slbd[:, 2] closesttrackindexes = np.zeros(len(r)) for i in np.arange(len(r)): closesttrackindexes[i] = pepperdf.find_closest_trackpoint(RvR[0][i], RvR[1][i], RvR[2][i], RvR[3][i], RvR[4][i], RvR[5][i], interp=True) starapar = pepperdf._interpolatedThetasTrack[( closesttrackindexes).astype(int)] masses = assign_masses(nsample) if 'LSST' in survey: mag1 = isodict['lsst_g-10.00-0.0001'](masses) + ( 5 * np.log10(r * 1e3) - 5) magerror1 = errormodels[survey]['g'](mag1) mag2 = isodict['lsst_r-10.00-0.0001'](masses) + ( 5 * np.log10(r * 1e3) - 5) magerror2 = errormodels[survey]['r'](mag2) elif survey == 'CASTOR': mag1 = isodict['castor_u-10.00-0.0001'](masses) + ( 5 * np.log10(r * 1e3) - 5) magerror1 = errormodels[survey]['u'](mag1) mag2 = isodict['castor_g-10.00-0.0001'](masses) + ( 5 * np.log10(r * 1e3) - 5) magerror2 = errormodels[survey]['g'](mag2) elif survey == 'WFIRST': mag1 = isodict['Z087-10.00-0.0001'](masses) + (5 * np.log10(r * 1e3) - 5) magerror1 = errormodels[survey]['z'](mag1) mag2 = isodict['H158-10.00-0.0001'](masses) + (5 * np.log10(r * 1e3) - 5) magerror2 = errormodels[survey]['h'](mag2) else: mag1 = isodict['sdss_g-10.00-0.0001'](masses) + ( 5 * np.log10(r * 1e3) - 5) magerror1 = errormodels[survey]['g'](mag1) mag2 = isodict['sdss_r-10.00-0.0001'](masses) + ( 5 * np.log10(r * 1e3) - 5) magerror2 = errormodels[survey]['r'](mag2) omag1 = (mag1 + np.random.normal(size=len(mag1)) * magerror1)[((magerror1 < .1) & (magerror2 < .1))] omag2 = (mag2 + np.random.normal(size=len(mag2)) * magerror2)[((magerror1 < .1) & (magerror2 < .1))] magsel = ((magerror1 < .1) & (magerror2 < .1)) lrange = [340, 360] brange = [37.5, 47.5] skysel = ((l < lrange[1]) & (l > lrange[0]) & (b < brange[1]) & (b > brange[0])) aparbins = np.linspace(apar[0] - (apar[1] - apar[0]) / 2., apar[-1] + 3 * (apar[1] - apar[0]) / 2., len(apar) + 1, endpoint=False) #centroids = bins[1:]-(bins[1]-bins[0])/2. counts, bins = np.histogram(starapar[magsel & skysel], bins=aparbins)