def plot_rotcurve_samples(options=None,args=None):
    """Plot sample rotation curves"""
    options= set_options(options)
    params= numpy.random.permutation(load_samples(args[0]))
    rotcurves= []
    rs= numpy.linspace(3.5,16.,1001)
    add= 0
    if options.nooutliermean: add-= 1
    if not options.dwarf: add-= 1
    for ii in range(options.nsamples):
        if options.rotcurve.lower() == 'flat':
            thisrc= params[ii][0]*rs**0.*_REFV0
        elif options.rotcurve.lower() == 'powerlaw':
            thisrc= params[ii][0]*(rs/_REFR0/params[ii][1])**params[ii][6+add]*_REFV0
        elif options.rotcurve.lower() == 'linear':
            thisrc= (params[ii][0]+params[ii][6+add]*(rs/_REFR0/params[ii][1]-1.))*_REFV0
        elif options.rotcurve.lower() == 'quadratic':
            thisrc= (params[ii][0]+params[ii][6+add]*(rs/_REFR0/params[ii][1]-1.)+params[ii][7+add]*(rs/_REFR0/params[ii][1]-1)**2.)*_REFV0
        elif options.rotcurve.lower() == 'cubic':
            thisrc= (params[ii][0]+params[ii][6+add]*(rs/_REFR0/params[ii][1]-1)+params[ii][7+add]*(rs/_REFR0/params[ii][1]-1.)**2.+params[ii][8+add]*(rs/_REFR0/params[ii][1]-1.)**3.)*_REFV0
        rotcurves.append(thisrc)
    bovy_plot.bovy_print(fig_width=8.)
    ii= 0
    bovy_plot.bovy_plot(rs,rotcurves[ii],'-',color='0.65',
                        xlabel=r'$R\ [\mathrm{kpc}]$',
                        ylabel=r'$V_c\ [\mathrm{km\ s}^{-1}]$',
                        xrange=[0.,20.],
                        yrange=[150.,300.])
    for ii in range(1,options.nsamples):
        bovy_plot.bovy_plot(rs,rotcurves[ii],'-',color='0.65',overplot=True,alpha=0.1)
    if _PLOTM31:
        #Read file
        m31data= numpy.loadtxt('../data/m31.dat',comments='#')
        rm31= m31data[:,0]
        vcm31= m31data[:,1]
        bovy_plot.bovy_plot(rm31,vcm31,'ks',overplot=True,mfc='none',mew=2.)
        bovy_plot.bovy_text(17.,260.,r'$\mathrm{M31}$',size=14.)
        indx= (rm31 > 15.2)*(rm31 <= 16.8)
        bovy_plot.bovy_plot([17.,rm31[indx]],[260.,vcm31[indx]],'k-',
                            overplot=True)
    bovy_plot.bovy_end_print(options.plotfilename)
    return None
Example #2
0
def plot_rotcurve_samples(options=None, args=None):
    """Plot sample rotation curves"""
    options = set_options(options)
    params = numpy.random.permutation(load_samples(args[0]))
    rotcurves = []
    rs = numpy.linspace(3.5, 16., 1001)
    add = 0
    if options.nooutliermean: add -= 1
    if not options.dwarf: add -= 1
    for ii in range(options.nsamples):
        if options.rotcurve.lower() == 'flat':
            thisrc = params[ii][0] * rs**0. * _REFV0
        elif options.rotcurve.lower() == 'powerlaw':
            thisrc = params[ii][0] * (
                rs / _REFR0 / params[ii][1])**params[ii][6 + add] * _REFV0
        elif options.rotcurve.lower() == 'linear':
            thisrc = (params[ii][0] + params[ii][6 + add] *
                      (rs / _REFR0 / params[ii][1] - 1.)) * _REFV0
        elif options.rotcurve.lower() == 'quadratic':
            thisrc = (params[ii][0] + params[ii][6 + add] *
                      (rs / _REFR0 / params[ii][1] - 1.) +
                      params[ii][7 + add] *
                      (rs / _REFR0 / params[ii][1] - 1)**2.) * _REFV0
        elif options.rotcurve.lower() == 'cubic':
            thisrc = (params[ii][0] + params[ii][6 + add] *
                      (rs / _REFR0 / params[ii][1] - 1) + params[ii][7 + add] *
                      (rs / _REFR0 / params[ii][1] - 1.)**2. +
                      params[ii][8 + add] *
                      (rs / _REFR0 / params[ii][1] - 1.)**3.) * _REFV0
        rotcurves.append(thisrc)
    bovy_plot.bovy_print(fig_width=8.)
    ii = 0
    bovy_plot.bovy_plot(rs,
                        rotcurves[ii],
                        '-',
                        color='0.65',
                        xlabel=r'$R\ [\mathrm{kpc}]$',
                        ylabel=r'$V_c\ [\mathrm{km\ s}^{-1}]$',
                        xrange=[0., 20.],
                        yrange=[150., 300.])
    for ii in range(1, options.nsamples):
        bovy_plot.bovy_plot(rs,
                            rotcurves[ii],
                            '-',
                            color='0.65',
                            overplot=True,
                            alpha=0.1)
    if _PLOTM31:
        #Read file
        m31data = numpy.loadtxt('../data/m31.dat', comments='#')
        rm31 = m31data[:, 0]
        vcm31 = m31data[:, 1]
        bovy_plot.bovy_plot(rm31,
                            vcm31,
                            'ks',
                            overplot=True,
                            mfc='none',
                            mew=2.)
        bovy_plot.bovy_text(17., 260., r'$\mathrm{M31}$', size=14.)
        indx = (rm31 > 15.2) * (rm31 <= 16.8)
        bovy_plot.bovy_plot([17., rm31[indx]], [260., vcm31[indx]],
                            'k-',
                            overplot=True)
    bovy_plot.bovy_end_print(options.plotfilename)
    return None
