Source code for neutronbraggedge.braggedges_handler.structure_handler

"""This file will handle work to retrieve the right h,k and l set of data for the various
structures
"""
#from .braggedge_values_calculator import BraggEdgeValuesCalculator
MAX_INDEX = 30

[docs]class BCCHandler(object): """BCC type handler For this type, h+k+l must be an even number """ def __init__(self, number_of_set): self.hkl = [] self.number_of_set = number_of_set self.calculate_hkl() def _hkl_generator(self, number_of_h): """generator that is used to produced the right hkl for cyrstal structure""" h, k, l = 1, 0, 0 for h in range(1, number_of_h): for k in range(number_of_h): if k > h: continue for l in range(number_of_h): if l > k: continue _sum = h + k + l if _sum % 2 == 0: yield [h, k, l]
[docs] def calculate_hkl(self): """calculate the list of hkl for BCC crystal structure""" _hkl_list = self._hkl_generator(MAX_INDEX) _result = [] for i in range(self.number_of_set): _result.append(next(_hkl_list)) self.hkl = _result
[docs]class FCCHandler(object): """FCC type handler For this type, h, k and l must have the same parity """ hkl = [] def __init__(self, number_of_set): self.hkl = [] self.number_of_set = number_of_set self.calculate_hkl() def _hkl_generator(self, number_of_h): """generator used to produce right set of hkl parameters""" for h in range(1, number_of_h): for k in range(0, number_of_h): if k > h: continue for l in range(0, number_of_h): if l > k: continue if self._same_parity(h, k, l): yield [h, k, l] def _same_parity(self, h, k, l): """This function check if the 3 variables h, k, l have the same parity or not Args: h k l Return: True if h, k and l have the same parity False if h, k and l do not have the same parity """ if (self._is_even(h) and self._is_even(k) and self._is_even(l)) or (not self._is_even(h) and not self._is_even(k) and not self._is_even(l)): return True return False def _is_even(self, n): """Check if a variable n is even Args: n variable to check Return: True if n is even False is n is odd """ if n % 2 == 0: return True return False
[docs] def calculate_hkl(self): """calculate the hkl allowed for a FCC crystal structure""" _hkl_list = self._hkl_generator(MAX_INDEX) _result = [] for i in range(self.number_of_set): _result.append(next(_hkl_list)) self.hkl = _result
[docs]class StructureHandler(object): """Various structure handler""" hkl = [] def __init__(self, structure, number_of_set = 10): if not (structure in ["BCC", "FCC"]): raise ValueError("structure not implemented yet") self.structure = structure self.number_of_set = number_of_set if structure is 'FCC': _handler = FCCHandler(number_of_set = self.number_of_set) elif structure is 'BCC': _handler = BCCHandler(number_of_set = self.number_of_set) self.hkl = _handler.hkl