00001 #ifndef CCTBX_GEOMETRY_RESTRAINTS_BOND_SORTED_H
00002 #define CCTBX_GEOMETRY_RESTRAINTS_BOND_SORTED_H
00003
00004 #include <cctbx/geometry_restraints/bond.h>
00005 #include <cctbx/crystal/pair_tables.h>
00006
00007 namespace cctbx { namespace geometry_restraints {
00008
00010 void
00011 add_pairs(
00012 crystal::pair_asu_table<>& pair_asu_table,
00013 af::const_ref<bond_simple_proxy> const& bond_simple_proxies)
00014 {
00015 for(unsigned i=0;i<bond_simple_proxies.size();i++) {
00016 pair_asu_table.add_pair(bond_simple_proxies[i].i_seqs);
00017 }
00018 }
00019
00021 class bond_sorted_asu_proxies : public bond_sorted_asu_proxies_base
00022 {
00023 public:
00025 bond_sorted_asu_proxies() {}
00026
00028 bond_sorted_asu_proxies(
00029 boost::shared_ptr<
00030 direct_space_asu::asu_mappings<> > const& asu_mappings)
00031 :
00032 bond_sorted_asu_proxies_base(asu_mappings)
00033 {}
00034
00036 bond_sorted_asu_proxies(
00037 af::const_ref<bond_params_dict> const& bond_params_table)
00038 {
00039 for(unsigned i_seq=0;i_seq<bond_params_table.size();i_seq++) {
00040 for(bond_params_dict::const_iterator
00041 dict_i=bond_params_table[i_seq].begin();
00042 dict_i!=bond_params_table[i_seq].end();
00043 dict_i++) {
00044 process(bond_simple_proxy(
00045 af::tiny<unsigned, 2>(i_seq, dict_i->first),
00046 dict_i->second));
00047 }
00048 }
00049 }
00050
00052 bond_sorted_asu_proxies(
00053 af::const_ref<bond_params_dict> const& bond_params_table,
00054 crystal::pair_asu_table<> const& bond_asu_table)
00055 :
00056 bond_sorted_asu_proxies_base(bond_asu_table.asu_mappings())
00057 {
00058 CCTBX_ASSERT(bond_asu_table.table().size()
00059 == bond_params_table.size());
00060 af::const_ref<crystal::pair_asu_dict>
00061 asu_tab = bond_asu_table.table().const_ref();
00062 direct_space_asu::asu_mapping_index_pair pair;
00063 for(pair.i_seq=0;pair.i_seq<asu_tab.size();pair.i_seq++) {
00064 crystal::pair_asu_dict const& asu_dict = asu_tab[pair.i_seq];
00065 for(crystal::pair_asu_dict::const_iterator
00066 asu_dict_i=asu_dict.begin();
00067 asu_dict_i!=asu_dict.end();
00068 asu_dict_i++) {
00069 pair.j_seq = asu_dict_i->first;
00070 const bond_params_dict* params_dict;
00071 bond_params_dict::const_iterator params;
00072 if (pair.i_seq <= pair.j_seq ) {
00073 params_dict = &bond_params_table[pair.i_seq];
00074 params = params_dict->find(pair.j_seq);
00075 }
00076 else {
00077 params_dict = &bond_params_table[pair.j_seq];
00078 params = params_dict->find(pair.i_seq);
00079 }
00080 if (params == params_dict->end()) {
00081 unsigned i = pair.i_seq;
00082 unsigned j = pair.j_seq;
00083 if (i > j) std::swap(i, j);
00084 params_dict = &bond_params_table[j];
00085 params = params_dict->find(i);
00086 char buf[256];
00087 if (params == params_dict->end()) {
00088 std::sprintf(buf,
00089 "Unknown bond parameters (incomplete bond_params_table):"
00090 " i_seq=%d, j_seq=%d", i, j);
00091 }
00092 else {
00093 std::sprintf(buf,
00094 "Improper bond_params_table (requirement i_seq <= j_seq):"
00095 " i_seq=%d, j_seq=%d", j, i);
00096 }
00097 throw error(buf);
00098 }
00099 crystal::pair_asu_j_sym_groups const& jgs = asu_dict_i->second;
00100 for(unsigned ig=0;ig<jgs.size();ig++) {
00101 crystal::pair_asu_j_sym_group const& jg = jgs[ig];
00102 for(crystal::pair_asu_j_sym_group::const_iterator
00103 jg_i=jg.begin();
00104 jg_i!=jg.end();
00105 jg_i++) {
00106 pair.j_sym = *jg_i;
00107 if (!pair.is_active()) continue;
00108 process(bond_asu_proxy(pair, params->second));
00109 }
00110 }
00111 }
00112 }
00113 }
00114
00118 bond_sorted_asu_proxies(
00119 crystal::pair_asu_table<> const& pair_asu_table)
00120 :
00121 bond_sorted_asu_proxies_base(pair_asu_table.asu_mappings())
00122 {
00123 af::const_ref<crystal::pair_asu_dict>
00124 asu_tab = pair_asu_table.table().const_ref();
00125 direct_space_asu::asu_mapping_index_pair pair;
00126 for(pair.i_seq=0;pair.i_seq<asu_tab.size();pair.i_seq++) {
00127 crystal::pair_asu_dict const& asu_dict = asu_tab[pair.i_seq];
00128 for(crystal::pair_asu_dict::const_iterator
00129 asu_dict_i=asu_dict.begin();
00130 asu_dict_i!=asu_dict.end();
00131 asu_dict_i++) {
00132 pair.j_seq = asu_dict_i->first;
00133 crystal::pair_asu_j_sym_groups const& jgs = asu_dict_i->second;
00134 for(unsigned ig=0;ig<jgs.size();ig++) {
00135 crystal::pair_asu_j_sym_group const& jg = jgs[ig];
00136 double distance_ideal = 0;
00137 for(crystal::pair_asu_j_sym_group::const_iterator
00138 jg_i=jg.begin();
00139 jg_i!=jg.end();
00140 jg_i++) {
00141 pair.j_sym = *jg_i;
00142 distance_ideal += this->asu_mappings_->diff_vec(pair).length();
00143 }
00144 if (jg.size() != 0) distance_ideal /= jg.size();
00145 for(crystal::pair_asu_j_sym_group::const_iterator
00146 jg_i=jg.begin();
00147 jg_i!=jg.end();
00148 jg_i++) {
00149 pair.j_sym = *jg_i;
00150 if (!pair.is_active()) continue;
00151 process(
00152 bond_asu_proxy(pair, distance_ideal, 1.0));
00153 }
00154 }
00155 }
00156 }
00157 }
00158 };
00159
00160 }}
00161
00162 #endif // CCTBX_GEOMETRY_RESTRAINTS_BOND_SORTED_H