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()
Exemple #2
0
def fitMass():
    #Read data
    vcircdata= numpy.loadtxt('vcirc.txt',comments='#',delimiter='|')
    vcircdata[:,0]/= _REFR0
    vcircdata[:,1]/= _REFV0
    vcircdata[:,2]/= _REFV0
    #Set-up
    bp= HernquistPotential(a=0.6/_REFR0,normalize=1./3.)
    if _dexp:
        dp= DoubleExponentialDiskPotential(normalize=1./3.,
                                           hr=3.25/_REFR0,
                                           hz=0.3/_REFR0)
    else:
        dp= MiyamotoNagaiPotential(normalize=1./3.,
                                   a=3.25/_REFR0,
                                   b=0.3/_REFR0)
    hp= NFWPotential(normalize=1./3.,
                     a=5./_REFR0)
    init= numpy.array([0.6,0.35,218./_REFV0,15./_REFR0,3.25/_REFR0])
    #print _convertrho
    out= optimize.fmin_powell(obj,init,args=(vcircdata,bp,dp,hp),
                              callback=cb)
    print out
    #Calculate mass
    #Halo mass
    halo= halomass(out)
    bulge= halomass(out)
    disk= diskmass(out)
    print halo, disk, bulge, totalmass(out)
    #Sample
    samples= bovy_mcmc.markovpy(out,0.05,
                                (lambda x: -obj(x,vcircdata,bp,dp,hp)),
                                (),
                                isDomainFinite=[[True,True],
                                                [True,True],
                                                [True,True],
                                                [True,True],
                                                [True,True]],
                                domain=[[0.,1.],
                                        [0.,1.],
                                        [0.,2.],
                                        [0.,10.],
                                        [0.,2.]],
                                nwalkers=8,
                                nsamples=10000)
    print "Done with sampling ..."
    print numpy.mean(numpy.array(samples),axis=0)
    print numpy.std(numpy.array(samples),axis=0)
    samples= numpy.random.permutation(samples)[0:500]
    #halo
    totalmasssamples= []
    for s in samples:
        totalmasssamples.append(halomass(s))
    totalmasssamples= numpy.array(totalmasssamples)
    print "halo mass: ", numpy.mean(totalmasssamples), numpy.std(totalmasssamples)
    print sixtyeigthinterval(halomass(out),totalmasssamples,quantile=.68)
    #total
    totalmasssamples= []
    for s in samples:
        totalmasssamples.append(totalmass(s))
    totalmasssamples= numpy.array(totalmasssamples)
    print "total mass: ", numpy.mean(totalmasssamples), numpy.std(totalmasssamples)
    print sixtyeigthinterval(totalmass(out),totalmasssamples,quantile=.68)
    bovy_plot.bovy_print()
    bovy_plot.bovy_hist(totalmasssamples,bins=16,range=[0.,2.])
    bovy_plot.bovy_end_print('totalmass.png')
    return None
    #disk
    totalmasssamples= []
    for s in samples:
        totalmasssamples.append(diskmass(s))
    totalmasssamples= numpy.array(totalmasssamples)
    print "disk mass: ", numpy.mean(totalmasssamples), numpy.std(totalmasssamples)
    #bulge
    totalmasssamples= []
    for s in samples:
        totalmasssamples.append(bulgemass(s))
    totalmasssamples= numpy.array(totalmasssamples)
    print "bulge mass: ", numpy.mean(totalmasssamples), numpy.std(totalmasssamples)
    return None
