00001 #ifndef CCTBX_ELTBX_XRAY_SCATTERING_FORM_FACTOR_H
00002 #define CCTBX_ELTBX_XRAY_SCATTERING_FORM_FACTOR_H
00003
00004 #include <scitbx/array_family/shared.h>
00005 #include <cctbx/import_scitbx_af.h>
00006
00007 namespace cctbx { namespace eltbx {
00008
00010 namespace xray_scattering {
00011
00013 template<class Derived>
00014 class isotropic_form_factor_mixin
00015 {
00016 Derived const & heir() const {
00017 return static_cast<Derived const &>(*this);
00018 }
00019
00020 public:
00027 double
00028 at_stol_sq(double stol_sq) const
00029 {
00030 return heir().at_x_sq(stol_sq);
00031 }
00032
00038 double
00039 at_stol(double stol) const
00040 {
00041 return heir().at_x_sq(stol * stol);
00042 }
00043
00050 double
00051 at_d_star_sq(double d_star_sq) const
00052 {
00053 return heir().at_x_sq(d_star_sq / 4);
00054 }
00055
00062 af::shared<double>
00063 at_d_star_sq(af::const_ref<double> const& d_star_sq) const
00064 {
00065 af::shared<double>
00066 result(d_star_sq.size(), af::init_functor_null<double>());
00067 for(std::size_t i=0;i<d_star_sq.size();i++) {
00068 result[i] = at_d_star_sq(d_star_sq[i]);
00069 }
00070 return result;
00071 }
00072
00079 double
00080 at_d_star(double d_star) const
00081 {
00082 return heir().at_x_sq(d_star * d_star / 4);
00083 }
00084 };
00085
00086 }}}
00087
00088 #endif // GUARD