예제 #1
0
def sample_kuepper_flatteningforce_post(nsamples: int, qmean: float,
                                        qerr: float, frfz: float,
                                        frfzerr: float) -> Sequence:
    """Sample Kuepper et al. (2015) Flattening Force Posterior.

    Parameters
    ----------
    nsamples : int
    qmean : float
    qerr : float
    frfz : float
    frfzerr : float

    Returns
    -------
    samples : ndarray

    """
    params = [1.58, 37.9, 0.95]
    funcargs = (qmean, qerr, frfz, frfzerr)

    samples = bovy_mcmc.markovpy(
        params,
        0.2,
        lambda x: kuepper_flatteningforce_post(x, *funcargs),
        (),
        isDomainFinite=[[False, False] for ii in range(len(params))],
        domain=[[0.0, 0.0] for ii in range(len(params))],
        nsamples=nsamples,
        nwalkers=2 * len(params),
    )

    samples = np.array(samples).T

    return samples
예제 #2
0
def fitDens(data,
            locations,
            effsel,
            distmods,
            type='exp',
            mcmc=False,
            nsamples=10000,
            verbose=True,
            init=None,
            retMaxL=False):
    """
    NAME:
       fitDens
    PURPOSE:
       fit the density profile of a set of stars
    INPUT:
       data - recarray with the data
       locations - locations of the APOGEE effective selection function
       effsel - array (nloc,nD) of the effective selection function, includes area of the field
       distmods - grid of distance moduli on which the effective selection function is pre-computed
       type= ('exp') type of density profile to fit
       mcmc= (False) run MCMC or not
       nsamples= (10000) number of MCMC samples to obtain
       verbose= (True) set this to False for no optimize convergence messages
       init= (None) if set, these are the initial conditions
       retMaxL= (False) if True, return the maximum likelihood
    OUTPUT:
       (best-fit, samples, maximum-likelihood) based on options
    HISTORY:
       2015-03-24 - Written - Bovy (IAS)
    """
    # Setup the density function and its initial parameters
    densfunc = _setup_densfunc(type)
    if init is None:
        init = _setup_initparams_densfunc(type, data)
    # Setup the integration of the effective volume
    effsel, Rgrid, phigrid, zgrid = _setup_effvol(locations, effsel, distmods)
    # Get the data's R,phi,z
    dataR = data['RC_GALR_H']
    dataphi = data['RC_GALPHI_H']
    dataz = data['RC_GALZ_H']
    # Optimize
    out = optimize.fmin(
        lambda x: _mloglike(x, densfunc, type, dataR, dataphi, dataz, effsel,
                            Rgrid, phigrid, zgrid),
        init,
        disp=verbose)
    if 'explinflare' in type:
        step = [0.2, 0.2, 0.2, 0.2, 0.02]  # need small step for Rfinv
    else:
        step = 0.2
    if mcmc:
        samples = bovy_mcmc.markovpy(
            out,
            step,
            lambda x: loglike(x, densfunc, type, dataR, dataphi, dataz, effsel,
                              Rgrid, phigrid, zgrid), (),
            isDomainFinite=[[False, False] for ii in range(len(out))],
            domain=[[0., 0.] for ii in range(len(out))],
            nsamples=nsamples,
            nwalkers=2 * len(out))
        if verbose: print_samples_qa(samples)
        out = (
            out,
            numpy.array(samples).T,
        )
    else:
        out = (out, )
    if retMaxL:
        out = out + (loglike(out[0], densfunc, type, dataR, dataphi, dataz,
                             effsel, Rgrid, phigrid, zgrid), )
    return out