Example #3
0
def plot_rovo(filename, plotfilename):
    if not os.path.exists(filename):
        raise IOError("given filename does not exist")
    savefile = open(filename, 'rb')
    params = pickle.load(savefile)
    savefile.close()
    if _ANALYTIC:  #Calculate by fixing everything except for Ro anv vo
        options = plot_pdfs.set_options(None)
        nros = 15
        noos = 15
        ros = numpy.linspace(7., 13., nros)
        oos = numpy.linspace(20., 30., noos)
        ll = numpy.zeros((noos, nros))
        for ii in range(noos):
            if not _MULTI is None:
                theseparamss = []
                for jj in range(nros):
                    theseparams = copy.copy(params)
                    theseparams[0] = oos[ii] * ros[jj] / _REFV0
                    theseparams[1] = ros[jj] / _REFR0
                    theseparamss.append(theseparams)
                thisll = multi.parallel_map(
                    (lambda x: numpy.sum(
                        logl.logl(init=theseparamss[x], options=options))),
                    range(nros),
                    numcores=numpy.amin(
                        [nros, _MULTI,
                         multiprocessing.cpu_count()]))
                ll[ii, :] = thisll
            else:
                for jj in range(nros):
                    theseparams = copy.copy(params)
                    theseparams[0] = oos[ii] * ros[jj] / _REFV0
                    theseparams[1] = ros[jj] / _REFR0
                    ll[ii, jj] = numpy.sum(
                        logl.logl(init=theseparams, options=options))
        #Normalize
        ll -= logsumexp(ll)
        ll = numpy.exp(ll)
        levels = list(special.erf(0.5 * numpy.arange(1, 4)))
        bovy_plot.bovy_dens2d(
            ll.T,
            origin='lower',
            levels=levels,
            xlabel=r'$\Omega_0\ [\mathrm{km\ s}^{-1}\ \mathrm{kpc}^{-1}]$',
            ylabel=r'$R_0\ [\mathrm{kpc}]$',
            xrange=[20., 35.],
            yrange=[7., 13.],
            contours=True,
            cntrcolors='k',
            onedhists=True,
            cmap='gist_yarg')
    else:
        vos = numpy.array([s[0] for s in params]) * _REFV0
        ros = numpy.array([s[1] for s in params]) * _REFR0
        bovy_plot.bovy_print()
        levels = list(special.erf(0.5 * numpy.arange(1, 4)))
        levels.append(1.01)  #HACK to not plot outliers
        bovy_plot.scatterplot(
            vos / ros,
            ros,
            'k,',
            levels=levels,
            xlabel=r'$\Omega_0\ [\mathrm{km\ s}^{-1}\ \mathrm{kpc}^{-1}]$',
            ylabel=r'$R_0\ [\mathrm{kpc}]$',
            bins=31,
            xrange=[200. / 8., 250. / 8.],
            yrange=[7., 9.],
            contours=True,
            cntrcolors='k',
            onedhists=True,
            cmap='gist_yarg')
    bovy_plot.bovy_end_print(plotfilename)
