msspec_python3/msspec/tests.py

152 lines
4.4 KiB
Python

# coding: utf-8
from msspec.calculator import MSSPEC
from msspec.utils import *
from msspec.misc import set_log_level
from ase.build import bulk
from hashlib import md5
from pickle import dumps
import unittest
import sys
import os
set_log_level('error')
RESULTS_FILENAME = os.path.join(os.path.dirname(__file__), 'results.txt')
def perform_test(obj, funcname, filename=RESULTS_FILENAME):
f = getattr(obj, '_' + funcname)
output = md5(dumps(f())).hexdigest()
results = {}
with open(filename, 'r') as fd:
for line in fd:
k, v = line.split()
results[k] = v
k = '{}.{}'.format(obj.__class__.__name__, funcname)
obj.assertEqual(output, results[k])
class UtilsTestCase(unittest.TestCase):
def setUp(self):
self.a0 = 3.6
self.cluster = bulk('Cu', a=self.a0, cubic=True)
self.cluster = self.cluster.repeat((4, 4, 4))
center_cluster(self.cluster)
def _test_base_cluster(self):
output = self.cluster
output = output.get_positions()
return output
def _test_cut_sphere(self):
output = cut_sphere(self.cluster, radius=self.a0 + .01)
output = output.get_positions()
return output
def _test_cut_plane(self):
output = cut_plane(self.cluster, z=0.1)
output = output.get_positions()
return output
def test_base_cluster(self):
return perform_test(self, 'test_base_cluster')
def test_cut_sphere(self):
return perform_test(self, 'test_cut_sphere')
def test_cut_plane(self):
return perform_test(self, 'test_cut_plane')
def runTest(self):
pass
class PEDCopperTestCase(unittest.TestCase):
def setUp(self):
a0 = 3.6 # The lattice parameter in angstroms
# Create the copper cubic cell
cluster = bulk('Cu', a=a0, cubic=True)
# Repeat the cell many times along x, y and z
cluster = cluster.repeat((4, 4, 4))
# Put the center of the structure at the origin
center_cluster(cluster)
# Keep atoms inside a given radius
cluster = cut_sphere(cluster, radius=a0 + .01)
# Keep only atoms below the plane z <= 0
cluster = cut_plane(cluster, z=0.1)
# Set the absorber (the deepest atom centered in the xy-plane)
cluster.absorber = get_atom_index(cluster, 0, 0, -a0)
# Create a calculator for the PhotoElectron Diffration
self.calc = MSSPEC(spectroscopy='PED', txt=None)
# Set the cluster to use for the calculation
self.calc.set_atoms(cluster)
def _test_theta_scan(self):
# Run the calculation
data = self.calc.get_theta_scan(level='2p3/2')
return data[-1].cross_section
#data.save('theta.hdf5')
#return data[-1]
def _test_phi_scan(self):
# Run the calculation
data = self.calc.get_phi_scan(level='2p3/2', theta=35.)
return data[-1].cross_section
def test_theta_scan(self):
perform_test(self, 'test_theta_scan')
def test_phi_scan(self):
perform_test(self, 'test_phi_scan')
def runTest(self):
pass
def tearDown(self):
self.calc.shutdown()
def run_tests():
suite = unittest.TestSuite()
suite.addTest(UtilsTestCase('test_base_cluster'))
suite.addTest(UtilsTestCase('test_cut_sphere'))
suite.addTest(UtilsTestCase('test_cut_plane'))
suite.addTest(PEDCopperTestCase('test_phi_scan'))
suite.addTest(PEDCopperTestCase('test_theta_scan'))
runner = unittest.TextTestRunner(verbosity=2)
rc = runner.run(suite)
exit(rc)
def create_tests_results():
with open(RESULTS_FILENAME, 'w') as fd:
pass
def create_results(obj, *funcs, **kwargs):
obj.setUp()
with open(RESULTS_FILENAME, 'a') as fd:
for funcname in funcs:
clsname = obj.__class__.__name__
print(('Generating results for test: {}.{}'.format(clsname, funcname)))
o = getattr(obj, '_' + funcname)()
k = '{}.{}'.format(obj.__class__.__name__, funcname)
fd.write('{} {}\n'.format(k, md5(dumps(o)).hexdigest()))
obj.tearDown()
tc = UtilsTestCase()
create_results(tc, 'test_base_cluster')
create_results(tc, 'test_cut_sphere')
create_results(tc, 'test_cut_plane')
tc = PEDCopperTestCase()
create_results(tc, 'test_phi_scan')
create_results(tc, 'test_theta_scan')
def delete_results_file():
os.remove(RESULTS_FILENAME)