예제 #3
0
def pixelFitVel(options,args):
    if options.sample.lower() == 'g':
        if options.select.lower() == 'program':
            raw= read_gdwarfs(_GDWARFFILE,logg=True,ebv=True,sn=options.snmin,
                              distfac=options.distfac)
        else:
            raw= read_gdwarfs(logg=True,ebv=True,sn=options.snmin,
                              distfac=options.distfac)
    elif options.sample.lower() == 'k':
        if options.select.lower() == 'program':
            raw= read_kdwarfs(_KDWARFFILE,logg=True,ebv=True,sn=options.snmin,
                              distfac=options.distfac)
        else:
            raw= read_kdwarfs(logg=True,ebv=True,sn=options.snmin,
                              distfac=options.distfac)
    if not options.bmin is None:
        #Cut on |b|
        raw= raw[(numpy.fabs(raw.b) > options.bmin)]
    #Bin the data
    binned= pixelAfeFeh(raw,dfeh=options.dfeh,dafe=options.dafe)
    #Savefile
    if os.path.exists(args[0]):#Load savefile
        savefile= open(args[0],'rb')
        fits= pickle.load(savefile)
        ii= pickle.load(savefile)
        jj= pickle.load(savefile)
        savefile.close()
    else:
        fits= []
        ii, jj= 0, 0
    #Sample?
    if options.mcsample:
        if ii < len(binned.fehedges)-1 and jj < len(binned.afeedges)-1:
            print "First do all of the fits ..."
            print "Returning ..."
            return None
        if os.path.exists(args[1]): #Load savefile
            savefile= open(args[1],'rb')
            samples= pickle.load(savefile)
            ii= pickle.load(savefile)
            jj= pickle.load(savefile)
            savefile.close()
        else:
            samples= []
            ii, jj= 0, 0
    #Model
    if options.model.lower() == 'hwr':
        like_func= _HWRLikeMinus
        pdf_func= _HWRLike
        step= [0.01,0.3,0.3,0.3,0.3]
        create_method=['full','step_out','step_out',
                       'step_out','step_out']
        isDomainFinite=[[True,True],[True,True],
                        [True,True],[True,True],
                        [False,True]]
        domain=[[0.,1.],[-10.,10.],[-100.,100.],[-100.,100.],
                [0.,4.6051701859880918]]
    elif options.model.lower() == 'hwrrz':
        like_func= _HWRRZLikeMinus
        pdf_func= _HWRRZLike
        step= [0.01,0.3,0.3,0.3,0.3,
               0.3,0.3,0.3,0.3,
               0.3,0.3,0.3]
        create_method=['full',
                       'step_out','step_out',
                       'step_out','step_out',
                       'step_out','step_out',
                       'step_out','step_out',
                       'step_out','step_out']
