Module dadi.TwoLocus.demographics

Expand source code
import os
import dadi, numpy as np
from . import numerics, integration

# Cache equilibrium spectra in ~/.dadi/TwoLocus_cache by default
def set_cache_path(path='~/.dadi/TwoLocus_cache'):
    """
    Set directory in which demographic equilibrium phi spectra will be cached.

    The collection of cached spectra can get large, so it may be helpful to
    store them outside the user's home directory.
    """
    global cache_path
    cache_path = os.path.expanduser(path)
    if not os.path.isdir(cache_path):
        os.makedirs(cache_path)

cache_path=None
set_cache_path()

def equilibrium_phi(pts, rho, dt, gammaA=0, gammaB=0, hA=0, hB=0,
                    thetaA=1.0, thetaB=1.0):
    rho=float(rho); gammaA=float(gammaA); gammaB=float(gammaB);
    hA=float(hA); hB=float(hB); thetaA=float(thetaA); thetaB=float(thetaB)
    fname_template = 'phis_pts{0}_dt{1}_rho{2}_gammaA{3}_gammaB{4}_hA{5}_hB{6}_thetaA{7}_thetaB{8}.npz'
    fname = fname_template.format(pts,rho,dt,gammaA,gammaB,hA,hB,thetaA,thetaB)
    fname = os.path.join(cache_path, fname)
    try:
        fid = np.load(fname)
        yA,yB,phi = fid['arr_0'], fid['arr_1'], fid['arr_2']
        fid.close()
    except IOError:
        print('Calculating equilibrium phi from scratch.')
        x = numerics.grid(pts)

        yA = dadi.PhiManip.phi_1D(x, gamma = gammaA, h = hA, theta0 = thetaA)
        yB = dadi.PhiManip.phi_1D(x, gamma = gammaB, h = hB, theta0 = thetaB)

        phi = np.zeros((len(x),len(x),len(x)))
        yA, yB, phi = integration.advance(phi, x, 20., yA, yB, 1.0,
                                          gammaA, gammaB, hA, hB, rho,
                                          thetaA, thetaB, dt)
        np.savez(fname, yA, yB, phi)
    return yA, yB, phi

def equilibrium(pts, ns, rho=0.0, dt=0.005, gammaA=0.0, gammaB=0.0,
                 hA=0.5, hB=0.5, thetaA=1.0, thetaB=1.0):
    x = numerics.grid(pts)
    yA, yB, phi = equilibrium_phi(pts, rho, dt, gammaA, gammaB, hA, hB,
                                  thetaA, thetaB)

    fs = numerics.sample_cached(phi, ns, x)
    return fs

def two_epoch(params, pts, ns, rho=0.0, dt=0.005, gammaA=0.0, gammaB=0.0,
              hA=0.5, hB=0.5, thetaA=1.0, thetaB=1.0):
    nu,T = params

    x = numerics.grid(pts)
    yA, yB, phi = equilibrium_phi(pts, rho, dt, gammaA, gammaB, hA, hB,
                                  thetaA, thetaB)

    yA,yB,phi = integration.advance(phi, x, T, yA, yB, nu=nu,
                                    gammaA=gammaA, gammaB=gammaB,
                                    hA=hA, hB=hB, rho=rho,
                                    thetaA=thetaA, thetaB=thetaB, dt=dt)

    fs = numerics.sample_cached(phi, ns, x)
    return fs

def three_epoch(params, pts, ns, rho=0.0, dt=0.005, gammaA=0.0, gammaB=0.0,
                hA=0.5, hB=0.5, thetaA=1.0, thetaB=1.0):
    nu1,nu2,T1,T2 = params
    x = numerics.grid(pts)

    yA, yB, phi = equilibrium_phi(pts, rho, dt, gammaA, gammaB, hA, hB,
                                  thetaA, thetaB)

    yA,yB,phi = integration.advance(phi, x, T1, yA, yB, nu=nu1,
                                    gammaA=gammaA, gammaB=gammaB,
                                    hA=hA, hB=hB, rho=rho,
                                    thetaA=thetaA, thetaB=thetaB, dt=dt)

    yA,yB,phi = integration.advance(phi, x, T2, yA, yB, nu=nu2,
                                    gammaA=gammaA, gammaB=gammaB,
                                    hA=hA, hB=hB, rho=rho,
                                    thetaA=thetaA, thetaB=thetaB, dt=dt)

    fs = numerics.sample_cached(phi, ns, x)
    return fs

Functions

def equilibrium(pts, ns, rho=0.0, dt=0.005, gammaA=0.0, gammaB=0.0, hA=0.5, hB=0.5, thetaA=1.0, thetaB=1.0)
Expand source code
def equilibrium(pts, ns, rho=0.0, dt=0.005, gammaA=0.0, gammaB=0.0,
                 hA=0.5, hB=0.5, thetaA=1.0, thetaB=1.0):
    x = numerics.grid(pts)
    yA, yB, phi = equilibrium_phi(pts, rho, dt, gammaA, gammaB, hA, hB,
                                  thetaA, thetaB)

    fs = numerics.sample_cached(phi, ns, x)
    return fs
