Пример #1
0
    def testinterplanarangle_triclinic(self):
        lat = self.triclinic

        s11 = lat.b ** 2 * lat.c ** 2 * sin(lat.alpha) ** 2
        s22 = lat.a ** 2 * lat.c ** 2 * sin(lat.beta) ** 2
        s33 = lat.a ** 2 * lat.b ** 2 * sin(lat.gamma) ** 2
        s12 = lat.a * lat.b * lat.c ** 2 * (cos(lat.alpha) * cos(lat.beta) - cos(lat.gamma))
        s23 = lat.a ** 2 * lat.b * lat.c * (cos(lat.beta) * cos(lat.gamma) - cos(lat.alpha))
        s13 = lat.a * lat.b ** 2 * lat.c * (cos(lat.gamma) * cos(lat.alpha) - cos(lat.beta))
        v = lat.a * lat.b * lat.c * sqrt(1 - cos(lat.alpha) ** 2 - \
                                         cos(lat.beta) ** 2 - \
                                         cos(lat.gamma) ** 2 + \
                                         2 * cos(lat.alpha) * cos(lat.beta) * cos(lat.gamma))

        equation = lambda lat, h1, k1, l1, h2, k2, l2: \
            d1 * d2 / v ** 2 * (s11 * h1 * h2 + \
                                s22 * k1 * k2 + \
                                s33 * l1 * l2 + \
                                s23 * (k1 * l2 + k2 * l1) + \
                                s13 * (l1 * h2 + l2 * h1) + \
                                s12 * (h1 * k2 + h2 * k1))

        for plane1 in self.planes:
            for plane2 in self.planes:
                d1 = calculations.planespacing(plane1, self.triclinic)
                d2 = calculations.planespacing(plane2, self.triclinic)
                angle = calculations.interplanarangle(plane1, plane2, self.triclinic)
                args = copy.deepcopy(plane1)
                args.extend(plane2)
                expected_angle = acos(equation(self.triclinic, *args))
                self.assertAlmostEqual(angle, expected_angle, 6)
Пример #2
0
    def testinterplanarangle_triclinic(self):
        lat = self.triclinic

        s11 = lat.b**2 * lat.c**2 * sin(lat.alpha)**2
        s22 = lat.a**2 * lat.c**2 * sin(lat.beta)**2
        s33 = lat.a**2 * lat.b**2 * sin(lat.gamma)**2
        s12 = lat.a * lat.b * lat.c**2 * (cos(lat.alpha) * cos(lat.beta) -
                                          cos(lat.gamma))
        s23 = lat.a**2 * lat.b * lat.c * (cos(lat.beta) * cos(lat.gamma) -
                                          cos(lat.alpha))
        s13 = lat.a * lat.b**2 * lat.c * (cos(lat.gamma) * cos(lat.alpha) -
                                          cos(lat.beta))
        v = lat.a * lat.b * lat.c * sqrt(1 - cos(lat.alpha) ** 2 - \
                                         cos(lat.beta) ** 2 - \
                                         cos(lat.gamma) ** 2 + \
                                         2 * cos(lat.alpha) * cos(lat.beta) * cos(lat.gamma))

        equation = lambda lat, h1, k1, l1, h2, k2, l2: \
            d1 * d2 / v ** 2 * (s11 * h1 * h2 + \
                                s22 * k1 * k2 + \
                                s33 * l1 * l2 + \
                                s23 * (k1 * l2 + k2 * l1) + \
                                s13 * (l1 * h2 + l2 * h1) + \
                                s12 * (h1 * k2 + h2 * k1))

        for plane1 in self.planes:
            for plane2 in self.planes:
                d1 = calculations.planespacing(plane1, self.triclinic)
                d2 = calculations.planespacing(plane2, self.triclinic)
                angle = calculations.interplanarangle(plane1, plane2,
                                                      self.triclinic)
                args = copy.deepcopy(plane1)
                args.extend(plane2)
                expected_angle = acos(equation(self.triclinic, *args))
                self.assertAlmostEqual(angle, expected_angle, 6)