Example #4
0
def mockTable(parser):
    (options, args) = parser.parse_args()
    cmdline = '%python mockTable.py ' + args[0]
    if len(args) == 0:
        parser.print_help()
        return
    #Open savefile for flat fit and samples
    savefile = open(_FLATFIT, 'rb')
    flatparams = pickle.load(savefile)
    savefile.close()
    savefile = open(_FLATSAMPLES, 'rb')
    flatsamples = pickle.load(savefile)
    savefile.close()
    #Open savefile for all mocks' fit and samples
    mockparams = []
    mocksamples = []
    for ii in range(_NMOCKS):
        savefile = open(_MOCKFIT[ii], 'rb')
        mockparams.append(pickle.load(savefile))
        savefile.close()
        savefile = open(_MOCKSAMPLES[ii], 'rb')
        mocksamples.append(pickle.load(savefile))
        savefile.close()
    #Set up sections
    names = [
        '$V_c(R_0)\ [\mathrm{km\ s}^{-1}]$', '$R_0\ [\mathrm{kpc}]$',
        '$V_{R,\odot}\ [\mathrm{km\ s}^{-1}]$',
        '$\Omega_{\odot}\ [\mathrm{km\ s}^{-1}\ \mathrm{kpc}^{-1}]$',
        '$\\sigma_R(R_0)\ [\mathrm{km\ s}^{-1}]$', '$R_0/h_\sigma$',
        '$X^2 \equiv \sigma_\phi^2 / \sigma_R^2$',
        '$\Delta\chi^2/\mathrm{dof}$'
    ]
    scale = [_REFV0, _REFR0, _VRSUN, 1., _REFV0, 1., 1., 1.]
    flatbestfits = []
    flatxs = []
    mockbestfits = []
    mockxs = []
    #V_c
    flatbestfits.append(flatparams[0])
    flatxs.append(numpy.array([s[0] for s in flatsamples]))
    #R_0
    flatbestfits.append(flatparams[1])
    flatxs.append(numpy.array([s[1] for s in flatsamples]))
    #VRsun
    flatbestfits.append(flatparams[6])
    flatxs.append(numpy.array([s[6] for s in flatsamples]))
    #Omega_sun
    flatbestfits.append(flatparams[7] * _PMSGRA)
    flatxs.append(numpy.array([s[7] * _PMSGRA for s in flatsamples]))
    #\sigma_R(R_0)
    flatbestfits.append(numpy.exp(flatparams[2]))
    flatxs.append(numpy.exp(numpy.array([s[2] for s in flatsamples])))
    #R_0/h_sigma
    flatbestfits.append(flatparams[1] * flatparams[9])
    flatxs.append(numpy.array([s[1] * s[9] for s in flatsamples]))
    #X^2
    flatbestfits.append(flatparams[8])
    flatxs.append(numpy.array([s[8] for s in flatsamples]))
    #chi2
    options = set_options(None)
    data = readVclosData(validfeh=True)
    options.isofile = '../fits/isos.dat'
    thislogl = logl.logl(init=flatparams, options=options, data=data)
    flatbestfits.append(-2. * numpy.sum(thislogl) /
                        (len(data) - len(flatparams)))
    if _INDIVCHI2:
        locs = numpy.array(sorted(list(set(data['LOCATION']))))
        nlocs = len(locs)
        platel = numpy.zeros(nlocs)
        for ii in range(nlocs):
            indx = (data['LOCATION'] == locs[ii])
            platel[ii] = numpy.mean(data['GLON'][indx])
            sortindx = numpy.argsort(platel)
            locs = locs[sortindx]
            platel = platel[sortindx]

            for jj in range(len(locs)):
                names.append(
                    '$\Delta\chi^2/\mathrm{dof}\ \mathrm{w/o}\ l=%i^\circ$' %
                    int(round(platel[jj])))
                scale.append(1.)
                indx = (data['LOCATION'] != locs[jj])
                flatbestfits.append(-2. * numpy.sum(thislogl[indx]) /
                                    (len(data[indx]) - len(flatparams)))
    else:
        locs = []
    ##Same for all mocks
    for ii in range(_NMOCKS):
        thisbestfits = []
        thisxs = []
        #V_c
        thisbestfits.append(mockparams[ii][0])
        thisxs.append(numpy.array([s[0] for s in mocksamples[ii]]))
        #R_0
        thisbestfits.append(mockparams[ii][1])
        thisxs.append(numpy.array([s[1] for s in mocksamples[ii]]))
        #VRsun
        thisbestfits.append(mockparams[ii][6])
        thisxs.append(numpy.array([s[6] for s in mocksamples[ii]]))
        #Omega_sun
        thisbestfits.append(mockparams[ii][7] * _PMSGRA)
        thisxs.append(numpy.array([s[7] * _PMSGRA for s in mocksamples[ii]]))
        #\sigma_R(R_0)
        thisbestfits.append(numpy.exp(mockparams[ii][2]))
        thisxs.append(numpy.exp(numpy.array([s[2] for s in mocksamples[ii]])))
        #R_0/h_sigma
        thisbestfits.append(mockparams[ii][1] * mockparams[ii][9])
        thisxs.append(numpy.array([s[1] * s[9] for s in mocksamples[ii]]))
        #X^2
        thisbestfits.append(mockparams[ii][8])
        thisxs.append(numpy.array([s[8] for s in mocksamples[ii]]))
        #chi2
        #Load mock data
        data = readVclosData(datafilename=_MOCKDATA[ii])
        thislogl = logl.logl(init=mockparams[ii], data=data, options=options)
        thisbestfits.append(-2. * numpy.sum(thislogl) /
                            (len(data) - len(mockparams[ii])))
        if _INDIVCHI2:
            for jj in range(len(locs)):
                indx = (data['LOCATION'] != locs[jj])
                thisbestfits.append(-2. * numpy.sum(thislogl[indx]) /
                                    (len(data[indx]) - len(mockparams)))
        #Append all
        mockbestfits.append(thisbestfits)
        mockxs.append(thisxs)
    #Make table
    quantile = 0.68
    outfile = open(args[0], 'w')
    for ii in range(len(names)):
        #Set up line
        printline = names[ii]
        #Flat
        printline += ' & '
        if ii >= len(names) - (len(locs) + 1):  #chi2
            printline += ' \ldots & '
        else:
            bestfit = flatbestfits[ii] * scale[ii]
            xs = flatxs[ii] * scale[ii]
            lowval, highval = sixtyeigthinterval(bestfit,
                                                 xs,
                                                 quantile=quantile)
            dlow, dhigh = bestfit - lowval, highval - bestfit
            #Prepare
            maxerr = numpy.amin(numpy.fabs([dlow, dhigh]))
            print names[ii], maxerr
            if math.log10(maxerr) >= 0.:
                value = '$%.0f$' % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 1.:
                    err = '$\pm$%.0f' % ((dlow + dhigh) / 2.)
                else:
                    err = '$^{+%.0f}_{-%.0f}$' % (dhigh, dlow)
            elif math.log10(maxerr) >= -1.:
                value = '$%.1f$' % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.1:
                    err = '$\pm$%.1f' % ((dlow + dhigh) / 2.)
                else:
                    err = '$^{+%.1f}_{-%.1f}$' % (dhigh, dlow)
            elif math.log10(maxerr) >= -2.:
                value = '$%.2f$' % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.01:
                    err = '$\pm$%.2f' % ((dlow + dhigh) / 2.)
                else:
                    err = '$^{+%.2f}_{-%.2f}$' % (dhigh, dlow)
            elif math.log10(maxerr) >= -3.:
                value = '$%.3f$' % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.001:
                    err = '$\pm$%.3f' % ((dlow + dhigh) / 2.)
                else:
                    err = '$^{+%.3f}_{-%.3f}$' % (dhigh, dlow)
            else:
                value = '$%.4f$' % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.0001:
                    err = '$\pm$%.4f' % ((dlow + dhigh) / 2.)
                else:
                    err = '$^{+%.4f}_{-%.4f}$' % (dhigh, dlow)
            printline += value + '&' + err
        #Mocks
        for jj in range(_NMOCKS):
            printline += ' & '
            if ii >= len(names) - (len(locs) + 1):  #chi2
                bestfit = mockbestfits[jj][ii] * scale[ii] - flatbestfits[
                    ii] * scale[ii]
                printline += '$%.2f$ & ' % bestfit
                if jj == _NMOCKS - 1:
                    if not ii == (len(names) - 1):
                        printline += '\\\\'
                    outfile.write(printline + '\n')
                continue
            bestfit = mockbestfits[jj][ii] * scale[ii]
            xs = mockxs[jj][ii] * scale[ii]
            lowval, highval = sixtyeigthinterval(bestfit,
                                                 xs,
                                                 quantile=quantile)
            dlow, dhigh = bestfit - lowval, highval - bestfit
            #Prepare
            maxerr = numpy.amin(numpy.fabs([dlow, dhigh]))
            if math.log10(maxerr) >= 0.:
                value = '$%.0f$' % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 1.:
                    err = '$\pm$%.0f' % ((dlow + dhigh) / 2.)
                else:
                    err = '$^{+%.0f}_{-%.0f}$' % (dhigh, dlow)
            elif math.log10(maxerr) >= -1.:
                value = '$%.1f$' % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.1:
                    err = '$\pm$%.1f' % ((dlow + dhigh) / 2.)
                else:
                    err = '$^{+%.1f}_{-%.1f}$' % (dhigh, dlow)
            elif math.log10(maxerr) >= -2.:
                value = '$%.2f$' % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.01:
                    err = '$\pm$%.2f' % ((dlow + dhigh) / 2.)
                else:
                    err = '$^{+%.2f}_{-%.2f}$' % (dhigh, dlow)
            elif math.log10(maxerr) >= -3.:
                value = '$%.3f$' % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.001:
                    err = '$\pm$%.3f' % ((dlow + dhigh) / 2.)
                else:
                    err = '$^{+%.3f}_{-%.3f}$' % (dhigh, dlow)
            else:
                value = '$%.4f$' % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.0001:
                    err = '$\pm$%.4f' % ((dlow + dhigh) / 2.)
                else:
                    err = '$^{+%.4f}_{-%.4f}$' % (dhigh, dlow)
            printline += value + '&' + err
        if not ii == (len(names) - 1):
            printline += '\\\\'
        if ii == (len(names) - (len(locs) + 2)):
            printline += '\\\\'
        if ii < (len(names) - (len(locs) + 1)):
            outfile.write(printline + '\n')
    outfile.write('\\enddata\n')
    outfile.write(cmdline + '\n')
    outfile.close()