def equilibrium_phi(pts, rho, dt, gammaA=0, gammaB=0, hA=0, hB=0, thetaA=1.0, thetaB=1.0)
Expand source code
def equilibrium_phi(pts, rho, dt, gammaA=0, gammaB=0, hA=0, hB=0,
                    thetaA=1.0, thetaB=1.0):
    rho=float(rho); gammaA=float(gammaA); gammaB=float(gammaB);
    hA=float(hA); hB=float(hB); thetaA=float(thetaA); thetaB=float(thetaB)
    fname_template = 'phis_pts{0}_dt{1}_rho{2}_gammaA{3}_gammaB{4}_hA{5}_hB{6}_thetaA{7}_thetaB{8}.npz'
    fname = fname_template.format(pts,rho,dt,gammaA,gammaB,hA,hB,thetaA,thetaB)
    fname = os.path.join(cache_path, fname)
    try:
        fid = np.load(fname)
        yA,yB,phi = fid['arr_0'], fid['arr_1'], fid['arr_2']
        fid.close()
    except IOError:
        print('Calculating equilibrium phi from scratch.')
        x = numerics.grid(pts)

        yA = dadi.PhiManip.phi_1D(x, gamma = gammaA, h = hA, theta0 = thetaA)
        yB = dadi.PhiManip.phi_1D(x, gamma = gammaB, h = hB, theta0 = thetaB)

        phi = np.zeros((len(x),len(x),len(x)))
        yA, yB, phi = integration.advance(phi, x, 20., yA, yB, 1.0,
                                          gammaA, gammaB, hA, hB, rho,
                                          thetaA, thetaB, dt)
        np.savez(fname, yA, yB, phi)
    return yA, yB, phi
def set_cache_path(path='~/.dadi/TwoLocus_cache')

Set directory in which demographic equilibrium phi spectra will be cached.

The collection of cached spectra can get large, so it may be helpful to store them outside the user's home directory.

Expand source code
def set_cache_path(path='~/.dadi/TwoLocus_cache'):
    """
    Set directory in which demographic equilibrium phi spectra will be cached.

    The collection of cached spectra can get large, so it may be helpful to
    store them outside the user's home directory.
    """
    global cache_path
    cache_path = os.path.expanduser(path)
    if not os.path.isdir(cache_path):
        os.makedirs(cache_path)
def three_epoch(params, pts, ns, rho=0.0, dt=0.005, gammaA=0.0, gammaB=0.0, hA=0.5, hB=0.5, thetaA=1.0, thetaB=1.0)
Expand source code
def three_epoch(params, pts, ns, rho=0.0, dt=0.005, gammaA=0.0, gammaB=0.0,
                hA=0.5, hB=0.5, thetaA=1.0, thetaB=1.0):
    nu1,nu2,T1,T2 = params
    x = numerics.grid(pts)

    yA, yB, phi = equilibrium_phi(pts, rho, dt, gammaA, gammaB, hA, hB,
                                  thetaA, thetaB)

    yA,yB,phi = integration.advance(phi, x, T1, yA, yB, nu=nu1,
                                    gammaA=gammaA, gammaB=gammaB,
                                    hA=hA, hB=hB, rho=rho,
                                    thetaA=thetaA, thetaB=thetaB, dt=dt)

    yA,yB,phi = integration.advance(phi, x, T2, yA, yB, nu=nu2,
                                    gammaA=gammaA, gammaB=gammaB,
                                    hA=hA, hB=hB, rho=rho,
                                    thetaA=thetaA, thetaB=thetaB, dt=dt)

    fs = numerics.sample_cached(phi, ns, x)
    return fs
def two_epoch(params, pts, ns, rho=0.0, dt=0.005, gammaA=0.0, gammaB=0.0, hA=0.5, hB=0.5, thetaA=1.0, thetaB=1.0)
Expand source code
def two_epoch(params, pts, ns, rho=0.0, dt=0.005, gammaA=0.0, gammaB=0.0,
              hA=0.5, hB=0.5, thetaA=1.0, thetaB=1.0):
    nu,T = params

    x = numerics.grid(pts)
    yA, yB, phi = equilibrium_phi(pts, rho, dt, gammaA, gammaB, hA, hB,
                                  thetaA, thetaB)

    yA,yB,phi = integration.advance(phi, x, T, yA, yB, nu=nu,
                                    gammaA=gammaA, gammaB=gammaB,
                                    hA=hA, hB=hB, rho=rho,
                                    thetaA=thetaA, thetaB=thetaB, dt=dt)

    fs = numerics.sample_cached(phi, ns, x)
    return fs