Пример #3
0
    def _compute_reflectors(self):
        reflectors = set()

        indices_range = range(-self._maxindice, self._maxindice + 1)

        for h in indices_range:
            for k in indices_range:
                for l in indices_range:
                    if h == 0 and k == 0 and l == 0: continue # Skip null plane

                    # Create plane
                    # Only look at positive planes since negative plane are equivalent
                    p = plane.Plane(h, k, l)
                    p.positive()

                    # Calculate the intensities
                    intensity = \
                        calculations.diffraction_intensity(p, self._unitcell,
                                                           self._atoms,
                                                           self._scatter)
                    maxintensity = \
                        calculations.diffraction_maxintensity(self._unitcell,
                                                              self._atoms,
                                                              self._scatter)

                    # Check if the plane diffracts
                    if calculations._is_diffracting(intensity, maxintensity):
                        planespacing = calculations.planespacing(p, self._unitcell)
                        reflector = Reflector(p, planespacing, intensity)
                        reflectors.add(reflector)

        return reflectors
Пример #4
0
    def testplanespacing_triclinic(self):
        lat = self.triclinic

        s11 = lat.b ** 2 * lat.c ** 2 * sin(lat.alpha) ** 2
        s22 = lat.a ** 2 * lat.c ** 2 * sin(lat.beta) ** 2
        s33 = lat.a ** 2 * lat.b ** 2 * sin(lat.gamma) ** 2
        s12 = lat.a * lat.b * lat.c ** 2 * (cos(lat.alpha) * cos(lat.beta) - cos(lat.gamma))
        s23 = lat.a ** 2 * lat.b * lat.c * (cos(lat.beta) * cos(lat.gamma) - cos(lat.alpha))
        s13 = lat.a * lat.b ** 2 * lat.c * (cos(lat.gamma) * cos(lat.alpha) - cos(lat.beta))
        v = lat.a * lat.b * lat.c * sqrt(1 - cos(lat.alpha) ** 2 - \
                                         cos(lat.beta) ** 2 - \
                                         cos(lat.gamma) ** 2 + \
                                         2 * cos(lat.alpha) * cos(lat.beta) * cos(lat.gamma))

        equation = lambda h, k, l: \
            (1.0 / v ** 2) * (s11 * h ** 2 + \
                              s22 * k ** 2 + \
                              s33 * l ** 2 + \
                              2 * s12 * h * k + \
                              2 * s23 * k * l + \
                              2 * s13 * h * l)

        for plane in self.planes:
            spacing = calculations.planespacing(plane, self.triclinic)
            expected_spacing = 1.0 / sqrt(equation(*plane))
            self.assertAlmostEqual(spacing, expected_spacing)
Пример #5
0
    def testplanespacing_cubic(self):
        equation = lambda lat, h, k, l: (h ** 2 + k ** 2 + l ** 2) / lat.a ** 2

        for plane in self.planes:
            spacing = calculations.planespacing(plane, self.cubic)
            expected_spacing = 1.0 / sqrt(equation(self.cubic, *plane))
            self.assertAlmostEqual(spacing, expected_spacing)
Пример #6
0
    def testplanespacing_triclinic(self):
        lat = self.triclinic

        s11 = lat.b**2 * lat.c**2 * sin(lat.alpha)**2
        s22 = lat.a**2 * lat.c**2 * sin(lat.beta)**2
        s33 = lat.a**2 * lat.b**2 * sin(lat.gamma)**2
        s12 = lat.a * lat.b * lat.c**2 * (cos(lat.alpha) * cos(lat.beta) -
                                          cos(lat.gamma))
        s23 = lat.a**2 * lat.b * lat.c * (cos(lat.beta) * cos(lat.gamma) -
                                          cos(lat.alpha))
        s13 = lat.a * lat.b**2 * lat.c * (cos(lat.gamma) * cos(lat.alpha) -
                                          cos(lat.beta))
        v = lat.a * lat.b * lat.c * sqrt(1 - cos(lat.alpha) ** 2 - \
                                         cos(lat.beta) ** 2 - \
                                         cos(lat.gamma) ** 2 + \
                                         2 * cos(lat.alpha) * cos(lat.beta) * cos(lat.gamma))

        equation = lambda h, k, l: \
            (1.0 / v ** 2) * (s11 * h ** 2 + \
                              s22 * k ** 2 + \
                              s33 * l ** 2 + \
                              2 * s12 * h * k + \
                              2 * s23 * k * l + \
                              2 * s13 * h * l)

        for plane in self.planes:
            spacing = calculations.planespacing(plane, self.triclinic)
            expected_spacing = 1.0 / sqrt(equation(*plane))
            self.assertAlmostEqual(spacing, expected_spacing)