Example #5
0
def plot_rovo(filename,plotfilename):
    if not os.path.exists(filename):
        raise IOError("given filename does not exist")
    savefile= open(filename,'rb')
    params= pickle.load(savefile)
    savefile.close()
    if _ANALYTIC: #Calculate by fixing everything except for Ro anv vo
        options= plot_pdfs.set_options(None)
        nros= 15
        noos= 15
        ros= numpy.linspace(7.,13.,nros)
        oos= numpy.linspace(20.,30.,noos)
        ll= numpy.zeros((noos,nros))
        for ii in range(noos):
            if not _MULTI is None:
                theseparamss= []
                for jj in range(nros):
                    theseparams= copy.copy(params)
                    theseparams[0]= oos[ii]*ros[jj]/_REFV0
                    theseparams[1]= ros[jj]/_REFR0
                    theseparamss.append(theseparams)
                thisll= multi.parallel_map((lambda x: numpy.sum(logl.logl(init=theseparamss[x],options=options))),
                                           range(nros),
                                           numcores=numpy.amin([nros,_MULTI,multiprocessing.cpu_count()]))
                ll[ii,:]= thisll
            else:
                for jj in range(nros):
                    theseparams= copy.copy(params)
                    theseparams[0]= oos[ii]*ros[jj]/_REFV0
                    theseparams[1]= ros[jj]/_REFR0
                    ll[ii,jj]= numpy.sum(logl.logl(init=theseparams,
                                                   options=options))
        #Normalize
        ll-= logsumexp(ll)
        ll= numpy.exp(ll)
        levels= list(special.erf(0.5*numpy.arange(1,4)))
        bovy_plot.bovy_dens2d(ll.T,origin='lower',levels=levels,
                              xlabel=r'$\Omega_0\ [\mathrm{km\ s}^{-1}\ \mathrm{kpc}^{-1}]$',
                              ylabel=r'$R_0\ [\mathrm{kpc}]$',
                              xrange=[20.,35.],
                              yrange=[7.,13.],
                              contours=True,
                              cntrcolors='k',
                              onedhists=True,
                              cmap='gist_yarg')
    else:
        vos= numpy.array([s[0] for s in params])*_REFV0
        ros= numpy.array([s[1] for s in params])*_REFR0
        bovy_plot.bovy_print()
        levels= list(special.erf(0.5*numpy.arange(1,4)))
        levels.append(1.01) #HACK to not plot outliers
        bovy_plot.scatterplot(vos/ros,ros,'k,',levels=levels,
                              xlabel=r'$\Omega_0\ [\mathrm{km\ s}^{-1}\ \mathrm{kpc}^{-1}]$',
                              ylabel=r'$R_0\ [\mathrm{kpc}]$',
                              bins=31,
                              xrange=[200./8.,250./8.],
                              yrange=[7.,9.],
                              contours=True,
                              cntrcolors='k',
                              onedhists=True,
                              cmap='gist_yarg')
    bovy_plot.bovy_end_print(plotfilename)
