00001 #ifndef CCTBX_ADP_RESTRAINTS_ADP_SIMILARITY_H
00002 #define CCTBX_ADP_RESTRAINTS_ADP_SIMILARITY_H
00003
00004 #include <cctbx/error.h>
00005 #include <cctbx/adptbx.h>
00006
00007 #include <scitbx/array_family/versa.h>
00008 #include <vector>
00009 #include <scitbx/array_family/shared.h>
00010 #include <cctbx/import_scitbx_af.h>
00011
00012 namespace cctbx { namespace adp_restraints {
00013
00014 struct adp_similarity_proxy
00015 {
00017 adp_similarity_proxy() {}
00018
00020 adp_similarity_proxy(
00021 af::tiny<unsigned, 2> const& i_seqs_,
00022 double weight_)
00023 :
00024 i_seqs(i_seqs_),
00025 weight(weight_)
00026 {}
00027
00029 af::tiny<unsigned, 2> i_seqs;
00031 double weight;
00032 };
00033
00034 class adp_similarity
00035 {
00036 public:
00038 adp_similarity() {}
00039
00041 adp_similarity(
00042 af::tiny<scitbx::sym_mat3<double>, 2> const& u_cart_,
00043 af::tiny<double, 2> const& u_iso_,
00044 af::tiny<bool, 2> const& use_u_aniso_,
00045 double weight_)
00046 :
00047 u_cart(u_cart_),
00048 u_iso(u_iso_),
00049 use_u_aniso(use_u_aniso_),
00050 weight(weight_)
00051 {
00052 init_deltas();
00053 }
00054
00056 adp_similarity(
00057 af::const_ref<scitbx::sym_mat3<double> > const& u_cart_,
00058 af::const_ref<double> const& u_iso_,
00059 af::const_ref<bool> const& use_u_aniso_,
00060 adp_similarity_proxy const& proxy);
00061
00062 scitbx::sym_mat3<double>
00063 deltas() { return deltas_; }
00064
00066 double residual() const;
00067
00070 double rms_deltas() const;
00071
00072 scitbx::sym_mat3<double>
00073 gradient_0() const;
00074
00076 af::tiny<scitbx::sym_mat3<double>, 2>
00077 gradients() const;
00078
00080
00082 void
00083 add_gradients(
00084 af::ref<scitbx::sym_mat3<double> > const& gradients_aniso_cart,
00085 af::ref<double> const& gradients_iso,
00086 af::tiny<unsigned, 2> const& i_seqs) const;
00087
00089 af::tiny<scitbx::sym_mat3<double>, 2> u_cart;
00091 af::tiny<double, 2> u_iso;
00093 af::tiny<bool, 2> use_u_aniso;
00094
00095 double weight;
00096
00097 protected:
00098 void init_deltas();
00099 scitbx::sym_mat3<double> deltas_;
00100
00101 };
00102
00112 double
00113 adp_similarity_residual_sum(
00114 af::const_ref<scitbx::sym_mat3<double> > const& u_cart,
00115 af::const_ref<double> const& u_iso,
00116 af::const_ref<bool> const& use_u_aniso,
00117 af::const_ref<adp_similarity_proxy> const& proxies,
00118 af::ref<scitbx::sym_mat3<double> > const& gradients_aniso_cart,
00119 af::ref<double> const& gradients_iso);
00120
00124 af::shared<double>
00125 adp_similarity_residuals(
00126 af::const_ref<scitbx::sym_mat3<double> > const& u_cart,
00127 af::const_ref<double> const& u_iso,
00128 af::const_ref<bool> const& use_u_aniso,
00129 af::const_ref<adp_similarity_proxy> const& proxies);
00130
00134 af::shared<double>
00135 adp_similarity_deltas_rms(
00136 af::const_ref<scitbx::sym_mat3<double> > const& u_cart,
00137 af::const_ref<double> const& u_iso,
00138 af::const_ref<bool> const& use_u_aniso,
00139 af::const_ref<adp_similarity_proxy> const& proxies);
00140
00141 }}
00142
00143 #endif