Пример #7
0
    def testplanespacing_cubic(self):
        equation = lambda lat, h, k, l: (h**2 + k**2 + l**2) / lat.a**2

        for plane in self.planes:
            spacing = calculations.planespacing(plane, self.cubic)
            expected_spacing = 1.0 / sqrt(equation(self.cubic, *plane))
            self.assertAlmostEqual(spacing, expected_spacing)
Пример #8
0
    def testinterplanarangle_monoclinic(self):
        equation = lambda lat, h1, k1, l1, h2, k2, l2: \
          d1 * d2 / sin(lat.beta) ** 2 * \
          (h1 * h2 / lat.a ** 2 + \
           k1 * k2 * sin(lat.beta) ** 2 / lat.b ** 2 + \
           l1 * l2 / lat.c ** 2 - \
           (l1 * h2 + l2 * h1) * cos(lat.beta) / (lat.a * lat.c))

        for plane1 in self.planes:
            for plane2 in self.planes:
                d1 = calculations.planespacing(plane1, self.monoclinic)
                d2 = calculations.planespacing(plane2, self.monoclinic)
                angle = calculations.interplanarangle(plane1, plane2, self.monoclinic)
                args = copy.deepcopy(plane1)
                args.extend(plane2)
                expected_angle = acos(equation(self.monoclinic, *args))
                self.assertAlmostEqual(angle, expected_angle, 6)
Пример #9
0
    def testplanespacing_tetragonal(self):
        equation = lambda lat, h, k, l: (h ** 2 + k ** 2) / lat.a ** 2 + \
                                        l ** 2 / lat.c ** 2

        for plane in self.planes:
            spacing = calculations.planespacing(plane, self.tetragonal)
            expected_spacing = 1.0 / sqrt(equation(self.tetragonal, *plane))
            self.assertAlmostEqual(spacing, expected_spacing)
Пример #10
0
    def testplanespacing_tetragonal(self):
        equation = lambda lat, h, k, l: (h ** 2 + k ** 2) / lat.a ** 2 + \
                                        l ** 2 / lat.c ** 2

        for plane in self.planes:
            spacing = calculations.planespacing(plane, self.tetragonal)
            expected_spacing = 1.0 / sqrt(equation(self.tetragonal, *plane))
            self.assertAlmostEqual(spacing, expected_spacing)
Пример #11
0
    def testinterplanarangle_monoclinic(self):
        equation = lambda lat, h1, k1, l1, h2, k2, l2: \
          d1 * d2 / sin(lat.beta) ** 2 * \
          (h1 * h2 / lat.a ** 2 + \
           k1 * k2 * sin(lat.beta) ** 2 / lat.b ** 2 + \
           l1 * l2 / lat.c ** 2 - \
           (l1 * h2 + l2 * h1) * cos(lat.beta) / (lat.a * lat.c))

        for plane1 in self.planes:
            for plane2 in self.planes:
                d1 = calculations.planespacing(plane1, self.monoclinic)
                d2 = calculations.planespacing(plane2, self.monoclinic)
                angle = calculations.interplanarangle(plane1, plane2,
                                                      self.monoclinic)
                args = copy.deepcopy(plane1)
                args.extend(plane2)
                expected_angle = acos(equation(self.monoclinic, *args))
                self.assertAlmostEqual(angle, expected_angle, 6)
Пример #12
0
    def testplanespacing_trigonal(self):
        equation = lambda lat, h, k, l: \
          ((h ** 2 + k ** 2 + l ** 2) * sin(lat.alpha) ** 2 + \
           2 * (h * k + k * l + h * l) * (cos(lat.alpha) ** 2 - cos(lat.alpha))) / \
           (lat.a ** 2 * (1 - 3 * cos(lat.alpha) ** 2 + 2 * cos(lat.alpha) ** 3))

        for plane in self.planes:
            spacing = calculations.planespacing(plane, self.trigonal)
            expected_spacing = 1.0 / sqrt(equation(self.trigonal, *plane))
            self.assertAlmostEqual(spacing, expected_spacing)
Пример #13
0
    def testplanespacing_trigonal(self):
        equation = lambda lat, h, k, l: \
          ((h ** 2 + k ** 2 + l ** 2) * sin(lat.alpha) ** 2 + \
           2 * (h * k + k * l + h * l) * (cos(lat.alpha) ** 2 - cos(lat.alpha))) / \
           (lat.a ** 2 * (1 - 3 * cos(lat.alpha) ** 2 + 2 * cos(lat.alpha) ** 3))

        for plane in self.planes:
            spacing = calculations.planespacing(plane, self.trigonal)
            expected_spacing = 1.0 / sqrt(equation(self.trigonal, *plane))
            self.assertAlmostEqual(spacing, expected_spacing)
