Exemplo n.º 1
0
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.-')
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
    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