def plot_rotcurve_samples(options=None,args=None):
    """Plot sample rotation curves"""
    options= set_options(options)
    params= numpy.random.permutation(load_samples(args[0]))
    if options.removerooutliers:
        indx= numpy.zeros(len(params),dtype='bool')
        indx[:]= True
        for ii in range(len(params)):
            if params[ii][1] > (9./_REFR0): indx[ii]= False
        params= params[indx]
        options.nsamples= numpy.amin([options.nsamples,len(params)])
        print len(params)
    bestfitparams= load_samples(args[1])
    rotcurves= []
    rs= numpy.linspace(3.5,14.,1001)
    fs= numpy.zeros((len(rs),options.nsamples))
    besfitrc= numpy.zeros_like(rs)
    add= 0
    if options.nooutliermean: add-= 1
    if not options.dwarf: add-= 1
    if options.rotcurve.lower() == 'flat':
        bestfitrc= bestfitparams[0]*rs**0.*_REFV0
    elif options.rotcurve.lower() == 'powerlaw':
        bestfitrc= bestfitparams[0]*(rs/_REFR0/bestfitparams[1])**bestfitparams[6+add]*_REFV0
    elif options.rotcurve.lower() == 'linear':
        bestfitrc= (bestfitparams[0]+bestfitparams[6+add]*(rs/_REFR0/bestfitparams[1]-1.))*_REFV0
    elif options.rotcurve.lower() == 'quadratic':
        bestfitrc= (bestfitparams[0]+bestfitparams[6+add]*(rs/_REFR0/bestfitparams[1]-1.)+bestfitparams[7+add]*(rs/_REFR0/bestfitparams[1]-1)**2.)*_REFV0
    elif options.rotcurve.lower() == 'cubic':
        bestfitrc= (bestfitparams[0]+bestfitparams[6+add]*(rs/_REFR0/bestfitparams[1]-1)+bestfitparams[7+add]*(rs/_REFR0/bestfitparams[1]-1.)**2.+bestfitparams[8+add]*(rs/_REFR0/bestfitparams[1]-1.)**3.)*_REFV0
    for ii in range(options.nsamples):
        if options.rotcurve.lower() == 'flat':
            thisrc= params[ii][0]*rs**0.*_REFV0
        elif options.rotcurve.lower() == 'powerlaw':
            thisrc= params[ii][0]*(rs/_REFR0/params[ii][1])**params[ii][6+add]*_REFV0
        elif options.rotcurve.lower() == 'linear':
            thisrc= (params[ii][0]+params[ii][6+add]*(rs/_REFR0/params[ii][1]-1.))*_REFV0
        elif options.rotcurve.lower() == 'quadratic':
            thisrc= (params[ii][0]+params[ii][6+add]*(rs/_REFR0/params[ii][1]-1.)+params[ii][7+add]*(rs/_REFR0/params[ii][1]-1)**2.)*_REFV0
        elif options.rotcurve.lower() == 'cubic':
            thisrc= (params[ii][0]+params[ii][6+add]*(rs/_REFR0/params[ii][1]-1)+params[ii][7+add]*(rs/_REFR0/params[ii][1]-1.)**2.+params[ii][8+add]*(rs/_REFR0/params[ii][1]-1.)**3.)*_REFV0
        fs[:,ii]= thisrc
    #Now plot the mean and std-dev from the posterior
    rcmean= numpy.zeros(len(rs))
    nsigs= 3
    rcsigs= numpy.zeros((len(rs),2*nsigs))
    #Record mean and std-devs
    rcmean[:]= numpy.mean(fs,axis=1)
    bovy_plot.bovy_print(fig_width=8.)
    bovy_plot.bovy_plot(rs,bestfitrc,'k-',
                        xlabel=r'$R\ [\mathrm{kpc}]$',
                        ylabel=r'$V_c\ [\mathrm{km\ s}^{-1}]$',
                        xrange=[0.,20.],
                        yrange=[150.,300.])
    for ii in range(nsigs):
        for jj in range(len(rs)):
            thisf= sorted(fs[jj,:])
            thiscut= 0.5*special.erfc((ii+1.)/math.sqrt(2.))
            rcsigs[jj,2*ii]= thisf[int(math.floor(thiscut*options.nsamples))]
            thiscut= 1.-thiscut
            rcsigs[jj,2*ii+1]= thisf[int(math.floor(thiscut*options.nsamples))]
    colord, cc= (1.-0.75)/(nsigs+1.), 1
    nsigma= nsigs
    pyplot.fill_between(rs,rcsigs[:,0],rcsigs[:,1],color='0.75')
    while nsigma > 1:
        pyplot.fill_between(rs,rcsigs[:,cc+1],rcsigs[:,cc-1],
                            color='%f' % (.75+colord*cc))
        pyplot.fill_between(rs,rcsigs[:,cc],rcsigs[:,cc+2],
                            color='%f' % (.75+colord*cc))
        cc+= 2
        nsigma-= 1
    bovy_plot.bovy_plot(rs,bestfitrc,'k-',overplot=True)
    if options.plotm31:
        #Read file
        m31data= numpy.loadtxt('../data/m31.dat',comments='#')
        rm31= m31data[:,0]
        vcm31= m31data[:,1]
        bovy_plot.bovy_plot(rm31,vcm31,'ks',overplot=True,mfc='none',mew=2.)
        bovy_plot.bovy_text(17.,260.,r'$\mathrm{M31}$',size=14.)
        indx= (rm31 > 15.2)*(rm31 <= 16.8)
        bovy_plot.bovy_plot([17.,rm31[indx]],[260.,vcm31[indx]],'k-',
                            overplot=True)
    #Labels
    if options.rotcurve.lower() == 'flat':
        print "This is silly"
    elif options.rotcurve.lower() == 'powerlaw':
        bovy_plot.bovy_text(r'$\mathrm{Power\!\!-\!\!law\ rotation\ curve\ model}$',
                            top_left=True,size=16.)
    elif options.rotcurve.lower() == 'linear':
        bovy_plot.bovy_text(r'$\mathrm{Linearly rising\ rotation\ curve\ model}$',
                            top_left=True,size=16.)
    elif options.rotcurve.lower() == 'quadratic':
        bovy_plot.bovy_text(r'$\mathrm{Quadratic polynomial\ rotation\ curve\ model}$',
                            top_left=True,size=16.)
    elif options.rotcurve.lower() == 'cubic':
        bovy_plot.bovy_text(r'$\mathrm{Cubic\ polynomial\ rotation\ curve\ model}$',
                            top_left=True,size=16.)
    if options.removerooutliers:
        bovy_plot.bovy_text(r'$R_0 < 9\,\mathrm{kpc}$',
                            top_right=True,size=16.)
        
    if options.addmock2:
        bovy_plot.bovy_text(r'$\mathrm{Mock\ 2}$',
                            bottom_right=True,size=16.)
        
    bovy_plot.bovy_end_print(options.plotfilename)
    return None
