forked from npshub/mantid
-
Notifications
You must be signed in to change notification settings - Fork 0
/
AbinsPowderDataTest.py
89 lines (75 loc) · 4.09 KB
/
AbinsPowderDataTest.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# Mantid Repository : https://github.com/mantidproject/mantid
#
# Copyright © 2020 ISIS Rutherford Appleton Laboratory UKRI,
# NScD Oak Ridge National Laboratory, European Spallation Source,
# Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
# SPDX - License - Identifier: GPL - 3.0 +
import unittest
import numpy as np
from abins import PowderData
class AbinsPowderDataTest(unittest.TestCase):
def setUp(self):
# hypothetical data for two atoms
self.good_items = {
"a_tensors": {0: np.asarray([[[0.01, 0.02, 0.03],
[0.01, 0.02, 0.03],
[0.01, 0.02, 0.03]],
[[0.01, 0.02, 0.03],
[0.01, 0.02, 0.03],
[0.01, 0.02, 0.03]]])},
"b_tensors": {0: np.asarray([[[0.01, 0.02, 0.03],
[0.01, 0.02, 0.03],
[0.01, 0.02, 0.03]],
[[0.01, 0.02, 0.03],
[0.01, 0.02, 0.03],
[0.01, 0.02, 0.03]]])},
"frequencies": {0: np.asarray([2.34, 5.67, 8.90])}}
def test_bad_num_atoms(self):
# wrong number of atoms
with self.assertRaises(ValueError):
PowderData(**self.good_items, num_atoms=-2)
def test_bad_items(self):
# wrong items: array instead of dict
bad_items = self.good_items.copy()
bad_items['a_tensors'] = bad_items['a_tensors'][0]
with self.assertRaises(TypeError):
PowderData(**bad_items, num_atoms=2)
# list instead of np array
bad_items = self.good_items.copy()
for key, value in bad_items.items():
bad_items[key][0] = value[0].tolist()
with self.assertRaises(TypeError):
PowderData(**bad_items, num_atoms=2)
# wrong size of items: data only for one atom ; should be for two atoms
bad_items = {"a_tensors": {0: np.asarray([[[0.01, 0.02, 0.03], [0.01, 0.02, 0.03], [0.01, 0.02, 0.03]]])},
"b_tensors": {0: np.asarray([[[0.01, 0.02, 0.03], [0.01, 0.02, 0.03], [0.01, 0.02, 0.03]]])},
"frequencies": {0: np.asarray([[[1.23, 4.56, 7.89]]])}}
with self.assertRaises(ValueError):
PowderData(**bad_items, num_atoms=2)
def test_good_case(self):
good_powderdata = PowderData(**self.good_items, num_atoms=2)
extracted_data = good_powderdata.extract()
for key in self.good_items:
for k_index in self.good_items[key]:
self.assertTrue(np.allclose(self.good_items[key][k_index],
extracted_data[key][str(k_index)]))
# Should also work if num_atoms is not given
PowderData(**self.good_items)
def test_roundtrip(self):
initial_powderdata = PowderData(**self.good_items, num_atoms=2)
roundtrip_data = PowderData.from_extracted(initial_powderdata.extract())
for attr in 'get_a_tensors', 'get_b_tensors', 'get_frequencies':
for k_index in self.good_items['a_tensors']:
self.assertTrue(np.allclose(getattr(initial_powderdata, attr)()[k_index],
getattr(roundtrip_data, attr)()[k_index]))
def test_getters(self):
good_powderdata = PowderData(**self.good_items, num_atoms=2)
for k_point in self.good_items["a_tensors"]:
self.assertTrue(np.allclose(self.good_items["a_tensors"][k_point],
good_powderdata.get_a_tensors()[k_point]))
self.assertTrue(np.allclose(self.good_items["b_tensors"][k_point],
good_powderdata.get_b_tensors()[k_point]))
self.assertTrue(np.allclose(self.good_items["frequencies"][k_point],
good_powderdata.get_frequencies()[k_point]))
if __name__ == '__main__':
unittest.main()