예제 #1
0
def test_sq_form(form):
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))[:100]

    Q, S = structure_factor(trj,
                            Q_range=(0.5, 200),
                            framewise_rdf=False,
                            form=form)
예제 #2
0
def test_structure_factor(weighting_factor):
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))[:100]

    Q, S = structure_factor(trj,
                            Q_range=(0.5, 200),
                            framewise_rdf=False,
                            weighting_factor=weighting_factor)
예제 #3
0
def test_vhf_from_pvhf():
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))
    unique_atoms = get_unique_atoms(trj)
    tuples_combination = combinations_with_replacement(unique_atoms, 2)

    # obtaining g_r_t from total func
    chunk_length = 20
    r, t, g_r_t = compute_van_hove(trj, chunk_length=chunk_length)
    partial_dict = compute_van_hove(trj, chunk_length=chunk_length, partial=True)
    # obtating dict of np.array of pvhf
    partial_dict = {}

    for pairs in tuples_combination:
        pair1 = pairs[0]
        pair2 = pairs[1]
        # Set in alphabetical order
        if pairs[0].name > pairs[1].name:
            pair2 = pairs[0]
            pair1 = pairs[1]

        x = compute_partial_van_hove(
            trj,
            chunk_length=chunk_length,
            selection1=f"name {pair1.name}",
            selection2=f"name {pair2.name}",
        )
        partial_dict[pairs] = x[1]

    # obtaining total_grt from partial
    total_g_r_t = vhf_from_pvhf(trj, partial_dict)

    assert np.allclose(g_r_t, total_g_r_t)
예제 #4
0
def test_run_van_hove():
    trj = md.load(get_fn('spce.xtc'), top=get_fn('spce.gro'))

    chunk_length = 2
    n_chunks = 2

    run_total_vhf(trj, chunk_length, n_chunks)
예제 #5
0
def test_structure_factor():
    trj = md.load(get_fn('spce.xtc'), top=get_fn('spce.gro'))[:100]

    Q, S = structure_factor(trj,
                            Q_range=(0.5, 200),
                            framewise_rdf=False,
                            method='fz')
예제 #6
0
def test_invalid_sq_weigting_factor():
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))[:100]

    with pytest.raises(ValueError):
        Q, S = structure_factor(trj,
                                Q_range=(0.5, 200),
                                framewise_rdf=False,
                                weighting_factor="invalid")
예제 #7
0
def test_invalid_form_style():
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))[:100]

    with pytest.raises(ValueError):
        structure_factor(trj,
                         Q_range=(0.5, 200),
                         framewise_rdf=False,
                         form="random")
예제 #8
0
def test_van_hove_equal():
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))

    chunk_length = 2

    r_p, t_p, g_r_t_p = compute_van_hove(trj, chunk_length=chunk_length)
    r_s, t_s, g_r_t_s = compute_van_hove(trj, chunk_length=chunk_length, parallel=False)

    assert np.allclose(r_p, r_s)
    assert np.allclose(t_p, t_s)
    assert np.allclose(g_r_t_p, g_r_t_s)
예제 #9
0
def test_self_warning(parallel):
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))

    chunk_length = 2

    with pytest.warns(UserWarning, match=r"Total VHF"):
        compute_van_hove(
            trj,
            chunk_length=chunk_length,
            self_correlation=True,
            parallel=parallel,
        )
예제 #10
0
def test_self_partial_warning():
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))

    chunk_length = 2

    with pytest.warns(UserWarning, match=r"Partial VHF"):
        compute_partial_van_hove(
            trj,
            chunk_length=chunk_length,
            selection1="name O",
            selection2="name H",
            self_correlation=True,
        )
예제 #11
0
def test_pvhf_error_is_tuple():
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))
    unique_atoms = get_unique_atoms(trj)
    key = frozenset({unique_atoms[0], unique_atoms[1]})
    partial_dict = {}
    x = compute_partial_van_hove(
        trj,
        chunk_length=20,
        selection1="name O",
        selection2="name O",
    )
    partial_dict[key] = x[1]

    with pytest.raises(ValueError, match="Dictionary key not valid. Must be a tuple"):
        vhf_from_pvhf(trj, partial_dict)
예제 #12
0
def test_pvhf_error_is_atom_type():
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))
    unique_atoms = get_unique_atoms(trj)

    partial_dict = {}
    x = compute_partial_van_hove(
        trj,
        chunk_length=20,
        selection1="name O",
        selection2="name O",
    )
    partial_dict[("H", "O")] = x[1]

    with pytest.raises(
        ValueError, match="Dictionary key not valid. Must be type"
    ):
        vhf_from_pvhf(trj, partial_dict)
예제 #13
0
def test_pvhf_error_2_atoms_per_pair():
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))
    unique_atoms = get_unique_atoms(trj)

    partial_dict = {}
    x = compute_partial_van_hove(
        trj,
        chunk_length=20,
        selection1="name O",
        selection2="name O",
    )
    partial_dict[(unique_atoms[0], unique_atoms[1], unique_atoms[1])] = x[1]

    with pytest.raises(
        ValueError, match="Dictionary key not valid. Must only have 2 atoms per pair"
    ):
        vhf_from_pvhf(trj, partial_dict)
예제 #14
0
def test_run_total_vhf(step):
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))

    chunk_length = 4
    n_chunks = 5

    r, t, g_r_t = run_total_vhf(trj,
                                step=step,
                                chunk_length=chunk_length,
                                n_chunks=n_chunks)

    assert len(t) == chunk_length / step
    assert len(r) == 200
    assert np.shape(g_r_t) == (chunk_length / step, 200)

    # Check normalization to ~1
    assert 0.95 < np.mean(g_r_t[:, -10:]) < 1.05