def mockNonFlatTable(parser):
    (options, args) = parser.parse_args()
    cmdline = '%python mockNonFlatTable.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()
    #Set up sections
    names = [
        '$V_c(R_0)\ [\mathrm{km\ s}^{-1}]$', '$\\beta$',
        '$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$'
    ]
    missing = [0, 1, 0, 0, 0, 0, 0, 0]  #1 if missing for flat
    scale = [_REFV0, 1., _REFR0, _VRSUN, 1., _REFV0, 1., 1.]
    flatbestfits = []
    flatxs = []
    #V_c
    flatbestfits.append(flatparams[0])
    flatxs.append(numpy.array([s[0] for s in flatsamples]))
    #beta
    flatbestfits.append(None)
    flatxs.append(None)
    #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]))
    #Make table
    quantile = 0.68
    outfile = open(args[0], 'w')
    for kk in range(_NSECTIONS):
        #Open savefile for all mocks' fit and samples
        mockparams = []
        mocksamples = []
        for ii in range(_NMOCKS):
            savefile = open(_MOCKFIT[ii].replace('FLAT', _SECTIONS[kk]), 'rb')
            mockparams.append(pickle.load(savefile))
            savefile.close()
            savefile = open(_MOCKSAMPLES[ii].replace('FLAT', _SECTIONS[kk]),
                            'rb')
            mocksamples.append(pickle.load(savefile))
            savefile.close()
        mockbestfits = []
        mockxs = []
        ##Same for all mocks
        if _SECTIONS[kk] == 'powerlaw' or _SECTIONS[kk] == 'linear':
            skip = 1
        elif _SECTIONS[kk] == 'quadratic':
            skip = 2
        elif _SECTIONS[kk] == 'cubic':
            skip = 3
        if _SECTIONS[kk] == 'linear':
            names[
                1] = '$\\mathrm{d} V_c / \mathrm{d} R \left(R_0 \\right)\ [\mathrm{km\ s}^{-1}\ \mathrm{kpc}^{-1}]$'
        elif _SECTIONS[kk] == 'quadratic':
            names.insert(
                2,
                '$\\mathrm{d}^2 V_c / \mathrm{d} R^2 \left(R_0 \\right)\ [\mathrm{km\ s}^{-1}\ \mathrm{kpc}^{-2}]$'
            )
            flatbestfits.insert(2, None)
            flatxs.insert(2, None)
            missing.insert(2, 1)
            scale.insert(2, 1.)
        elif _SECTIONS[kk] == 'cubic':
            if not 'quadratic' in _SECTIONS:
                #First insert quadratic
                names.insert(
                    2,
                    '$\\mathrm{d}^2 V_c / \mathrm{d} R^2 \left(R_0 \\right)\ [\mathrm{km\ s}^{-1}\ \mathrm{kpc}^{-2}]$'
                )
                flatbestfits.insert(2, None)
                flatxs.insert(2, None)
                missing.insert(2, 1)
                scale.insert(2, 1.)
            #Assumes that quadratic was already inserted
            names.insert(
                3,
                '$\\mathrm{d}^3 V_c / \mathrm{d} R^3 \left(R_0 \\right)\ [\mathrm{km\ s}^{-1}\ \mathrm{kpc}^{-3}]$'
            )
            flatbestfits.insert(3, None)
            flatxs.insert(3, None)
            missing.insert(3, 1)
            scale.insert(3, 1.)
        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]]))
            #Beta
            if _SECTIONS[kk] == 'powerlaw':
                thisbestfits.append(mockparams[ii][6])
                thisxs.append(numpy.array([s[6] for s in mocksamples[ii]]))
            elif _SECTIONS[kk] == 'linear' or _SECTIONS[
                    kk] == 'quadratic' or _SECTIONS[kk] == 'cubic':
                thisbestfits.append(mockparams[ii][6] * _REFV0 / _REFR0)
                thisxs.append(
                    numpy.array(
                        [s[6] * _REFV0 / _REFR0 for s in mocksamples[ii]]))
            if _SECTIONS[kk] == 'quadratic' or _SECTIONS[kk] == 'cubic':
                thisbestfits.append(mockparams[ii][7] * _REFV0 / _REFR0**2.)
                thisxs.append(
                    numpy.array(
                        [s[7] * _REFV0 / _REFR0**2. for s in mocksamples[ii]]))
            if _SECTIONS[kk] == 'cubic':
                thisbestfits.append(mockparams[ii][8] * _REFV0 / _REFR0**3.)
                thisxs.append(
                    numpy.array(
                        [s[8] * _REFV0 / _REFR0**3. 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 + skip])
            thisxs.append(numpy.array([s[6 + skip] for s in mocksamples[ii]]))
            #Omega_sun
            thisbestfits.append(mockparams[ii][7 + skip] * _PMSGRA)
            thisxs.append(
                numpy.array([s[7 + skip] * _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 + skip])
            thisxs.append(
                numpy.array([s[1] * s[9 + skip] for s in mocksamples[ii]]))
            #X^2
            thisbestfits.append(mockparams[ii][8 + skip])
            thisxs.append(numpy.array([s[8 + skip] for s in mocksamples[ii]]))
            #Append all
            mockbestfits.append(thisbestfits)
            mockxs.append(thisxs)
        for ii in range(len(names)):
            #Set up line
            if ii == 0:
                if _SECTIONS[kk] == 'powerlaw':
                    printline = 'power-law'
                else:
                    printline = _SECTIONS[kk]
            else:
                printline = " "
            printline += ' & '
            printline += names[ii]
            #Flat
            printline += ' & '
            if missing[ii]:
                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]))
                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 += ' & '
                print _SECTIONS[kk], jj, ii, mockbestfits[jj][ii]
                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 (kk == (_NSECTIONS - 1) and ii == (len(names) - 1)):
                printline += '\\\\'
            if not kk == (_NSECTIONS - 1) and ii == (len(names) - 1):
                printline += '\\\\'
            outfile.write(printline + '\n')
    outfile.write('\\enddata\n')
    outfile.write(cmdline + '\n')
    outfile.close()
