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)
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)
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)
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)
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')
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")
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")
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)
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, )
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, )
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)
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)
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)
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
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")
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)
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
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])
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])
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')
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)
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')