Example #7
0
def mockTable(parser):
    (options, args) = parser.parse_args()
    cmdline = "%python mockTable.py " + args[0]
    if len(args) == 0:
        parser.print_help()
        return
    # Open savefile for flat fit and samples
    savefile = open(_FLATFIT, "rb")
    flatparams = pickle.load(savefile)
    savefile.close()
    savefile = open(_FLATSAMPLES, "rb")
    flatsamples = pickle.load(savefile)
    savefile.close()
    # Open savefile for all mocks' fit and samples
    mockparams = []
    mocksamples = []
    for ii in range(_NMOCKS):
        savefile = open(_MOCKFIT[ii], "rb")
        mockparams.append(pickle.load(savefile))
        savefile.close()
        savefile = open(_MOCKSAMPLES[ii], "rb")
        mocksamples.append(pickle.load(savefile))
        savefile.close()
    # Set up sections
    names = [
        "$V_c(R_0)\ [\mathrm{km\ s}^{-1}]$",
        "$R_0\ [\mathrm{kpc}]$",
        "$V_{R,\odot}\ [\mathrm{km\ s}^{-1}]$",
        "$\Omega_{\odot}\ [\mathrm{km\ s}^{-1}\ \mathrm{kpc}^{-1}]$",
        "$\\sigma_R(R_0)\ [\mathrm{km\ s}^{-1}]$",
        "$R_0/h_\sigma$",
        "$X^2 \equiv \sigma_\phi^2 / \sigma_R^2$",
        "$\Delta\chi^2/\mathrm{dof}$",
    ]
    scale = [_REFV0, _REFR0, _VRSUN, 1.0, _REFV0, 1.0, 1.0, 1.0]
    flatbestfits = []
    flatxs = []
    mockbestfits = []
    mockxs = []
    # V_c
    flatbestfits.append(flatparams[0])
    flatxs.append(numpy.array([s[0] for s in flatsamples]))
    # R_0
    flatbestfits.append(flatparams[1])
    flatxs.append(numpy.array([s[1] for s in flatsamples]))
    # VRsun
    flatbestfits.append(flatparams[6])
    flatxs.append(numpy.array([s[6] for s in flatsamples]))
    # Omega_sun
    flatbestfits.append(flatparams[7] * _PMSGRA)
    flatxs.append(numpy.array([s[7] * _PMSGRA for s in flatsamples]))
    # \sigma_R(R_0)
    flatbestfits.append(numpy.exp(flatparams[2]))
    flatxs.append(numpy.exp(numpy.array([s[2] for s in flatsamples])))
    # R_0/h_sigma
    flatbestfits.append(flatparams[1] * flatparams[9])
    flatxs.append(numpy.array([s[1] * s[9] for s in flatsamples]))
    # X^2
    flatbestfits.append(flatparams[8])
    flatxs.append(numpy.array([s[8] for s in flatsamples]))
    # chi2
    options = set_options(None)
    data = readVclosData(validfeh=True)
    options.isofile = "../fits/isos.dat"
    thislogl = logl.logl(init=flatparams, options=options, data=data)
    flatbestfits.append(-2.0 * numpy.sum(thislogl) / (len(data) - len(flatparams)))
    if _INDIVCHI2:
        locs = numpy.array(sorted(list(set(data["LOCATION"]))))
        nlocs = len(locs)
        platel = numpy.zeros(nlocs)
        for ii in range(nlocs):
            indx = data["LOCATION"] == locs[ii]
            platel[ii] = numpy.mean(data["GLON"][indx])
            sortindx = numpy.argsort(platel)
            locs = locs[sortindx]
            platel = platel[sortindx]

            for jj in range(len(locs)):
                names.append("$\Delta\chi^2/\mathrm{dof}\ \mathrm{w/o}\ l=%i^\circ$" % int(round(platel[jj])))
                scale.append(1.0)
                indx = data["LOCATION"] != locs[jj]
                flatbestfits.append(-2.0 * numpy.sum(thislogl[indx]) / (len(data[indx]) - len(flatparams)))
    else:
        locs = []
    ##Same for all mocks
    for ii in range(_NMOCKS):
        thisbestfits = []
        thisxs = []
        # V_c
        thisbestfits.append(mockparams[ii][0])
        thisxs.append(numpy.array([s[0] for s in mocksamples[ii]]))
        # R_0
        thisbestfits.append(mockparams[ii][1])
        thisxs.append(numpy.array([s[1] for s in mocksamples[ii]]))
        # VRsun
        thisbestfits.append(mockparams[ii][6])
        thisxs.append(numpy.array([s[6] for s in mocksamples[ii]]))
        # Omega_sun
        thisbestfits.append(mockparams[ii][7] * _PMSGRA)
        thisxs.append(numpy.array([s[7] * _PMSGRA for s in mocksamples[ii]]))
        # \sigma_R(R_0)
        thisbestfits.append(numpy.exp(mockparams[ii][2]))
        thisxs.append(numpy.exp(numpy.array([s[2] for s in mocksamples[ii]])))
        # R_0/h_sigma
        thisbestfits.append(mockparams[ii][1] * mockparams[ii][9])
        thisxs.append(numpy.array([s[1] * s[9] for s in mocksamples[ii]]))
        # X^2
        thisbestfits.append(mockparams[ii][8])
        thisxs.append(numpy.array([s[8] for s in mocksamples[ii]]))
        # chi2
        # Load mock data
        data = readVclosData(datafilename=_MOCKDATA[ii])
        thislogl = logl.logl(init=mockparams[ii], data=data, options=options)
        thisbestfits.append(-2.0 * numpy.sum(thislogl) / (len(data) - len(mockparams[ii])))
        if _INDIVCHI2:
            for jj in range(len(locs)):
                indx = data["LOCATION"] != locs[jj]
                thisbestfits.append(-2.0 * numpy.sum(thislogl[indx]) / (len(data[indx]) - len(mockparams)))
        # Append all
        mockbestfits.append(thisbestfits)
        mockxs.append(thisxs)
    # Make table
    quantile = 0.68
    outfile = open(args[0], "w")
    for ii in range(len(names)):
        # Set up line
        printline = names[ii]
        # Flat
        printline += " & "
        if ii >= len(names) - (len(locs) + 1):  # chi2
            printline += " \ldots & "
        else:
            bestfit = flatbestfits[ii] * scale[ii]
            xs = flatxs[ii] * scale[ii]
            lowval, highval = sixtyeigthinterval(bestfit, xs, quantile=quantile)
            dlow, dhigh = bestfit - lowval, highval - bestfit
            # Prepare
            maxerr = numpy.amin(numpy.fabs([dlow, dhigh]))
            print names[ii], maxerr
            if math.log10(maxerr) >= 0.0:
                value = "$%.0f$" % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 1.0:
                    err = "$\pm$%.0f" % ((dlow + dhigh) / 2.0)
                else:
                    err = "$^{+%.0f}_{-%.0f}$" % (dhigh, dlow)
            elif math.log10(maxerr) >= -1.0:
                value = "$%.1f$" % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.1:
                    err = "$\pm$%.1f" % ((dlow + dhigh) / 2.0)
                else:
                    err = "$^{+%.1f}_{-%.1f}$" % (dhigh, dlow)
            elif math.log10(maxerr) >= -2.0:
                value = "$%.2f$" % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.01:
                    err = "$\pm$%.2f" % ((dlow + dhigh) / 2.0)
                else:
                    err = "$^{+%.2f}_{-%.2f}$" % (dhigh, dlow)
            elif math.log10(maxerr) >= -3.0:
                value = "$%.3f$" % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.001:
                    err = "$\pm$%.3f" % ((dlow + dhigh) / 2.0)
                else:
                    err = "$^{+%.3f}_{-%.3f}$" % (dhigh, dlow)
            else:
                value = "$%.4f$" % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.0001:
                    err = "$\pm$%.4f" % ((dlow + dhigh) / 2.0)
                else:
                    err = "$^{+%.4f}_{-%.4f}$" % (dhigh, dlow)
            printline += value + "&" + err
        # Mocks
        for jj in range(_NMOCKS):
            printline += " & "
            if ii >= len(names) - (len(locs) + 1):  # chi2
                bestfit = mockbestfits[jj][ii] * scale[ii] - flatbestfits[ii] * scale[ii]
                printline += "$%.2f$ & " % bestfit
                if jj == _NMOCKS - 1:
                    if not ii == (len(names) - 1):
                        printline += "\\\\"
                    outfile.write(printline + "\n")
                continue
            bestfit = mockbestfits[jj][ii] * scale[ii]
            xs = mockxs[jj][ii] * scale[ii]
            lowval, highval = sixtyeigthinterval(bestfit, xs, quantile=quantile)
            dlow, dhigh = bestfit - lowval, highval - bestfit
            # Prepare
            maxerr = numpy.amin(numpy.fabs([dlow, dhigh]))
            if math.log10(maxerr) >= 0.0:
                value = "$%.0f$" % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 1.0:
                    err = "$\pm$%.0f" % ((dlow + dhigh) / 2.0)
                else:
                    err = "$^{+%.0f}_{-%.0f}$" % (dhigh, dlow)
            elif math.log10(maxerr) >= -1.0:
                value = "$%.1f$" % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.1:
                    err = "$\pm$%.1f" % ((dlow + dhigh) / 2.0)
                else:
                    err = "$^{+%.1f}_{-%.1f}$" % (dhigh, dlow)
            elif math.log10(maxerr) >= -2.0:
                value = "$%.2f$" % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.01:
                    err = "$\pm$%.2f" % ((dlow + dhigh) / 2.0)
                else:
                    err = "$^{+%.2f}_{-%.2f}$" % (dhigh, dlow)
            elif math.log10(maxerr) >= -3.0:
                value = "$%.3f$" % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.001:
                    err = "$\pm$%.3f" % ((dlow + dhigh) / 2.0)
                else:
                    err = "$^{+%.3f}_{-%.3f}$" % (dhigh, dlow)
            else:
                value = "$%.4f$" % (bestfit)
                if numpy.fabs((dlow - dhigh)) < 0.0001:
                    err = "$\pm$%.4f" % ((dlow + dhigh) / 2.0)
                else:
                    err = "$^{+%.4f}_{-%.4f}$" % (dhigh, dlow)
            printline += value + "&" + err
        if not ii == (len(names) - 1):
            printline += "\\\\"
        if ii == (len(names) - (len(locs) + 2)):
            printline += "\\\\"
        if ii < (len(names) - (len(locs) + 1)):
            outfile.write(printline + "\n")
    outfile.write("\\enddata\n")
    outfile.write(cmdline + "\n")
    outfile.close()