km = 1000. # [m] G1 = G1*msun/km**2/pc Nfine = 30 MtoL = 100000. # constant r0 = np.logspace(-2, 2, 10) nuanf = ga.rho_hern(r0, 1, 1) # 1/MtoL Siganf = ga.Sig_hern(r0, 1, 1) # 1/MtoL minr = min(r0) maxr = max(r0) repol = xepol = np.hstack([minr/8.,minr/4.,minr/2.,r0,2*maxr, 4*maxr, 8*maxr]) rfine = introduce_points_in_between(r0) Sigdatnu, Sigerrnu = gh.complete_nu(r0, Siganf, Siganf/20, rfine) #loglog(r0, Siganf, 'b.-') #loglog(rfine, Sigdatnu, 'r.-') loglog(r0, nuanf, 'b.-') nudatnu = gip.Sig_INT_rho(rfine, Sigdatnu, gp) loglog(rfine, nudatnu, 'r.-', lw=0.5) #nudatnuold = gip.Sig_INT_rho_buggy(rfine, Sigdatnu, gp) #negative found #loglog(rfine, nudatnuold, 'g.-') pdb.set_trace() dummy, nudatnu, nuerrnu, Mrdatnu = gip.Sig_NORM_rho(rfine, Sigdatnu, Sigerrnu, gp) #loglog(r0, nuanf, 'b.-')
def read_Sig(self, gp): for pop in np.arange(gp.pops+1): print('read_Sig on file ', gp.files.Sigfiles[pop]) Sigx, binmin, binmax, Sigdat, Sigerr = gh.readcol5(gp.files.Sigfiles[pop]) # 3*[rscale], [Sig0], [Sig0] # switch to Munit (msun) and pc here Sigx = Sigx[:] * gp.Xscale[pop] # [pc] Sigdat = Sigdat[:] * gp.Sig0pc[pop] # [Munit/pc^2] Sigerr = Sigerr[:] * gp.Sig0pc[pop] # [Munit/pc^2] # take the overall bins for rbin, binmin, binmax vals if pop == 0: self.rbin = Sigx # [pc] self.binmin = binmin * gp.Xscale[pop] # [pc] self.binmax = binmax * gp.Xscale[pop] # [pc] gp.xipol = self.rbin # [pc] minr = min(self.rbin) # [pc] maxr = max(self.rbin) # [pc] gp.xepol = np.hstack([minr/8., minr/4., minr/2., self.rbin, 2*maxr, 4*maxr, 8*maxr]) # [pc] gp.xfine = introduce_points_in_between(gp.xepol, gp) # deproject, # takes [pc], 2* [Munit/pc^2], gives [pc], 2* [Munit/pc^3], # already normalized to same total mass if gp.geom == 'sphere': Sigdatnu, Sigerrnu = gh.complete_nu(self.rbin, Sigdat, Sigerr, gp.xfine) dummyx, nudatnu, nuerrnu, Mrnu = gip.Sig_NORM_rho(gp.xfine, Sigdatnu, Sigerrnu, gp) self.nu_epol.append(gh.linipollog(gp.xfine, nudatnu, gp.xepol)) self.nuerr_epol.append(gh.linipollog(gp.xfine, nuerrnu, gp.xepol)) nudat = gh.linipollog(gp.xfine, nudatnu, gp.xipol) nuerr = gh.linipollog(gp.xfine, nuerrnu, gp.xipol) Mr = gh.linipollog(gp.xfine, Mrnu, gp.xipol) self.Mr.append(Mr) # [Munit] Mhalf = Mr[-1]/2. # [Munit] self.Mhalf.append(Mhalf) # [Munit] # spline interpolation with M as x axis, to get half-mass of system: splpar_M = splrep(np.log(Mr), np.log(self.binmax), s=0.01) r_half = np.exp(splev(np.log(Mhalf), splpar_M)) # [pc] self.rhalf.append(r_half) # [pc] # spline interpolation of nu at r_half: splpar_nu = splrep(np.log(gp.xipol), np.log(nudat), s=0.01) nuhalf = np.exp(splev(np.log(r_half), splpar_nu)) # [pc] self.nuhalf.append(nuhalf) # [Munit/pc^3] # calculate n(r) parameters as used in gi_physics from the nu(r) profile rleft = gp.xfine[gp.xfine <= r_half] rleft = rleft[::-1] rright= gp.xfine[gp.xfine > r_half] nuleft = nudatnu[gp.xfine <= r_half] nuleft = nuleft[::-1] nuright = nudatnu[gp.xfine > r_half] rlast = 1.*r_half nulast = 1.*nuhalf sloperight = [] for r0 in rright: i = np.argmin(np.abs(rright - r0)) Deltanu = -(np.log(nuright[i]) - np.log(nulast)) Deltar = np.log(rright[i]) - np.log(rlast) sloperight.append(Deltanu/Deltar) nulast = nuright[i] rlast = rright[i] rlast = 1.*r_half nulast = 1.*nuhalf slopeleft = [] # work through the array from the left, from r_half for r0 in rleft: i = np.argmin(np.abs(rleft - r0)) Deltanu = np.log(nuleft[i]) - np.log(nulast) Deltar = np.log(rlast) - np.log(rleft[i]) slopeleft.append(Deltanu/Deltar) nulast = nuleft[i] rlast = rleft[i] # inverse order of slopeleft to have it sorted according increasing r slopeleft = slopeleft[::-1] slopes = np.hstack([slopeleft, sloperight]) nrpar = 1.*slopes[:-1] # Deltalogr = np.log(gp.xfine[1:]) - np.log(gp.xfine[:-1]) # nrpar = (slopes[1:]-slopes[:-1])/Deltalogr spl_nrpar = splrep(gp.xfine[:-1], nrpar, k=1) nre = splev( gp.xipol, spl_nrpar) extleft = splev(gp.xepol[0:3], spl_nrpar) # np.array([nrpar[0], nrpar[0], nrpar[0]]) extright = splev(gp.xepol[-3:], spl_nrpar) #[nrpar[-1], nrpar[-1], nrpar[-1]]) maxnre = max(nre) self.nrnu.append(np.hstack([nuhalf, nre[0], extleft, nre, extright, nre[-1]])) # checking for correct n(r) profile, have to wait for pop==1 # if pop==1: # from pylab import plot, xscale # import gi_analytic as ga # testnu = ga.rho_gaia(gp.xfine,gp)[pop] # testnrnu = -gh.derivipol(np.log(testnu), np.log(gp.xfine)) # plot(gp.xfine, testnrnu, 'b-') # plot(gp.xfine[:-1], nrpar, 'r.-') # xscale('log') errnre = np.ones(1+len(extleft)+len(nre)+len(extright)+1)*maxnre/10. for k in np.arange(1,4): errnre[k-1] *= 5 errnre[-k] *= 5 self.nrnuerr.append(np.hstack([nuhalf/3., errnre])) # import gi_physics as phys # from pylab import loglog, axvline, axhline, plot, xscale, clf # loglog(gp.xepol, self.nu_epol[0], 'b.-', lw=1) # axvline(r_half) # axhline(nuhalf) # rh = phys.rho(gp.xepol, self.nrnu, 0, gp) # rhmin = phys.rho(gp.xepol, self.nrnu - self.nrnuerr, 0, gp) # rhmax = phys.rho(gp.xepol, self.nrnu + self.nrnuerr, 0, gp) # loglog(gp.xepol, rh, 'r.-', linewidth=2) # loglog(gp.xepol, rhmin, 'g.-') # loglog(gp.xepol, rhmax, 'g--') # clf() # plot(gp.xfine[:-1], nrpar, '.-') # plot(gp.xipol, nre, '.-') # xscale('log') # axvline(r_half) # print(nrpar) else: gh.LOG(1, 'working in disc symmetry: reading nu directly') dummy1, dummy2, dummy3, nudat, nuerr = \ gh.readcol5(gp.files.nufiles[pop]) self.nuhalf.append(nudat[round(len(nudat)/2)]) #HS ToDo: check validity of this self.Sig.append(Sigdat) # [Munit/pc^2] self.Sigerr.append(Sigerr) # [Munit/pc^2] self.barSig.append(np.mean(Sigerr)) self.nu.append(nudat) # [Munit/pc^3] self.nuerr.append(nuerr) # [Munit/pc^3] return
def read_Sig(self, gp): for pop in np.arange(gp.pops + 1): print('read_Sig on file ', gp.files.Sigfiles[pop]) Sigx, binmin, binmax, Sigdat, Sigerr = gh.readcol5( gp.files.Sigfiles[pop]) # 3*[rscale], [Sig0], [Sig0] # switch to Munit (msun) and pc here Sigx = Sigx[:] * gp.Xscale[pop] # [pc] Sigdat = Sigdat[:] * gp.Sig0pc[pop] # [Munit/pc^2] Sigerr = Sigerr[:] * gp.Sig0pc[pop] # [Munit/pc^2] # take the overall bins for rbin, binmin, binmax vals if pop == 0: self.rbin = Sigx # [pc] self.binmin = binmin * gp.Xscale[pop] # [pc] self.binmax = binmax * gp.Xscale[pop] # [pc] gp.xipol = self.rbin # [pc] minr = min(self.rbin) # [pc] maxr = max(self.rbin) # [pc] gp.xepol = np.hstack([ minr / 8., minr / 4., minr / 2., self.rbin, 2 * maxr, 4 * maxr, 8 * maxr ]) # [pc] gp.xfine = introduce_points_in_between(gp.xepol, gp) # deproject, # takes [pc], 2* [Munit/pc^2], gives [pc], 2* [Munit/pc^3], # already normalized to same total mass if gp.geom == 'sphere': Sigdatnu, Sigerrnu = gh.complete_nu(self.rbin, Sigdat, Sigerr, gp.xfine) dummyx, nudatnu, nuerrnu, Mrnu = gip.Sig_NORM_rho( gp.xfine, Sigdatnu, Sigerrnu, gp) self.nu_epol.append(gh.linipollog(gp.xfine, nudatnu, gp.xepol)) self.nuerr_epol.append( gh.linipollog(gp.xfine, nuerrnu, gp.xepol)) nudat = gh.linipollog(gp.xfine, nudatnu, gp.xipol) nuerr = gh.linipollog(gp.xfine, nuerrnu, gp.xipol) Mr = gh.linipollog(gp.xfine, Mrnu, gp.xipol) self.Mr.append(Mr) # [Munit] Mhalf = Mr[-1] / 2. # [Munit] self.Mhalf.append(Mhalf) # [Munit] # spline interpolation with M as x axis, to get half-mass of system: splpar_M = splrep(np.log(Mr), np.log(self.binmax), s=0.01) r_half = np.exp(splev(np.log(Mhalf), splpar_M)) # [pc] self.rhalf.append(r_half) # [pc] # spline interpolation of nu at r_half: splpar_nu = splrep(np.log(gp.xipol), np.log(nudat), s=0.01) nuhalf = np.exp(splev(np.log(r_half), splpar_nu)) # [pc] self.nuhalf.append(nuhalf) # [Munit/pc^3] # calculate n(r) parameters as used in gi_physics from the nu(r) profile rleft = gp.xfine[gp.xfine <= r_half] rleft = rleft[::-1] rright = gp.xfine[gp.xfine > r_half] nuleft = nudatnu[gp.xfine <= r_half] nuleft = nuleft[::-1] nuright = nudatnu[gp.xfine > r_half] rlast = 1. * r_half nulast = 1. * nuhalf sloperight = [] for r0 in rright: i = np.argmin(np.abs(rright - r0)) Deltanu = -(np.log(nuright[i]) - np.log(nulast)) Deltar = np.log(rright[i]) - np.log(rlast) sloperight.append(Deltanu / Deltar) nulast = nuright[i] rlast = rright[i] rlast = 1. * r_half nulast = 1. * nuhalf slopeleft = [] # work through the array from the left, from r_half for r0 in rleft: i = np.argmin(np.abs(rleft - r0)) Deltanu = np.log(nuleft[i]) - np.log(nulast) Deltar = np.log(rlast) - np.log(rleft[i]) slopeleft.append(Deltanu / Deltar) nulast = nuleft[i] rlast = rleft[i] # inverse order of slopeleft to have it sorted according increasing r slopeleft = slopeleft[::-1] slopes = np.hstack([slopeleft, sloperight]) nrpar = 1. * slopes[:-1] # Deltalogr = np.log(gp.xfine[1:]) - np.log(gp.xfine[:-1]) # nrpar = (slopes[1:]-slopes[:-1])/Deltalogr spl_nrpar = splrep(gp.xfine[:-1], nrpar, k=1) nre = splev(gp.xipol, spl_nrpar) extleft = splev( gp.xepol[0:3], spl_nrpar) # np.array([nrpar[0], nrpar[0], nrpar[0]]) extright = splev( gp.xepol[-3:], spl_nrpar) #[nrpar[-1], nrpar[-1], nrpar[-1]]) maxnre = max(nre) self.nrnu.append( np.hstack( [nuhalf, nre[0], extleft, nre, extright, nre[-1]])) # checking for correct n(r) profile, have to wait for pop==1 # if pop==1: # from pylab import plot, xscale # import gi_analytic as ga # testnu = ga.rho_gaia(gp.xfine,gp)[pop] # testnrnu = -gh.derivipol(np.log(testnu), np.log(gp.xfine)) # plot(gp.xfine, testnrnu, 'b-') # plot(gp.xfine[:-1], nrpar, 'r.-') # xscale('log') errnre = np.ones(1 + len(extleft) + len(nre) + len(extright) + 1) * maxnre / 10. for k in np.arange(1, 4): errnre[k - 1] *= 5 errnre[-k] *= 5 self.nrnuerr.append(np.hstack([nuhalf / 3., errnre])) # import gi_physics as phys # from pylab import loglog, axvline, axhline, plot, xscale, clf # loglog(gp.xepol, self.nu_epol[0], 'b.-', lw=1) # axvline(r_half) # axhline(nuhalf) # rh = phys.rho(gp.xepol, self.nrnu, 0, gp) # rhmin = phys.rho(gp.xepol, self.nrnu - self.nrnuerr, 0, gp) # rhmax = phys.rho(gp.xepol, self.nrnu + self.nrnuerr, 0, gp) # loglog(gp.xepol, rh, 'r.-', linewidth=2) # loglog(gp.xepol, rhmin, 'g.-') # loglog(gp.xepol, rhmax, 'g--') # clf() # plot(gp.xfine[:-1], nrpar, '.-') # plot(gp.xipol, nre, '.-') # xscale('log') # axvline(r_half) # print(nrpar) else: gh.LOG(1, 'working in disc symmetry: reading nu directly') dummy1, dummy2, dummy3, nudat, nuerr = \ gh.readcol5(gp.files.nufiles[pop]) self.nuhalf.append(nudat[round( len(nudat) / 2)]) #HS ToDo: check validity of this self.Sig.append(Sigdat) # [Munit/pc^2] self.Sigerr.append(Sigerr) # [Munit/pc^2] self.barSig.append(np.mean(Sigerr)) self.nu.append(nudat) # [Munit/pc^3] self.nuerr.append(nuerr) # [Munit/pc^3] return