#                       'step_out']
        isDomainFinite=[[True,True],
                        [True,True],[True,True],[True,True],[False,True],
                        [True,True],[True,True],[True,True],[False,True],
                        [True,True],[True,True]]#,[True,True]]
        domain=[[0.,1.],
                [-10.,10.],[-100.,100.],[-100.,100.],[0.,4.6051701859880918],
                [-10.,10.],[-100.,100.],[-100.,100.],[0.,4.6051701859880918],
                [-2.,2.],[-10.,10.]]#,[-100.,100.]]
    elif options.model.lower() == 'isotherm':
        like_func= _IsothermLikeMinus
        pdf_func= _IsothermLike
        step= [0.01,0.05,0.3]
        create_method=['full','step_out','step_out']
        isDomainFinite=[[True,True],[False,False],
                        [False,True]]
        domain=[[0.,1.],[0.,0.],[0.,4.6051701859880918]]
    #Run through the bins
    while ii < len(binned.fehedges)-1:
        while jj < len(binned.afeedges)-1:
            data= binned(binned.feh(ii),binned.afe(jj))
            if len(data) < options.minndata:
                if options.mcsample: samples.append(None)
                else: fits.append(None)
                jj+= 1
                if jj == len(binned.afeedges)-1: 
                    jj= 0
                    ii+= 1
                    break
                continue               
            print binned.feh(ii), binned.afe(jj), len(data)
            #Create XYZ and R, vxvyvz, cov_vxvyvz
            R= ((8.-data.xc)**2.+data.yc**2.)**0.5
            #Confine to R-range?
            if not options.rmin is None and not options.rmax is None:
                dataindx= (R >= options.rmin)*\
                    (R < options.rmax)
                data= data[dataindx]
                R= R[dataindx]
            XYZ= numpy.zeros((len(data),3))
            XYZ[:,0]= data.xc
            XYZ[:,1]= data.yc
            XYZ[:,2]= data.zc+_ZSUN
            if options.pivotmean:
                d= numpy.fabs((XYZ[:,2]-numpy.mean(numpy.fabs(XYZ[:,2]))))
            else:
                d= numpy.fabs((XYZ[:,2]-numpy.median(numpy.fabs(XYZ[:,2]))))
            vxvyvz= numpy.zeros((len(data),3))
            vxvyvz[:,0]= data.vxc
            vxvyvz[:,1]= data.vyc
            vxvyvz[:,2]= data.vzc
            cov_vxvyvz= numpy.zeros((len(data),3,3))
            cov_vxvyvz[:,0,0]= data.vxc_err**2.
            cov_vxvyvz[:,1,1]= data.vyc_err**2.
            cov_vxvyvz[:,2,2]= data.vzc_err**2.
            cov_vxvyvz[:,0,1]= data.vxvyc_rho*data.vxc_err*data.vyc_err
            cov_vxvyvz[:,0,2]= data.vxvzc_rho*data.vxc_err*data.vzc_err
            cov_vxvyvz[:,1,2]= data.vyvzc_rho*data.vyc_err*data.vzc_err
            if options.vr or options.vrz:
                #Rotate vxvyvz to vRvTvz
                cosphi= (8.-XYZ[:,0])/R
                sinphi= XYZ[:,1]/R
                vR= -vxvyvz[:,0]*cosphi+vxvyvz[:,1]*sinphi
                vT= vxvyvz[:,0]*sinphi+vxvyvz[:,1]*cosphi
                #Subtract mean vR
                vR-= numpy.mean(vR)
                vxvyvz[:,0]= vR               
                vxvyvz[:,1]= vT
                for rr in range(len(XYZ[:,0])):
                    rot= numpy.array([[cosphi[rr],sinphi[rr]],
                                      [-sinphi[rr],cosphi[rr]]])
                    sxy= cov_vxvyvz[rr,0:2,0:2]
                    sRT= numpy.dot(rot,numpy.dot(sxy,rot.T))
                    cov_vxvyvz[rr,0:2,0:2]= sRT
            #Fit this data
            #Initial condition
            if options.model.lower() == 'hwr':
                params= numpy.array([0.02,numpy.log(30.),0.,0.,numpy.log(6.)])
            elif options.model.lower() == 'hwrrz':
                params= numpy.array([0.02,numpy.log(30.),0.,0.,numpy.log(6.),
                                     numpy.log(30.),0.,0.,numpy.log(6.),
                                     0.2,0.])#,0.])
            elif options.model.lower() == 'isotherm':
                params= numpy.array([0.02,numpy.log(30.),numpy.log(6.)])
            if not options.mcsample:
                #Optimize likelihood
                params= optimize.fmin_powell(like_func,params,
                                             args=(XYZ,vxvyvz,cov_vxvyvz,R,d,
                                                   options.vr,options.vrz))
                if options.chi2:
                    #Calculate chi2 and chi2/dof
                    chi2, dof= like_func(params,XYZ,vxvyvz,cov_vxvyvz,R,d,options.vr,options.vrz,
                                    chi2=True)
                    dof-= len(params)
                    params.resize(len(params)+2)
                    params[-2]= chi2
                    params[-1]= chi2/dof
                print numpy.exp(params)
                fits.append(params)
            else:
                #Load best-fit params
                params= fits[jj+ii*binned.npixafe()]
                print numpy.exp(params)
                thesesamples= bovy_mcmc.markovpy(params,
                #thesesamples= bovy_mcmc.slice(params,
                                                 #step,
                                                 0.01,
                                                 pdf_func,
                                                 (XYZ,vxvyvz,cov_vxvyvz,R,d,
                                                  options.vr),#options.vrz),
                                                 #create_method=create_method,
                                                 isDomainFinite=isDomainFinite,
                                                 domain=domain,
                                                 nsamples=options.nsamples)
                #Print some helpful stuff
                printthis= []
                for kk in range(len(params)):
                    xs= numpy.array([s[kk] for s in thesesamples])
                    printthis.append(0.5*(numpy.exp(numpy.mean(xs))-numpy.exp(numpy.mean(xs)-numpy.std(xs))-numpy.exp(numpy.mean(xs))+numpy.exp(numpy.mean(xs)+numpy.std(xs))))
                print printthis
                samples.append(thesesamples)               
            jj+= 1
            if jj == len(binned.afeedges)-1: 
                jj= 0
                ii+= 1
            if options.mcsample: save_pickles(args[1],samples,ii,jj)
            else: save_pickles(args[0],fits,ii,jj)
            if jj == 0: #this means we've reset the counter 
                break
    if options.mcsample: save_pickles(args[1],samples,ii,jj)
    else: save_pickles(args[0],fits,ii,jj)
    return None
