Esempio n. 1
0
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)
Esempio n. 2
0
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)