"""
Unit and regression test for the atesa_v2 package.
"""
# Import package, test suite, and other packages as needed
import atesa
import pytest
import sys
import pytraj
import os
import glob
import shutil
import pickle
from atesa.configure import configure
from atesa import main
[docs]class Tests(object):
[docs] def setup_method(self, test_method):
try:
if not os.path.exists('atesa/tests/test_temp'):
os.mkdir('atesa/tests/test_temp')
os.chdir('atesa/tests/test_temp')
except FileNotFoundError:
pass
[docs] def test_atesa_v2_imported(self):
"""Sample test, will always pass so long as import statement worked"""
assert "atesa" in sys.modules
[docs] def test_main(self):
"""Tests main.main with DEBUG = True to skip actual job submission/monitoring"""
settings = configure('../../data/atesa.config')
settings.initial_coordinates = ['../test_data/test.rst7']
settings.topology = '../test_data/test.prmtop'
settings.degeneracy = 2
settings.overwrite = True
settings.resample = False
settings.DEBUG = True
assert main.main(settings) == 'ATESA run exiting normally'
[docs] def test_init_threads_new(self):
"""Tests successful initialization of new threads"""
settings = configure('../../data/atesa.config')
settings.initial_coordinates = ['../test_data/test.rst7', '../test_data/test_two_init.rst7']
settings.degeneracy = 1
allthreads = main.init_threads(settings)
assert len(allthreads) == 2
assert allthreads[0].history.init_inpcrd == ['test.rst7']
assert allthreads[1].history.init_inpcrd == ['test_two_init.rst7']
assert allthreads[0].topology == 'test.prmtop'
assert allthreads[1].topology == 'test.prmtop'
[docs] def test_init_threads_restart(self):
"""Tests successful initialization of restarted threads"""
settings = configure('../../data/atesa.config')
# First, make restart.pkl
settings.degeneracy = 1
settings.initial_coordinates = ['../test_data/test.rst7', '../test_data/test_two_init.rst7']
settings.rc_definition = '1.00 + 2.34*CV0 - 5.67*CV1'
settings.rc_reduced_cvs = False
settings.cvs = ['pytraj.distance(traj, \'@1 @2\')[0]', 'pytraj.angle(traj, \'@2 @3 @4\')[0]']
settings.include_qdot = False
settings.topology = '../test_data/test.prmtop'
allthreads = main.init_threads(settings)
allthreads[0].history.init_coords = [['../test_data/test_velocities_init.rst7', '../test_data/test_velocities_init_bwd.rst7'],
['../test_data/test_two_init.rst7', '../test_data/test_two_init_bwd.rst7']]
allthreads[0].history.prod_results = [['fwd', 'bwd'], ['bwd', 'bwd']]
allthreads[1].history.init_coords = [['../test_data/test_velocities_init.rst7', '../test_data/test_velocities_init_bwd.rst7'],
['../test_data/test_two_init.rst7', '../test_data/test_two_init_bwd.rst7']]
allthreads[1].history.prod_results = [['bwd', 'bwd'], ['fwd', 'bwd']]
allthreads[0].history.timestamps = [1, 3]
allthreads[1].history.timestamps = [2, 4]
pickle.dump(allthreads, open('restart.pkl', 'wb'), protocol=2)
# Then, reset settings, set restart = True, and try again
settings = configure('../../data/atesa.config')
settings.restart = True
settings.degeneracy = 1
allthreads = main.init_threads(settings)
assert len(allthreads) == 2
assert allthreads[0].history.prod_results == [['fwd', 'bwd'], ['bwd', 'bwd']]
assert allthreads[1].history.prod_results == [['bwd', 'bwd'], ['fwd', 'bwd']]
assert allthreads[0].topology == 'test.prmtop'
assert allthreads[1].topology == 'test.prmtop'
[docs] def test_thread_get_frame_amber(self):
"""Tests thread.get_frame method with md_engine = 'amber' and frame = -1"""
settings = configure('../../data/atesa.config')
settings.topology = '../test_data/test.prmtop'
settings.md_engine = 'amber'
settings.degeneracy = 1
allthreads = main.init_threads(settings)
allthreads[0].jobids.append('01234')
allthreads[0].history.prod_trajs.append(['../test_data/test.nc'])
compare_traj = pytraj.iterload('../test_data/test.rst7', allthreads[0].topology)
test_frame = allthreads[0].get_frame(allthreads[0].history.prod_trajs[0][0], -1, settings)
query_traj = pytraj.iterload(test_frame, allthreads[0].topology)
assert query_traj.n_frames == compare_traj.n_frames
assert pytraj.center_of_mass(query_traj) == pytest.approx(pytraj.center_of_mass(compare_traj), 1e-3)
[docs] def test_import_cvs(self):
"""Tests importing CVs and commitment definitions from a given settings.pkl file"""
#shutil.copy('../../data/atesa.config', 'temp.config')
open('temp.config', 'w').write('job_type = \'committor_analysis\'')
open('temp.config', 'a').write('\nbatch_system = \'slurm\'')
open('temp.config', 'a').write('\nrestart = False')
open('temp.config', 'a').write('\ntopology = \'../test_data/test.prmtop\'')
open('temp.config', 'a').write('\nworking_directory = \'./\'')
open('temp.config', 'a').write('\noverwrite = False')
open('temp.config', 'a').write('\nas_settings_file = \'../test_data/settings.pkl\'')
settings = configure('temp.config')
assert settings.cvs == ['pytraj.distance(traj, \'@1 @2\')[0]', 'pytraj.angle(traj, \'@2 @3 @4\')[0]']
assert settings.commit_fwd == [[1, 2], [3, 4], [1.5, 2.0], ['lt', 'gt']]
assert settings.commit_bwd == [[1, 2], [3, 4], [2.0, 1.5], ['gt', 'lt']]
[docs] @classmethod
def teardown_method(self, method):
"Runs at end of each method"
for filename in glob.glob(sys.path[0] + '/atesa/tests/test_temp/*'):
os.remove(filename)