예제 #4
0
def sample(
    nsamples: int = 1000,
    params: Optional[Sequence] = None,
    fitc: bool = False,
    ro: float = REFR0,
    vo: float = REFV0,
    fitvoro: bool = False,
    c: float = 1.0,
    dblexp: bool = False,
    addpal5: bool = False,
    addgd1: bool = False,
    plots: bool = True,
    mc16: bool = False,
    addgas: bool = False,
    _use_emcee: bool = True,
) -> Sequence:
    """Sample from potential.

    Parameters
    ----------
    nsamples : int, optional
    params : list, optional
    fitc : bool, optional
    ro : float, optional
    vo : float, optional
    fitvoro : bool, optional
    c : float, optional
    dblexp : bool, optional
    addpal5 : bool, optional
    addgd1 : bool, optional
    plots : bool, optional
    mc16 : bool, optional
    addgas : bool, optional
    _use_emcee : bool, optional

    Returns
    -------
    samples

    """
    (
        (surfrs, kzs, kzerrs),
        termdata,
        termdata_mc16,
        funcargs,
    ) = _get_data_and_make_funcargs(
        fitc, ro, vo, fitvoro, c, dblexp, addpal5, addgd1, mc16, addgas
    )

    # ---------------------

    if params is None:
        params = fit(
            fitc=fitc,
            ro=ro,
            vo=vo,
            fitvoro=fitvoro,
            c=c,
            dblexp=dblexp,
            plots=False,
            addpal5=addpal5,
            addgd1=addgd1,
            addgas=addgas,
        )[0]

    samples = bovy_mcmc.markovpy(  # TODO Deprecate
        params,
        0.2,
        lambda x: -like_func(x, *funcargs),
        (),
        isDomainFinite=[[False, False] for ii in range(len(params))],
        domain=[[0.0, 0.0] for ii in range(len(params))],
        nsamples=nsamples,
        nwalkers=2 * len(params),
        _use_emcee=_use_emcee,
    )
    samples = np.array(samples).T

    if plots:
        plot.plot_samples(samples, fitc, fitvoro, ro=ro, vo=vo)

    return samples
예제 #5
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
예제 #6
0
def fitDens(data,
            locations,effsel,distmods,
            type='exp',
            mcmc=False,nsamples=10000,
            verbose=True,
            init=None,
            retMaxL=False):
    """
    NAME:
       fitDens
    PURPOSE:
       fit the density profile of a set of stars
    INPUT:
       data - recarray with the data
       locations - locations of the APOGEE effective selection function
       effsel - array (nloc,nD) of the effective selection function, includes area of the field
       distmods - grid of distance moduli on which the effective selection function is pre-computed
       type= ('exp') type of density profile to fit
       mcmc= (False) run MCMC or not
       nsamples= (10000) number of MCMC samples to obtain
       verbose= (True) set this to False for no optimize convergence messages
       init= (None) if set, these are the initial conditions
       retMaxL= (False) if True, return the maximum likelihood
    OUTPUT:
       (best-fit, samples, maximum-likelihood) based on options
    HISTORY:
       2015-03-24 - Written - Bovy (IAS)
    """
    # Setup the density function and its initial parameters
    densfunc= _setup_densfunc(type)
    if init is None:
        init= _setup_initparams_densfunc(type,data)
    # Setup the integration of the effective volume
    effsel, Rgrid, phigrid, zgrid= _setup_effvol(locations,effsel,distmods)
    # Get the data's R,phi,z
    dataR= data['RC_GALR_H']
    dataphi= data['RC_GALPHI_H']
    dataz= data['RC_GALZ_H']
    # Optimize
    out= optimize.fmin(lambda x: _mloglike(x,densfunc,type,
                                           dataR,dataphi,dataz,
                                           effsel,Rgrid,phigrid,zgrid),
                       init,disp=verbose)
    if 'explinflare' in type:
        step= [0.2,0.2,0.2,0.2,0.02] # need small step for Rfinv
    else:
        step= 0.2
    if mcmc:
        samples= bovy_mcmc.markovpy(out,
                                    step,
                                    lambda x: loglike(x,densfunc,type,
                                                      dataR,dataphi,dataz,
                                                      effsel,Rgrid,
                                                      phigrid,zgrid),
                                    (),
                                    isDomainFinite=[[False,False] for ii in range(len(out))],
                                    domain= [[0.,0.] for ii in range(len(out))],
                                    nsamples=nsamples,
                                    nwalkers=2*len(out))
        if verbose: print_samples_qa(samples)
        out= (out,numpy.array(samples).T,)
    else:
        out= (out,)
    if retMaxL:
        out= out+(loglike(out[0],densfunc,type,dataR,dataphi,dataz,
                          effsel,Rgrid,
                          phigrid,zgrid),)
    return out
