00001 #ifndef CCTBX_GEOMETRY_RESTRAINTS_SORTED_ASU_PROXIES_H 00002 #define CCTBX_GEOMETRY_RESTRAINTS_SORTED_ASU_PROXIES_H 00003 00004 #include <cctbx/crystal/direct_space_asu.h> 00005 00006 namespace cctbx { namespace geometry_restraints { 00007 00009 typedef direct_space_asu::asu_mapping_index asu_mapping_index; 00011 typedef direct_space_asu::asu_mapping_index_pair asu_mapping_index_pair; 00013 typedef direct_space_asu::asu_mappings<> asu_mappings; 00014 00016 00022 template <typename SimpleProxyType, 00023 typename AsuProxyType> 00024 class sorted_asu_proxies 00025 { 00026 public: 00028 sorted_asu_proxies() 00029 : 00030 asu_mappings_(0) 00031 {} 00032 00034 sorted_asu_proxies( 00035 boost::shared_ptr< 00036 direct_space_asu::asu_mappings<> > const& asu_mappings) 00037 : 00038 asu_mappings_owner_(asu_mappings), 00039 asu_mappings_(asu_mappings.get()) 00040 { 00041 if (asu_mappings_ != 0) { 00042 asu_active_flags.resize( 00043 asu_mappings_->mappings_const_ref().size(), false); 00044 } 00045 } 00046 00048 boost::shared_ptr<direct_space_asu::asu_mappings<> > const& 00049 asu_mappings() const 00050 { 00051 CCTBX_ASSERT(asu_mappings_ != 0); 00052 return asu_mappings_owner_; 00053 } 00054 00056 bool 00057 process(SimpleProxyType const& proxy) 00058 { 00059 simple.push_back(proxy); 00060 return false; 00061 } 00062 00064 void 00065 process(af::const_ref<SimpleProxyType> const& proxies) 00066 { 00067 for(std::size_t i=0;i<proxies.size();i++) process(proxies[i]); 00068 } 00069 00081 bool 00082 process(AsuProxyType const& proxy) 00083 { 00084 CCTBX_ASSERT(asu_mappings_ != 0 && proxy.is_active()); 00085 if (asu_mappings_->is_simple_interaction(proxy)) { 00086 if (proxy.i_seq < proxy.j_seq) { 00087 simple.push_back(proxy.as_simple_proxy()); 00088 } 00089 return false; 00090 } 00091 push_back(proxy); 00092 return true; 00093 } 00094 00096 void 00097 process(af::const_ref<AsuProxyType> const& proxies) 00098 { 00099 for(std::size_t i=0;i<proxies.size();i++) process(proxies[i]); 00100 } 00101 00103 void 00104 push_back(AsuProxyType const& proxy) 00105 { 00106 CCTBX_ASSERT(asu_mappings_ != 0); 00107 CCTBX_ASSERT(proxy.i_seq < asu_active_flags.size()); 00108 CCTBX_ASSERT(proxy.j_seq < asu_active_flags.size()); 00109 asu.push_back(proxy); 00110 asu_active_flags[proxy.i_seq] = true; 00111 asu_active_flags[proxy.j_seq] = true; 00112 } 00113 00115 void 00116 push_back(af::const_ref<AsuProxyType> const& proxies) 00117 { 00118 for(std::size_t i=0;i<proxies.size();i++) push_back(proxies[i]); 00119 } 00120 00122 std::size_t 00123 n_total() const { return simple.size() + asu.size(); } 00124 00125 protected: 00126 boost::shared_ptr<direct_space_asu::asu_mappings<> > asu_mappings_owner_; 00127 const direct_space_asu::asu_mappings<>* asu_mappings_; 00128 00129 public: 00131 af::shared<SimpleProxyType> simple; 00133 af::shared<AsuProxyType> asu; 00137 std::vector<bool> asu_active_flags; 00138 }; 00139 00140 }} // namespace cctbx::geometry_restraints 00141 00142 #endif // CCTBX_GEOMETRY_RESTRAINTS_SORTED_ASU_PROXIES_H
1.5.6