00001 #ifndef CCTBX_GEOMETRY_RESTRAINTS_ASU_CACHE_H
00002 #define CCTBX_GEOMETRY_RESTRAINTS_ASU_CACHE_H
00003
00004 #include <cctbx/crystal/direct_space_asu.h>
00005
00006 namespace cctbx { namespace geometry_restraints {
00007
00008 namespace direct_space_asu = crystal::direct_space_asu;
00009
00011
00013 template <typename FloatType=double, typename IntShiftType=int>
00014 class asu_cache
00015 {
00016 public:
00018 typedef direct_space_asu::asu_mappings<FloatType, IntShiftType>
00019 asu_mappings_t;
00020
00022 asu_cache() {}
00023
00025 asu_cache(
00026 af::const_ref<scitbx::vec3<FloatType> > const& moved_sites_cart,
00027 asu_mappings_t const& asu_mappings,
00028 std::vector<bool> const& sym_active_flags,
00029 bool allocate_gradients)
00030 {
00031 std::size_t n_sites = moved_sites_cart.size();
00032 mappings_ = asu_mappings.mappings_const_ref();
00033 CCTBX_ASSERT(mappings_.size() == n_sites);
00034 sites_memory_.resize(asu_mappings.n_sites_in_asu_and_buffer());
00035 sites.resize(n_sites, 0);
00036 scitbx::vec3<FloatType>* sites_ptr = (
00037 sites_memory_.size() ? &*sites_memory_.begin() : 0);
00038 std::size_t sum_n_sym = 0;
00039 for(std::size_t i_seq=0;i_seq<n_sites;i_seq++) {
00040 if (!sym_active_flags[i_seq]) {
00041 sites[i_seq] = 0;
00042 }
00043 else {
00044 sites[i_seq] = sites_ptr;
00045 std::size_t n_sym = mappings_[i_seq].size();
00046 for(std::size_t i_sym=0;i_sym<n_sym;i_sym++) {
00047 *sites_ptr++ = asu_mappings.map_moved_site_to_asu(
00048 moved_sites_cart[i_seq], i_seq, i_sym);
00049 }
00050 sum_n_sym += n_sym;
00051 }
00052 }
00053 CCTBX_ASSERT(sum_n_sym <= sites_memory_.size());
00054 if (allocate_gradients) {
00055 gradients.resize(n_sites, scitbx::vec3<FloatType>(0,0,0));
00056 }
00057 }
00058
00060 void
00061 add_gradients(
00062 af::ref<scitbx::vec3<double> > const& gradient_array,
00063 direct_space_asu::asu_mappings<> const& asu_mappings) const
00064 {
00065 for(std::size_t i_seq=0;i_seq<gradient_array.size();i_seq++) {
00066 gradient_array[i_seq] += asu_mappings.r_inv_cart(i_seq, 0)
00067 * gradients[i_seq];
00068 }
00069 }
00070
00074 std::vector<scitbx::vec3<FloatType>*> sites;
00076 std::vector<scitbx::vec3<FloatType> > gradients;
00077
00078 protected:
00079 std::vector<scitbx::vec3<FloatType> > sites_memory_;
00080 af::const_ref<typename asu_mappings_t::array_of_mappings_for_one_site>
00081 mappings_;
00082 };
00083
00084 }}
00085
00086 #endif // CCTBX_GEOMETRY_RESTRAINTS_ASU_CACHE_H