예제 #7
0
def verysimplenfwfit(plotfilename,wcprior=False,wmassprior=False):
    #Fit
    p= optimize.fmin_powell(chi2,[-0.5,0.7],args=(wcprior,wmassprior))
    print mvir(p), conc(p)*numpy.exp(p[1])*8.
    vo= numpy.exp(p[0])
    a= numpy.exp(p[1])
    nfw= potential.NFWPotential(normalize=1.,a=a)
    rs= numpy.linspace(0.01,350.,1001)
    masses= numpy.array([nfw.mass(r/8.) for r in rs])
    bovy_plot.bovy_print(fig_width=6.)
    bovy_plot.bovy_plot(rs,
                        masses*bovy_conversion.mass_in_1010msol(220.*vo,8.)/100.,
                        'k-',loglog=True,
                        xlabel=r'$R\,(\mathrm{kpc})$',
                        ylabel=r'$M(<R)\,(10^{12}\,M_\odot)$',
                        yrange=[0.01,1.2],
                        xrange=[3.,400.])
    if _USE_ALL_XUE:
        plotx= [10.]
        plotx.extend(list(_XUER))
        ploty= [4.5/100.]
        ploty.extend(list(_XUEMASS/100.))
        plotyerr= [1.5/100]
        plotyerr.extend(list(_XUEMASS_ERR/100.))
        pyplot.errorbar(plotx,ploty,yerr=plotyerr,marker='o',ls='none',
                        color='k')
    else:
        pyplot.errorbar([10.,60.],[4.5/100.,3.5/10.],yerr=[1.5/100.,0.7/10.],
                        marker='o',ls='none',color='k')
    pyplot.errorbar([150.],[7.5/10.],[2.5/10.],marker='None',color='k')
    dx= .5
    arr= FancyArrowPatch(posA=(7.,4./100.),posB=(numpy.exp(numpy.log(7.)+dx),numpy.exp(numpy.log(4./100.)+1.5*dx)),arrowstyle='->',connectionstyle='arc3,rad=%4.2f' % (0.),shrinkA=2.0, shrinkB=2.0,mutation_scale=20.0, mutation_aspect=None,fc='k')
    ax = pyplot.gca()
    ax.add_patch(arr)
    #Sample MCMC to get virial mass uncertainty
    samples= bovy_mcmc.markovpy(p,
                                0.05,
                                lnlike,
                                (wcprior,wmassprior),
                                isDomainFinite=[[False,False],[False,False]],
                                domain=[[0.,0.],[0.,0.]],
                                nsamples=10000,
                                nwalkers=6)
    mvirs= numpy.array([mvir(x) for x in samples])
    concs= numpy.array([conc(x) for x in samples])
    indx= True-numpy.isnan(mvirs)
    mvirs= mvirs[indx]
    indx= True-numpy.isnan(concs)
    concs= concs[indx]
    rvirs= concs[indx]*numpy.array([numpy.exp(x[1]) for x in samples])*8.
    bovy_plot.bovy_text(r'$M_{\mathrm{vir}} = %.2f\pm%.2f\times10^{12}\,M_\odot$' % (numpy.median(mvirs),1.4826*numpy.median(numpy.fabs(mvirs-numpy.median(mvirs)))) +'\n'+
                        r'$r_{\mathrm{vir}} = %i\pm%i\,\mathrm{kpc}$' % (numpy.median(rvirs),1.4826*numpy.median(numpy.fabs(rvirs-numpy.median(rvirs))))+'\n'+
                        r'$c = %.1f\pm%.1f$' % (numpy.median(concs),1.4826*numpy.median(numpy.fabs(concs-numpy.median(concs)))),
                        top_left=True,size=18.)
    #Create inset with PDF
    insetAxes= pyplot.axes([0.55,0.22,0.3,0.3])
    pyplot.sca(insetAxes)
    bovy_plot.bovy_hist(mvirs,range=[0.,3.],bins=51,histtype='step',
                        color='k',
                        normed=True,
                        overplot=True)
    insetAxes.set_xlim(0.,3.)
    insetAxes.set_ylim(0.,1.49)
    insetAxes.set_xlabel(r'$M_{\mathrm{vir}}\,(10^{12}\,M_\odot)$')
    bovy_plot._add_ticks()
    bovy_plot.bovy_end_print(plotfilename)
