def _get_ring(crystal: Crystal, miller_indices: MillerIndices, min_sf: float) -> Union[CrystalRing, None]: scattering_vector = crystal.scattering_vector(miller_indices) q = np.linalg.norm(scattering_vector) sf = _calc_structure_factor( q, miller_indices, crystal) * _structure_factor_coef(miller_indices) if sf >= min_sf: return CrystalRing(radius=q, miller_indices=miller_indices, intensity=sf, crystal=crystal)
def get_crystal_rings(crystal: Crystal, q_max: float, min_sf: float = 0.01) -> Tuple[CrystalRing, ...]: ring_list: List[CrystalRing] = [] atom_list = [(str(atom), atom.coords_fractional) for atom in crystal] for miller_indices in crystal.bounded_reflections(q_max): if np.all(np.array(miller_indices) >= 0): scattering_vector = crystal.scattering_vector(miller_indices) q = np.linalg.norm(scattering_vector) sf = _calc_structure_factor(scattering_vector, miller_indices, atom_list) if sf >= min_sf: ring_list.append( CrystalRing(radius=q, miller_indices=miller_indices, intensity=sf, crystal=crystal)) ring_list.sort(key=lambda ring: ring.radius) return tuple(ring_list)