def a2(m, x, y, nbin): rcil = np.sqrt(x**2 + y**2) rbin, nodos = bines.rbin1(rcil, nbin) A2v = np.ndarray(nbin) phiv = np.ndarray(nbin) n = len(x) delta = n / nbin r_sort = np.sort(rcil) for j in range(0, nbin): mask, = np.where((rcil > r_sort[j * (delta - 1)]) & (rcil <= r_sort[(delta - 1) * (j + 1)])) xn = x[mask] yn = y[mask] titaj = np.arctan2(yn, xn) a0 = np.sum(m[mask]) a2 = np.sum(m[mask] * np.cos(2. * titaj)) b2 = np.sum(m[mask] * np.sin(2. * titaj)) A2v[j] = np.sqrt(a2**2 + b2**2) / a0 phiv[j] = np.arctan2(b2, a2) / 2. return A2v, phiv, rbin
def a2max(m,x,y,nbin): rcil = np.sqrt(x**2 + y**2) rbin, nodos = bines.rbin1(rcil, nbin) A2v = np.ndarray(nbin) phiv = np.ndarray(nbin) n = len(x) delta = n / nbin r_sort = np.sort(rcil) for j in range(0, nbin): mask, = np.where((rcil > r_sort[j*(delta-1)]) & (rcil <= r_sort[(delta-1)*(j+1)])) xn = x[mask] yn = y[mask] titaj = np.arctan2(yn,xn) a0 = np.sum(m[mask]) a2 = np.sum(m[mask]*np.cos(2.*titaj)) b2 = np.sum(m[mask]*np.sin(2.*titaj)) A2v[j] = np.sqrt(a2**2 + b2**2) / a0 phiv[j] = np.arctan2(b2,a2) / 2. A2max_arg = np.argmax(A2v) A2max = A2v[A2max_arg] rbinmax = rbin[A2max_arg] phimax = phiv[A2max_arg] phimed = np.mean([phiv[A2max_arg],phiv[A2max_arg+1],phiv[A2max_arg-1],phiv[A2max_arg+2],phiv[A2max_arg-2]]) return A2max, rbinmax, phimax, phimed
def a2max(m, x, y, nbin): Rcil = np.sqrt(x**2 + y**2) rbin = bines.rbin1(Rcil, nbin) A2v = np.ndarray(nbin) phiv = np.ndarray(nbin) for j in range(0, nbin - 1): mask, = np.where((Rcil > rbin[j]) & (Rcil <= rbin[j + 1])) xn = x[mask] yn = y[mask] titaj = np.arctan2(yn, xn) a0 = sum(m[mask]) a2 = sum(m[mask] * np.cos(2. * titaj)) b2 = sum(m[mask] * np.sin(2. * titaj)) A2v[j] = np.sqrt(a2**2 + b2**2) / a0 phiv[j] = np.arctan2(b2, a2) / 2. A2max_arg = np.argmax(A2v) A2max = max(A2v) rbinmax = rbin[A2max_arg] phimax = phiv[A2max_arg] return A2max, rbinmax, phimax
def met(R, z, FeH, nbin): med, nodos = bines2.rbin1(R, nbin) Fe_H = np.zeros(nbin) for i in range(nbin): mask, = np.where((R < nodos[i + 1]) & (R > nodos[i]) & (z > 0)) Fe_H[i] = np.median(FeH[mask]) return med, Fe_H
def vol_density(r, m, nbin): med, nodos = bines2.rbin1(r, nbin) rho = np.zeros(nbin) for i in range(nbin): vol = (4/3.)*np.pi*(nodos[i+1]**3 - nodos[i]**3) mask, = np.where((r < nodos[i+1]) & (r > nodos[i])) rho[i] = np.sum(m[mask])/vol return rho, med
def Vc_bin(r, m, nbin, G=4.299e-6): med, nodos = bines2.rbin1(r, nbin) Vcir = np.zeros(nbin) for i in range(nbin): limit = np.where(r < med[i]) M = np.sum(m[limit]) Vcir[i] = np.sqrt(G * M / med[i]) return Vcir, med
def surf_density(R,m,nbin): med, nodos = bines2.rbin1(R, nbin) sigma = np.zeros(nbin) for i in range(nbin): area = np.pi*(nodos[i+1]**2 - nodos[i]**2) mask, = np.where((R < nodos[i+1]) & (R > nodos[i])) sigma[i] = np.sum(m[mask])/area return sigma, med
def surf_density(R,m,nbin): if len(R) != len(m): print ('Error: vector lengths do not match') med, nodos = bines2.rbin1(R, nbin) sigma = np.zeros(nbin) for i in range(nbin): area = np.pi*np.abs(nodos[i+1]**2 - nodos[i]**2) mask, = np.where((R < nodos[i+1]) & (R > nodos[i])) sigma[i] = np.sum(m[mask])/area return sigma, med
def HMSH(R,z,m,nbin): med, nodos = bines2.rbin1(R, nbin) z50 = np.zeros(nbin) for i in range(nbin): mask, = np.where((R < nodos[i+1]) & (R > nodos[i]) & (z>0)) zorder = np.argsort(z[mask]) zsort = z[mask][zorder] msort = m[mask][zorder] mtot = np.cumsum(msort) m_mean, = np.where(mtot < mtot[-1]/2.) z50[i] = zsort[m_mean][-1] return med, z50
def elipsoide2(x,y,z,vx,vy,vz,m,radio, nbin=20): if np.isnan(radio)== True: omegabar = np.nan goto .end r = np.sqrt(x**2 + y**2 + z**2) limit, = np.where(r < radio) jx = sum(m[limit]*(y[limit]*vz[limit]-z[limit]*vy[limit])) jy = sum(m[limit]*(z[limit]*vx[limit]-x[limit]*vz[limit])) jz = sum(m[limit]*(x[limit]*vy[limit]-y[limit]*vx[limit])) j = np.sqrt(jx**2 + jy**2 + jz**2) Jt = np.ndarray(3) Jt[0] = jx Jt[1] = jy Jt[2] = jz tensor = ten.tenf(x[limit], y[limit], z[limit]) #calculo el tensor de forma matriz = np.linalg.eig(tensor) #saco los autovalores autoval = matriz[0] autovec = matriz[1] asort = np.argsort(autoval) #los ordeno de menor a mayor A = np.sqrt(autoval[asort][2]) #semiejes B = np.sqrt(autoval[asort][1]) C = np.sqrt(autoval[asort][0]) V1 = autovec[:,asort][:,2] V2 = autovec[:,asort][:,1] V3 = autovec[:,asort][:,0] modV = np.sqrt(np.dot(V3,V3)) tita = np.arccos(np.dot(Jt,V3)/(j*modV)) if tita > np.pi/2.: V3 = -V3 cruz = np.cross(V3,V1) test = np.sign(cruz) == np.sign(V2) if test.all() == False: V2 = cruz aa = radio #normalizo al radio que yo quiero bb = (B/A)*radio cc = (C/A)*radio pos = np.ndarray([len(x[limit]),3]) pos[:,0] = x[limit] pos[:,1] = y[limit] pos[:,2] = z[limit] xx = np.zeros(len(x[limit])) yy = np.zeros(len(x[limit])) zz = np.zeros(len(x[limit])) xx[:] = np.dot(pos[:],V1) yy[:] = np.dot(pos[:],V2) zz[:] = np.dot(pos[:],V3) Relip = np.sqrt((xx/aa)**2 + (yy/bb)**2 + (zz/cc)**2) # formula del elipsoide mask, = np.where(Relip <= 1.) xn = xx[mask] yn = yy[mask] zn = zz[mask] vel = np.ndarray([len(x[limit]),3]) vel[:,0] = vx[limit] vel[:,1] = vy[limit] vel[:,2] = vz[limit] vxx = np.zeros(len(x[limit])) vyy = np.zeros(len(x[limit])) vzz = np.zeros(len(x[limit])) vxx[:] = np.dot(vel[:],V1) vyy[:] = np.dot(vel[:],V2) vzz[:] = np.dot(vel[:],V3) vxn = vxx[mask] vyn = vyy[mask] vzn = vzz[mask] rn = np.sqrt(xn**2 + yn**2 + zn**2) Rn = np.sqrt(xn**2 + yn**2) Vtg = (-yn*vxn + xn*vyn)/Rn omega = Vtg/Rn med, nodos = bine.rbin1(rn,nbin) omega_mean = np.zeros(nbin) for i in range(0,nbin): inbin, = np.where((rn > nodos[i]) & (rn < nodos[i+1])) omega_mean[i] = np.mean(omega[inbin]) finterp = sint.interp1d(med,omega_mean,fill_value="extrapolate") omegabar = finterp(radio) label .end return omegabar #xn, yn, zn, V1, V2, V3, A, B, C
def elipsoide(x, y, z, vx, vy, vz, radio, phi=0, nbin=20): if radio == np.nan: omegabar = np.nan else: xx = x * np.cos(phi) + y * np.sin(phi) yy = x * -np.sin(phi) + y * np.cos(phi) zz = z r = np.sqrt(xx**2 + yy**2 + zz**2) limit, = np.where(r < radio) tensor = ten.tenf(xx[limit], yy[limit], zz[limit]) #calculo el tensor de forma matriz = np.linalg.eig(tensor) #saco los autovalores autoval = matriz[0] autovec = matriz[1] # print autovec, '\n' asort = np.sort(autoval) #los ordeno de menor a mayor A = np.sqrt(asort[2]) #semiejes B = np.sqrt(asort[1]) C = np.sqrt(asort[0]) aa = radio #normalizo al radio que yo quiero bb = (B / A) * radio cc = (C / A) * radio Relip = np.sqrt((xx / aa)**2 + (yy / bb)**2 + (zz / cc)**2) # formula del elipsoide mask, = np.where(Relip <= 1.) xn = x[mask] yn = y[mask] zn = z[mask] vxn = vx[mask] vyn = vy[mask] vzn = vz[mask] rn = np.sqrt(xn**2 + yn**2 + zn**2) Rn = np.sqrt(xn**2 + yn**2) Vtg = (-yn * vxn + xn * vyn) / Rn omega = Vtg / Rn med, nodos = bine.rbin1(rn, nbin) omega_mean = np.zeros(nbin) for i in range(0, nbin): inbin, = np.where((rn > nodos[i]) & (rn < nodos[i + 1])) omega_mean[i] = np.mean(omega[inbin]) finterp = sint.interp1d(med, omega_mean, fill_value="extrapolate") omegabar = finterp(radio) return omegabar, xn, yn, zn, autovec, A, B, C