예제 #8
0
def sampleGP(trainingSet,covar,mean=None,nsamples=100,
             step=None,fix=None,metropolis=False,markovpy=False):
    """
    NAME:
       sampleGP
    PURPOSE:
       sample a GP
    INPUT:
       trainingSet - a trainingSet instance
       covar - an instance of your covariance function of
               choice, with initialized parameters
       mean= an instance of your mean function of choice, with initialized
             parameters
       nsamples - number of samples desired
       step= step-size for slice creation or metropolis sampling 
             (number or list)
       fix= None or list of parameters to hold fixed
       metropolis= if True, use Metropolis sampling
       markovpy= if True, use markovpy sampling
    OUTPUT:
       list of outcovarFunc
    HISTORY:
       2010-08-08 - Written - Bovy (NYU)
    """
    #Put in dummy mean if mean is None
    if mean is None:
        from flexgp.zeroMean import meanFunc
        mean= meanFunc()
        noMean= True
        out= [covar]
    else: 
        noMean= False
        out= [(covar,mean)]
    #Pack the covariance parameters
    (params,packing)= pack_params(covar,mean,fix)
    if step is None:
        step= [0.1 for ii in range(len(params))]
    #Grab the covariance class
    covarFuncName= inspect.getmodule(covar).__name__
    thisCovarClass= __import__(covarFuncName)
    meanFuncName= inspect.getmodule(mean).__name__
    thisMeanClass= __import__(meanFuncName)
    #Set up isDomainFinite, domain, and create_method, even when metropolis
    isDomainFinite, domain, create_method= [], [], []
    covarIsDomainFinite= covar.isDomainFinite()
    covarDomain= covar.paramsDomain()
    covarCreate= covar.create_method()
    meanIsDomainFinite= mean.isDomainFinite()
    meanDomain= mean.paramsDomain()
    meanCreate= mean.create_method()
    for ii in range(len(packing.GPhyperPackingList)):
        p= packing.GPhyperPackingList[ii]
        try:
            for jj in range(packing.GPhyperPackingDim[ii]):
                isDomainFinite.append(covarIsDomainFinite[p])
                domain.append(covarDomain[p])
                create_method.append(covarCreate[p])
        except KeyError:
            for jj in range(len(packing.GPhyperPackingDim[ii])):
                isDomainFinite.append(meanIsDomainFinite[p])
                domain.append(meanDomain[p])
                create_method.append(meanCreate[p])
    if len(packing.GPhyperPackingList) == 1: #one-d
        isDomainFinite= isDomainFinite[0]
        domain= domain[0]
        create_method= create_method[0]
        if isinstance(step,(list,numpy.ndarray)): step= step[0]
    if not metropolis and not markovpy:
        #slice sample the marginal likelihood
        samples= bovy_mcmc.slice(params,step,
                                 _lnpdf,(trainingSet,packing,thisCovarClass,
                                         thisMeanClass),
                                 isDomainFinite=isDomainFinite,
                                 domain=domain,
                                 nsamples=nsamples,
                                 create_method=create_method)
    elif metropolis:
        samples, faccept= bovy_mcmc.metropolis(params,step,
                                               _lnpdf,(trainingSet,packing,
                                                       thisCovarClass,
                                                       thisMeanClass),
                                               symmetric=True,
                                               nsamples=nsamples)
        if numpy.any((faccept < 0.15)) or numpy.any((faccept > 0.6)):
            print "WARNING: Metropolis acceptance ratio was < 0.15 or > 0.6 for a direction" 
            print "Full acceptance ratio list:"
            print faccept
    elif markovpy:
        samples= bovy_mcmc.markovpy(params,step,
                                    _lnpdf,(trainingSet,packing,thisCovarClass,
                                            thisMeanClass),
                                    isDomainFinite=isDomainFinite,
                                    domain=domain,
                                    nsamples=nsamples)
        print nsamples, len(samples)
    if noMean:
        for ii in range(nsamples):
            hyperParamsDict= unpack_params(samples[ii],packing)
            out.append(packing.covarFunc(**hyperParamsDict))
        return out
    else:
        for ii in range(nsamples):
            hyperParamsDict= unpack_params(samples[ii],packing)
            out.append((packing.covarFunc(**hyperParamsDict),
                        packing.meanFunc(**hyperParamsDict)))
        return out