Пример #14
0
    def testinterplanarangle_trigonal(self):
        lat = self.trigonal

        v = lat.a ** 3 * sqrt(1 - 3 * cos(lat.alpha) ** 2 + 2 * cos(lat.alpha) ** 3)

        equation = lambda lat, h1, k1, l1, h2, k2, l2: \
          (lat.a ** 4 * d1 * d2) / v ** 2 * \
          (sin(lat.alpha) ** 2 * (h1 * h2 + k1 * k2 + l1 * l2) + \
           (cos(lat.alpha) ** 2 - cos(lat.alpha)) * \
           (k1 * l2 + k2 * l1 + l1 * h2 + l2 * h1 + h1 * k2 + h2 * k1))

        for plane1 in self.planes:
            for plane2 in self.planes:
                d1 = calculations.planespacing(plane1, lat)
                d2 = calculations.planespacing(plane2, lat)
                angle = calculations.interplanarangle(plane1, plane2, self.trigonal)
                args = copy.deepcopy(plane1)
                args.extend(plane2)
                expected_angle = acos(equation(self.trigonal, *args))
                self.assertAlmostEqual(angle, expected_angle, 6)
Пример #15
0
    def testplanespacing_monoclinic(self):
        equation = lambda lat, h, k, l: \
          (1.0 / sin(lat.beta) ** 2) * \
          (h ** 2 / lat.a ** 2 +
           k ** 2 * sin(lat.beta) ** 2 / lat.b ** 2 + \
           l ** 2 / lat.c ** 2 - \
           2 * h * l * cos(lat.beta) / (lat.a * lat.c))

        for plane in self.planes:
            spacing = calculations.planespacing(plane, self.monoclinic)
            expected_spacing = 1.0 / sqrt(equation(self.monoclinic, *plane))
            self.assertAlmostEqual(spacing, expected_spacing)
Пример #16
0
    def testinterplanarangle_trigonal(self):
        lat = self.trigonal

        v = lat.a**3 * sqrt(1 - 3 * cos(lat.alpha)**2 + 2 * cos(lat.alpha)**3)

        equation = lambda lat, h1, k1, l1, h2, k2, l2: \
          (lat.a ** 4 * d1 * d2) / v ** 2 * \
          (sin(lat.alpha) ** 2 * (h1 * h2 + k1 * k2 + l1 * l2) + \
           (cos(lat.alpha) ** 2 - cos(lat.alpha)) * \
           (k1 * l2 + k2 * l1 + l1 * h2 + l2 * h1 + h1 * k2 + h2 * k1))

        for plane1 in self.planes:
            for plane2 in self.planes:
                d1 = calculations.planespacing(plane1, lat)
                d2 = calculations.planespacing(plane2, lat)
                angle = calculations.interplanarangle(plane1, plane2,
                                                      self.trigonal)
                args = copy.deepcopy(plane1)
                args.extend(plane2)
                expected_angle = acos(equation(self.trigonal, *args))
                self.assertAlmostEqual(angle, expected_angle, 6)
Пример #17
0
    def testplanespacing_monoclinic(self):
        equation = lambda lat, h, k, l: \
          (1.0 / sin(lat.beta) ** 2) * \
          (h ** 2 / lat.a ** 2 +
           k ** 2 * sin(lat.beta) ** 2 / lat.b ** 2 + \
           l ** 2 / lat.c ** 2 - \
           2 * h * l * cos(lat.beta) / (lat.a * lat.c))

        for plane in self.planes:
            spacing = calculations.planespacing(plane, self.monoclinic)
            expected_spacing = 1.0 / sqrt(equation(self.monoclinic, *plane))
            self.assertAlmostEqual(spacing, expected_spacing)
Пример #18
0
 def testplanespacing(self):
     # Example 2.3
     hkl = plane.Plane(3, 1, 2)
     self.assertAlmostEqual(calculations.planespacing(hkl, self.L2), 1.964, 3)
Пример #19
0
 def testplanespacing(self):
     # Example 2.3
     hkl = plane.Plane(3, 1, 2)
     self.assertAlmostEqual(calculations.planespacing(hkl, self.L2), 1.964,
                            3)