def test_isAllowedUnitCell_cubic(self): cubic = UnitCell(6, 6, 6) tetragonal = UnitCell(6, 6, 6.01) sg = SpaceGroupFactory.createSpaceGroup('P m -3') self.assertTrue(sg.isAllowedUnitCell(cubic)) self.assertFalse(sg.isAllowedUnitCell(tetragonal))
def test_simple_constructor(self): u1 = UnitCell() self.assertEquals(u1.a1(), 1) self.assertEquals(u1.alpha(), 90) u2 = UnitCell(3,4,5) self.assertAlmostEquals(u2.b1(),1./3., 10) self.assertAlmostEquals(u2.alphastar(), 90, 10) u4 = u2 self.assertAlmostEquals(u4.volume(),1./u2.recVolume(),10) u2.seta(3); self.assertAlmostEquals(u2.a(),3,10)
def test_setModVec_accepts_v3d(self): unit = UnitCell(3, 3, 3) vectors = (V3D(1, 2, 3), V3D(2, 1, 3), V3D(3, 2, 1)) unit.setModVec1(vectors[0]) unit.setModVec2(vectors[1]) unit.setModVec3(vectors[2]) for index, expected in enumerate(vectors): self.assertEquals(vectors[index], unit.getModVec(index))
def test_isAllowedUnitCell_trigonal(self): rhombohedral = UnitCell(5, 5, 5, 80, 80, 80) hexagonal = UnitCell(5, 5, 4, 90, 90, 120) sgRh = SpaceGroupFactory.createSpaceGroup('R -3 c :r') sgHex = SpaceGroupFactory.createSpaceGroup('R -3 c') sgP6m = SpaceGroupFactory.createSpaceGroup('P 6/m') self.assertTrue(sgRh.isAllowedUnitCell(rhombohedral)) self.assertFalse(sgRh.isAllowedUnitCell(hexagonal)) self.assertTrue(sgHex.isAllowedUnitCell(hexagonal)) self.assertFalse(sgHex.isAllowedUnitCell(rhombohedral)) self.assertTrue(sgP6m.isAllowedUnitCell(hexagonal)) self.assertFalse(sgP6m.isAllowedUnitCell(rhombohedral))
def test_getSumWeights_hexagonal(self): cell = UnitCell(2, 2, 3, 90, 90, 120) matrix = self.builder._getMetricDependentWeights(cell) expected = np.array([[4. / 3., -2. / 3., 0.0], [-2. / 3., 4. / 3., 0.0], [0.0, 0.0, 1.0]]) self.assertTrue(np.all(np.abs(matrix - expected) < 1.e-9))
def test_getSumWeights_orthorhombic(self): cell = UnitCell(1, 2, 3, 90, 90, 90) matrix = self.builder._getMetricDependentWeights(cell) expected = np.array([[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]) self.assertTrue(np.all(np.abs(matrix - expected) < 1.e-9))
def test_to_string(self): unit = UnitCell(3, 3, 3) expected_str = "UnitCell with lattice parameters: a = 3 b = 3 c = 3 "\ "alpha = 90 beta = 90 gamma = 90" expected_repr = "UnitCell(3, 3, 3, 90, 90, 90)" self.assertEqual(expected_str, str(unit)) self.assertEqual(expected_repr, unit.__repr__()) newUnit = eval(unit.__repr__()) self.assertEqual(unit.a(), newUnit.a()) self.assertEqual(unit.b(), newUnit.b()) self.assertEqual(unit.c(), newUnit.c()) self.assertEqual(unit.alpha(), newUnit.alpha()) self.assertEqual(unit.beta(), newUnit.beta()) self.assertEqual(unit.gamma(), newUnit.gamma())
def test_numpy_array_conversion(self): row0 = (0.162546756312, 0.00815256992072, -0.00145274558861) row1 = (row0[1], 0.028262965555, 0.00102046431298) row2 = (row0[2], row1[2], 0.0156808990098) gstar = np.array([row0, row1, row2]) u = UnitCell() testhelpers.assertRaisesNothing(self, u.recalculateFromGstar, gstar) self._check_cell(u)
def __init__(self, cifFile=None): if cifFile is not None: cifData = cifFile[list(cifFile.keys())[0]] self.spaceGroup = SpaceGroupBuilder(cifData).spaceGroup self.unitCell = UnitCellBuilder(cifData).unitCell self.atoms = AtomListBuilder(cifData, UnitCell(*[float(removeErrorEstimateFromNumber(x)) for x in self.unitCell.split()])).atomList
def test_getReciprocalLengthMatrix(self): cell = UnitCell(1, 2, 3) matrix = self.builder._getReciprocalLengthSquaredMatrix(cell) expected = np.array([[(1.0 / 1.0 * 1.0 / 1.0), (1.0 / 1.0 * 1.0 / 2.0), (1.0 / 1.0 * 1.0 / 3.0)], [(1.0 / 2.0 * 1.0 / 1.0), (1.0 / 2.0 * 1.0 / 2.0), (1.0 / 2.0 * 1.0 / 3.0)], [(1.0 / 3.0 * 1.0 / 1.0), (1.0 / 3.0 * 1.0 / 2.0), (1.0 / 3.0 * 1.0 / 3.0)]]) self.assertTrue(np.all(matrix == expected))
def test_isInvariant_tolerance(self): pg3barHex = PointGroupFactory.createPointGroup('-3') pg3barRh = PointGroupFactory.createPointGroup('-3 r') cellHex = UnitCell(3, 3, 6, 90, 90, 120) cellRh = UnitCell(3, 3, 3, 75, 75, 75) self.assertTrue(pg3barHex.isInvariant(cellHex.getG())) self.assertFalse(pg3barHex.isInvariant(cellRh.getG())) self.assertTrue(pg3barRh.isInvariant(cellRh.getG())) self.assertFalse(pg3barRh.isInvariant(cellHex.getG()))
def test_find_indexing_with_non_orthogonal_cell(self): cell = UnitCell(1, 1, 1, 90, 95, 103) cart_cell = cell.getB() qs = np.array([ [.5, 0, 0], [0, .5, 0], [0, 0, .5], [0, 0, .25], ]) qs = np.dot(qs, cart_cell) indices = indexing.index_q_vectors(qs) expected_indexing = np.array([[0, 0, 1], [0, 1, 0], [2, 0, 0], [1, 0, 0]]) npt.assert_equal(indices, expected_indexing, err_msg="Indexing does not match expected.")
def test_to_string(self): unit = UnitCell(3,3,3) expected_str = "UnitCell with lattice parameters: a = 3 b = 3 c = 3 "\ "alpha = 90 beta = 90 gamma = 90" expected_repr = "UnitCell(3, 3, 3, 90, 90, 90)" self.assertEqual(expected_str, str(unit)) self.assertEqual(expected_repr, unit.__repr__()) newUnit = eval(unit.__repr__()) self.assertEqual(unit.a(), newUnit.a()) self.assertEqual(unit.b(), newUnit.b()) self.assertEqual(unit.c(), newUnit.c()) self.assertEqual(unit.alpha(), newUnit.alpha()) self.assertEqual(unit.beta(), newUnit.beta()) self.assertEqual(unit.gamma(), newUnit.gamma())
def test_find_bases_with_non_orthogonal_cell(self): cell = UnitCell(1, 1, 1, 90, 95, 103) cart_cell = cell.getB() qs = np.array([ [.5, 0, 0], [0, .5, 0], [0, 0, .5], [0, 0, .25], ]) qs = np.dot(qs, cart_cell) ndim, bases = indexing.find_bases(qs, 1e-5) self.assertEqual(ndim, 3, "Number of dimensions must be 3") expected_bases = np.array([[0., 0., 0.25], [0., .5, 0.], [0.51521732, 0.11589868, 0.04490415]]) npt.assert_almost_equal(bases, expected_bases, err_msg="Basis vectors do not match")
def test_find_bases_with_non_orthogonal_cell(self): cell = UnitCell(1, 1, 1, 90, 95, 103) cart_cell = cell.getB() qs = np.array([ [.5, 0, 0], [0, .5, 0], [0, 0, .5], [0, 0, .25], ]) qs = np.dot(qs, cart_cell) ndim, bases = indexing.find_bases(qs, 1e-5) self.assertEqual(ndim, 3, "Number of dimensions must be 3") expected_bases = np.array([ [0., 0., 0.25], [0., .5, 0.], [0.51521732, 0.11589868, 0.04490415] ]) npt.assert_almost_equal(bases, expected_bases, err_msg="Basis vectors do not match")
def test_find_indexing_with_non_orthogonal_cell(self): cell = UnitCell(1, 1, 1, 90, 95, 103) cart_cell = cell.getB() qs = np.array([ [.5, 0, 0], [0, .5, 0], [0, 0, .5], [0, 0, .25], ]) qs = np.dot(qs, cart_cell) indices = indexing.index_q_vectors(qs) expected_indexing = np.array([ [0, 0, 1], [0, 1, 0], [2, 0, 0], [1, 0, 0] ]) npt.assert_equal(indices, expected_indexing, err_msg="Indexing does not match expected.")
def test_getAtoms_aniso_b_orthogonal(self): bElements = {'11': [u'1.0', u'2.0'], '12': [u'0.0', u'0.0'], '13': [u'0.0', u'0.0'], '22': [u'1.0', u'2.0'], '23': [u'0.0', u'0.0'], '33': [u'4.0', u'5.0']} bDict = dict([(u'_atom_site_aniso_b_{0}'.format(key), value) for key, value in iteritems(bElements)]) bDict.update(dict([(u'_atom_site_label', [u'Si', u'Al']), (u'_atom_site_aniso_label', [u'Si', u'Al']) ])) data = self._getData(bDict) cell = UnitCell(5.4, 4.3, 3.2) self.assertEqual(self.builder._getAtoms(data, cell), 'Si 1/8 1/8 1/8 1.0 0.02533;Al 0.34 0.56 0.23 1.0 0.038')
def test_getAtoms_aniso_u_orthogonal(self): uElements = {'11': [u'0.01', u'0.02'], '12': [u'0.0', u'0.0'], '13': [u'0.0', u'0.0'], '22': [u'0.01', u'0.02'], '23': [u'0.0', u'0.0'], '33': [u'0.04', u'0.05']} uDict = dict([(u'_atom_site_aniso_u_{0}'.format(key), value) for key, value in iteritems(uElements)]) uDict.update(dict([(u'_atom_site_label', [u'Si', u'Al']), (u'_atom_site_aniso_label', [u'Si', u'Al']) ])) data = self._getData(uDict) cell = UnitCell(5.4, 4.3, 3.2) # u_equiv should be (0.01 + 0.01 + 0.04)/3 = 0.02 and (0.2 + 0.2 + 0.5)/3 = 0.03 self.assertEqual(self.builder._getAtoms(data, cell), 'Si 1/8 1/8 1/8 1.0 0.02;Al 0.34 0.56 0.23 1.0 0.03')
def test_getAtoms_iso_preferred(self): uElements = {'11': [u'0.01', u'0.02'], '12': [u'0.0', u'0.0'], '13': [u'0.0', u'0.0'], '22': [u'0.01', u'0.02'], '23': [u'0.0', u'0.0'], '33': [u'0.04', u'0.05']} uDict = dict([(u'_atom_site_aniso_u_{0}'.format(key), value) for key, value in iteritems(uElements)]) uDict.update(dict([(u'_atom_site_label', [u'Si', u'Al']), (u'_atom_site_aniso_label', [u'Si', u'Al']), (u'_atom_site_u_iso_or_equiv', [u'0.01', u'0.02']) ])) data = self._getData(uDict) cell = UnitCell(5.4, 4.3, 3.2) self.assertEqual(self.builder._getAtoms(data, cell), 'Si 1/8 1/8 1/8 1.0 0.01;Al 0.34 0.56 0.23 1.0 0.02')
def test_getModVec_returns_v3d(self): unit = UnitCell(3, 3, 3) self.assertTrue(isinstance(unit.getModVec(0), V3D)) self.assertTrue(isinstance(unit.getModVec(1), V3D)) self.assertTrue(isinstance(unit.getModVec(2), V3D))
def test_simple_constructor(self): u1 = UnitCell() self.assertEquals(u1.a1(), 1) self.assertEquals(u1.alpha(), 90) u2 = UnitCell(3, 4, 5) self.assertAlmostEquals(u2.b1(), 1. / 3., 10) self.assertAlmostEquals(u2.alphastar(), 90, 10) u4 = u2 self.assertAlmostEquals(u4.volume(), 1. / u2.recVolume(), 10) u2.seta(3) self.assertAlmostEquals(u2.a(), 3, 10)
def test_getMaxOrder_returns_int(self): unit = UnitCell(3, 3, 3) self.assertTrue(isinstance(unit.getMaxOrder(), int))
def test_setMaxOrder_accepts_int(self): unit = UnitCell(3, 3, 3) unit.setMaxOrder(2) self.assertEquals(2, unit.getMaxOrder())