def mockNonFlatTable(parser):
    (options,args)= parser.parse_args()
    cmdline= '%python mockNonFlatTable.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()
    #Set up sections
    names= ['$V_c(R_0)\ [\mathrm{km\ s}^{-1}]$',
            '$\\beta$',
            '$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$']
    missing= [0,1,0,0,0,0,0,0] #1 if missing for flat
    scale= [_REFV0,1.,
            _REFR0,_VRSUN,1.,_REFV0,1.,1.]
    flatbestfits= []
    flatxs= []
    #V_c
    flatbestfits.append(flatparams[0])
    flatxs.append(numpy.array([s[0] for s in flatsamples]))
    #beta
    flatbestfits.append(None)
    flatxs.append(None)
    #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]))
    #Make table
    quantile= 0.68
    outfile= open(args[0],'w')
    for kk in range(_NSECTIONS):
        #Open savefile for all mocks' fit and samples
        mockparams= []
        mocksamples= []
        for ii in range(_NMOCKS):
            savefile= open(_MOCKFIT[ii].replace('FLAT',_SECTIONS[kk]),'rb')
            mockparams.append(pickle.load(savefile))
            savefile.close()
            savefile= open(_MOCKSAMPLES[ii].replace('FLAT',_SECTIONS[kk]),'rb')
            mocksamples.append(pickle.load(savefile))
            savefile.close()
        mockbestfits= []
        mockxs= []
        ##Same for all mocks
        if _SECTIONS[kk] == 'powerlaw' or _SECTIONS[kk] == 'linear':
            skip= 1
        elif _SECTIONS[kk] == 'quadratic':
            skip= 2
        elif _SECTIONS[kk] == 'cubic':
            skip= 3
        if _SECTIONS[kk] == 'linear':
            names[1]= '$\\mathrm{d} V_c / \mathrm{d} R \left(R_0 \\right)\ [\mathrm{km\ s}^{-1}\ \mathrm{kpc}^{-1}]$'
        elif _SECTIONS[kk] == 'quadratic':
            names.insert(2,'$\\mathrm{d}^2 V_c / \mathrm{d} R^2 \left(R_0 \\right)\ [\mathrm{km\ s}^{-1}\ \mathrm{kpc}^{-2}]$')
            flatbestfits.insert(2,None)
            flatxs.insert(2,None)
            missing.insert(2,1)
            scale.insert(2,1.)
        elif _SECTIONS[kk] == 'cubic':
            if not 'quadratic' in _SECTIONS:
                #First insert quadratic
                names.insert(2,'$\\mathrm{d}^2 V_c / \mathrm{d} R^2 \left(R_0 \\right)\ [\mathrm{km\ s}^{-1}\ \mathrm{kpc}^{-2}]$')
                flatbestfits.insert(2,None)
                flatxs.insert(2,None)
                missing.insert(2,1)
                scale.insert(2,1.)
            #Assumes that quadratic was already inserted
            names.insert(3,'$\\mathrm{d}^3 V_c / \mathrm{d} R^3 \left(R_0 \\right)\ [\mathrm{km\ s}^{-1}\ \mathrm{kpc}^{-3}]$')
            flatbestfits.insert(3,None)
            flatxs.insert(3,None)
            missing.insert(3,1)
            scale.insert(3,1.)
        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]]))
            #Beta
            if _SECTIONS[kk] == 'powerlaw':
                thisbestfits.append(mockparams[ii][6])
                thisxs.append(numpy.array([s[6] for s in mocksamples[ii]]))
            elif _SECTIONS[kk] == 'linear' or _SECTIONS[kk] == 'quadratic' or _SECTIONS[kk] == 'cubic':
                thisbestfits.append(mockparams[ii][6]*_REFV0/_REFR0)
                thisxs.append(numpy.array([s[6]*_REFV0/_REFR0 for s in mocksamples[ii]]))
            if _SECTIONS[kk] == 'quadratic' or _SECTIONS[kk] == 'cubic':
                thisbestfits.append(mockparams[ii][7]*_REFV0/_REFR0**2.)
                thisxs.append(numpy.array([s[7]*_REFV0/_REFR0**2. for s in mocksamples[ii]]))
            if _SECTIONS[kk] == 'cubic':
                thisbestfits.append(mockparams[ii][8]*_REFV0/_REFR0**3.)
                thisxs.append(numpy.array([s[8]*_REFV0/_REFR0**3. 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+skip])
            thisxs.append(numpy.array([s[6+skip] for s in mocksamples[ii]]))
            #Omega_sun
            thisbestfits.append(mockparams[ii][7+skip]*_PMSGRA)
            thisxs.append(numpy.array([s[7+skip]*_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+skip])
            thisxs.append(numpy.array([s[1]*s[9+skip] for s in mocksamples[ii]]))
            #X^2
            thisbestfits.append(mockparams[ii][8+skip])
            thisxs.append(numpy.array([s[8+skip] for s in mocksamples[ii]]))
            #Append all
            mockbestfits.append(thisbestfits)
            mockxs.append(thisxs)
        for ii in range(len(names)):
            #Set up line
            if ii == 0:
                if _SECTIONS[kk] == 'powerlaw':
                    printline= 'power-law'
                else:
                    printline= _SECTIONS[kk]
            else:
                printline= " "
            printline+= ' & '
            printline+= names[ii]
            #Flat
            printline+= ' & '
            if missing[ii]:
                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]))
                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+= ' & '
                print _SECTIONS[kk], jj, ii, mockbestfits[jj][ii]
                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 (kk == (_NSECTIONS-1) and ii == (len(names)-1)):
                printline+= '\\\\'
            if not kk == (_NSECTIONS-1) and ii == (len(names)-1):
                printline+= '\\\\'
            outfile.write(printline+'\n')
    outfile.write('\\enddata\n')
    outfile.write(cmdline+'\n')
    outfile.close()
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()