예제 #15
0
def test_van_hove():
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))

    chunk_length = 2

    r, t, g_r_t = compute_van_hove(trj, chunk_length=chunk_length)

    assert len(t) == 2
    assert len(r) == 200
    assert np.shape(g_r_t) == (2, 200)

    # Check normalization to ~1
    assert 0.95 < np.mean(g_r_t[:, -10:]) < 1.05

    fig, ax = plt.subplots()
    for i in range(len(t)):
        ax.plot(r, g_r_t[i], ".-", label=t[i])
    ax.set_ylim((0, 3))
    ax.legend()
    fig.savefig("vhf.pdf")
예제 #16
0
def test_pvhf_error_atoms_in_trj():
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))
    unique_atoms = get_unique_atoms(trj)
    atom = md.core.topology.Atom(
        name="Na", element=md.core.element.sodium, index=0, residue=1
    )

    partial_dict = {}
    x = compute_partial_van_hove(
        trj,
        chunk_length=20,
        selection1="name O",
        selection2="name O",
    )
    partial_dict[(atom, unique_atoms[0])] = x[1]

    with pytest.raises(
        ValueError, match="Dictionary key not valid, `Atom`"
    ):
        vhf_from_pvhf(trj, partial_dict)
예제 #17
0
def test_run_partial_vhf(step):
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))

    chunk_length = 4
    n_chunks = 5

    combo = ["O", "O"]
    r, t, g_r_t = run_partial_vhf(
        trj,
        step=step,
        selection1=f"element {combo[0]}",
        selection2=f"element {combo[1]}",
        chunk_length=chunk_length,
        n_chunks=n_chunks,
    )

    assert len(t) == chunk_length / step
    assert len(r) == 200
    assert np.shape(g_r_t) == (chunk_length / step, 200)

    # Check normalization to ~1
    assert 0.95 < np.mean(g_r_t[:, -10:]) < 1.05
예제 #18
0
def test_local_maxima():
    data = np.loadtxt(get_fn('rdf.txt'))
    r = data[:, 0]
    g_r = data[:, 1]

    r_maxes = list()
    for i, r_guess in enumerate([0.3, 0.45, 0.65]):
        r_max, g_r_max = find_local_maxima(r, g_r, r_guess=r_guess)
        r_maxes.append(r_max)

    r_mins = list()
    for i, r_guess in enumerate([0.3, 0.5]):
        r_min, g_r_min = find_local_minima(r, g_r, r_guess=r_guess)
        r_mins.append(r_min)
    print(r_mins)

    assert np.allclose(r_maxes, [0.2775, 0.4375, 0.6675])
    assert np.allclose(r_mins, [0.3325, 0.5575])
예제 #19
0
def test_local_maxima():
    """ Find maxs and mins for O-O RDF of SPC/E water"""
    data = np.loadtxt(get_fn('rdf.txt'))
    r = data[:, 0]
    g_r = data[:, 1]

    r_maxes = list()
    for i, r_guess in enumerate([0.3, 0.45, 0.65]):
        r_max, g_r_max = find_local_maxima(r, g_r, r_guess=r_guess)
        r_maxes.append(r_max)

    r_mins = list()
    for i, r_guess in enumerate([0.3, 0.5]):
        r_min, g_r_min = find_local_minima(r, g_r, r_guess=r_guess)
        r_mins.append(r_min)
    print(r_mins)

    assert np.allclose(r_maxes, [0.2725, 0.4475, 0.6775])
    assert np.allclose(r_mins, [0.3325, 0.5625])
예제 #20
0
import numpy as np
import matplotlib.pyplot as plt

from scattering.utils.features import *
from scattering.utils.io import get_fn

#  Load data
data = np.loadtxt(get_fn('rdf.txt'))
r = data[:, 0]
g_r = data[:, 1]

fig, ax = plt.subplots()
ax.plot(r, g_r, '-')

for i, r_guess in enumerate([0.3, 0.45, 0.65]):
    r_max, g_r_max = find_local_maxima(r, g_r, r_guess=r_guess)
    plt.plot(r_max, g_r_max, 'k.')

for i, r_guess in enumerate([0.3, 0.5]):
    r_min, g_r_min = find_local_minima(r, g_r, r_guess=r_guess)
    plt.plot(r_min, g_r_min, 'r.')

ax.set_xlabel(r'Radial coordinate, $r$, $nm$')
ax.set_ylabel(r'Radial distribution function, $g(r)$, $unitiless$')
plt.savefig('maxima-minima.pdf')
예제 #21
0
def test_serial_van_hove():
    trj = md.load(get_fn("spce.xtc"), top=get_fn("spce.gro"))

    chunk_length = 2

    r, t, g_r_t = compute_van_hove(trj, chunk_length=chunk_length, parallel=False)
예제 #22
0
import numpy as np
import mdtraj as md
import matplotlib.pyplot as plt

from scattering.scattering import compute_van_hove
from scattering.utils.io import get_fn
from scattering.utils.utils import get_dt
from scattering.utils.features import find_local_maxima

trj = md.load(get_fn('10fs.xtc'),
              top=get_fn('10fs.gro'),
              stride=1,
              )[:10000]

chunk_length = 200
selection1 = 'name O'
selection2 = 'name O'

r, t, g_r_t = compute_van_hove(trj=trj, chunk_length=chunk_length, water=True,
                               r_range=(0, 0.8), bin_width=0.001, periodic=True, opt=True)

dt = get_dt(trj)

# Save output to text files
np.savetxt('vhf.txt', g_r_t, header='# Van Hove Function, dt: {} fs, dr: {}'.format(
    dt,
    np.unique(np.round(np.diff(trj.time), 6))[0],
))
np.savetxt('r.txt', r, header='# Times, ps')
np.savetxt('t.txt', t, header='# Positions, nm')