Clipper
|
00001 00004 //C Copyright (C) 2000-2006 Kevin Cowtan and University of York 00005 //L 00006 //L This library is free software and is distributed under the terms 00007 //L and conditions of version 2.1 of the GNU Lesser General Public 00008 //L Licence (LGPL) with the following additional clause: 00009 //L 00010 //L `You may also combine or link a "work that uses the Library" to 00011 //L produce a work containing portions of the Library, and distribute 00012 //L that work under terms of your choice, provided that you give 00013 //L prominent notice with each copy of the work that the specified 00014 //L version of the Library is used in it, and that you include or 00015 //L provide public access to the complete corresponding 00016 //L machine-readable source code for the Library including whatever 00017 //L changes were used in the work. (i.e. If you make changes to the 00018 //L Library you must distribute those, but you do not need to 00019 //L distribute source or object code to those portions of the work 00020 //L not covered by this licence.)' 00021 //L 00022 //L Note that this clause grants an additional right and does not impose 00023 //L any additional restriction, and so does not affect compatibility 00024 //L with the GNU General Public Licence (GPL). If you wish to negotiate 00025 //L other terms, please contact the maintainer. 00026 //L 00027 //L You can redistribute it and/or modify the library under the terms of 00028 //L the GNU Lesser General Public License as published by the Free Software 00029 //L Foundation; either version 2.1 of the License, or (at your option) any 00030 //L later version. 00031 //L 00032 //L This library is distributed in the hope that it will be useful, but 00033 //L WITHOUT ANY WARRANTY; without even the implied warranty of 00034 //L MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00035 //L Lesser General Public License for more details. 00036 //L 00037 //L You should have received a copy of the CCP4 licence and/or GNU 00038 //L Lesser General Public License along with this library; if not, write 00039 //L to the CCP4 Secretary, Daresbury Laboratory, Warrington WA4 4AD, UK. 00040 //L The GNU Lesser General Public can also be obtained by writing to the 00041 //L Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, 00042 //L MA 02111-1307 USA 00043 00044 00045 #ifndef CLIPPER_RESOL_FN 00046 #define CLIPPER_RESOL_FN 00047 00048 #include "hkl_data.h" 00049 00050 namespace clipper { 00051 00053 00066 class BasisFn_base 00067 { 00068 public: 00070 enum FNtype { GENERAL, LINEAR }; 00071 00073 class Fderiv 00074 { 00075 public: 00076 ftype f; 00077 std::vector<ftype> df; 00078 Matrix<> df2; 00079 Fderiv() {} 00080 Fderiv(const int& np) : df(np,0.0), df2(np,np,0.0) {} //<! constructor 00081 }; 00082 00084 BasisFn_base() {} 00086 BasisFn_base( const int& np ) : np_(np), result_(np) {} 00088 const int& num_params() const { return np_; } 00090 virtual ftype f( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return fderiv( hkl, cell, params ).f; } 00092 virtual const Fderiv& fderiv( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const = 0; 00094 virtual FNtype type() const; 00096 virtual int num_diagonals() const; 00097 protected: 00099 Fderiv& result() const { return result_; } 00100 virtual ~BasisFn_base() {} 00101 00102 private: 00103 int np_; 00104 mutable Fderiv result_; 00105 }; 00106 00108 00114 class TargetFn_base 00115 { 00116 public: 00118 class Rderiv 00119 { 00120 public: 00121 ftype r; 00122 ftype dr; 00123 ftype dr2; 00124 }; 00125 00127 enum FNtype { GENERAL, QUADRATIC }; 00129 00130 virtual Rderiv rderiv( const HKL_info::HKL_reference_index& ih, const ftype& fh ) const = 0; 00132 virtual FNtype type() const { return GENERAL; } 00133 virtual ~TargetFn_base() {} 00134 00136 void debug( const HKL_info& hkl_info ) const; 00137 }; 00138 00139 00141 00186 class ResolutionFn 00187 { 00188 public: 00190 ResolutionFn( const HKL_info& hkl_info, const BasisFn_base& basisfn, const TargetFn_base& targetfn, const std::vector<ftype>& params, const ftype damp = 0.0, const bool debug = false ); 00192 inline ftype f( const HKL_info::HKL_reference_index& ih ) const { return basisfn_->f( ih.hkl(), cell_, params_ ); } 00194 const std::vector<ftype>& params() const; 00195 00197 void debug() const; 00198 00199 protected: 00200 const HKL_info* hkl_info_; 00201 const TargetFn_base* targetfn_; 00202 const BasisFn_base* basisfn_; 00203 std::vector<ftype> params_; 00204 Cell cell_; 00205 00207 void calc_derivs( const std::vector<ftype>& params, ftype& r, std::vector<ftype>& drdp, Matrix<>& drdp2 ) const; 00208 00210 ResolutionFn() {} 00211 }; 00212 00213 00215 00234 class ResolutionFn_nonlinear: public ResolutionFn 00235 { 00236 public: 00238 ResolutionFn_nonlinear( const HKL_info& hkl_info, const BasisFn_base& basisfn, const TargetFn_base& targetfn, const std::vector<ftype>& params, const ftype damp = 0.0, const bool debug = false ); 00239 }; 00240 00241 00242 } // namespace clipper 00243 00244 #endif