10#ifndef GEMMI_SFCALC_HPP_
11#define GEMMI_SFCALC_HPP_
24 return std::complex<double>{std::cos(
arg), std::sin(
arg)};
27template <
typename Table>
35 stol2_ = (
coef_type) cell_.calculate_stol_sq(hkl);
36 scattering_factors_.clear();
43 if (!Table::has(element.
elem))
44 fail(
"Missing scattering factor for ", element.
name());
52 return std::exp(-
u_to_b() * stol2_ *
site.u_iso);
55 return std::exp(-stol2_ * atom.
b_iso);
63 Vec3 arh(cell_.ar * hkl.x, cell_.br * hkl.y, cell_.cr * hkl.z);
64 return std::exp(-2 *
pi() *
pi() *
site.aniso.r_u_r(
arh));
67 return std::exp(-2 *
pi() *
pi() *
71 template<
typename Site>
78 if (!
site.aniso.nonzero()) {
91 template<
typename Site>
100 std::complex<double>
sf = 0.;
103 for (
const Residue& res : chain.residues)
111 std::complex<double>
sf = 0.;
112 stol2_ = (
coef_type) cell_.calculate_stol_sq(hkl);
114 for (
const Residue& res : chain.residues)
118 -
site.element.atomic_number());
130 std::complex<double>
sf = 0.;
140 std::vector<double> scattering_factors_;
std::complex< double > calculate_sf_from_model(const Model &model, const Miller &hkl)
double mott_bethe_factor() const
double dwf_aniso(const SmallStructure::Site &site, const Vec3 &hkl) const
double dwf_iso(const SmallStructure::Site &site) const
double dwf_aniso(const Atom &atom, const Vec3 &hkl) const
std::complex< double > calculate_sf_from_atom(const Fractional &fract, const Site &site, const Miller &hkl)
std::complex< double > calculate_mb_z(const Model &model, const Miller &hkl, bool only_h)
typename Table::Coef::coef_type coef_type
void set_stol2_and_scattering_factors(const Miller &hkl)
double dwf_iso(const Atom &atom) const
std::complex< double > calculate_sf_from_atom_sf(const Fractional &fract, const Site &site, const Miller &hkl, double sf)
StructureFactorCalculator(const UnitCell &cell)
double get_scattering_factor(Element element, signed char charge)
std::complex< double > calculate_sf_from_small_structure(const SmallStructure &small_st, const Miller &hkl)
std::complex< double > calculate_sf_part(const Fractional &fpos, const Miller &hkl)
std::array< int, 3 > Miller
A synonym for convenient passing of hkl.
constexpr double mott_bethe_const()
void fail(const std::string &msg)
constexpr double u_to_b()
float get(Element el) const
Represents atom site in macromolecular structure (~100 bytes).
const char * name() const
std::vector< Chain > chains
SMat33< Real > transformed_by(const Mat33 &m) const
auto r_u_r(const Vec3_< VT > &r) const -> decltype(r.x+u11)