Clipper
resol_basisfn.h
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_BASISFN
00046 #define CLIPPER_RESOL_BASISFN
00047 
00048 #include "resol_fn.h"
00049 
00050 namespace clipper {
00051 
00052 
00054 
00061   class Resolution_ordinal : public Generic_ordinal
00062   {
00063   public:
00065     void init( const HKL_info& hklinfo, const ftype& power );
00067     void init( const HKL_data_base& hkldata, const ftype& power );
00069     void init( const HKL_data_base& hkldata, const Cell& cell, const ftype& power );
00070   };
00071 
00072 
00074 
00076   class BasisFn_binner : public BasisFn_base
00077   {
00078   public:
00080     BasisFn_binner( const HKL_info& hklinfo, const int& nbins_, const ftype power = 1.0 ) : BasisFn_base( nbins_ ) { s_ord.init( hklinfo, power ); }
00082     BasisFn_binner( const HKL_data_base& hkldata, const int& nbins_, const ftype power = 1.0  ) : BasisFn_base( nbins_ ) { s_ord.init( hkldata, hkldata.base_cell(), power ); }
00084     ftype f_s( const ftype& s, const std::vector<ftype>& params ) const;
00086     const BasisFn_base::Fderiv& fderiv_s( const ftype& s, const std::vector<ftype>& params ) const;
00088     FNtype type() const { return LINEAR; }
00090     int num_diagonals() const { return 1; }
00092     ftype f( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return f_s( hkl.invresolsq( cell ), params ); }
00094     const BasisFn_base::Fderiv& fderiv( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return fderiv_s( hkl.invresolsq( cell ), params ); }
00095   private:
00096     Resolution_ordinal s_ord; //<! resolution ordinal
00097   };
00098 
00099 
00101 
00103   class BasisFn_linear : public BasisFn_base
00104   {
00105   public:
00107     BasisFn_linear( const HKL_info& hklinfo, const int& nbins_, const ftype power = 1.0 ) : BasisFn_base( nbins_ ) { s_ord.init( hklinfo, power ); }
00109     BasisFn_linear( const HKL_data_base& hkldata, const int& nbins_, const ftype power = 1.0  ) : BasisFn_base( nbins_ ) { s_ord.init( hkldata, hkldata.base_cell(), power ); }
00111     ftype f_s( const ftype& s, const std::vector<ftype>& params ) const;
00113     const BasisFn_base::Fderiv& fderiv_s( const ftype& s, const std::vector<ftype>& params ) const;
00115     FNtype type() const { return LINEAR; }
00117     int num_diagonals() const { return 2; }
00119     ftype f( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return f_s( hkl.invresolsq( cell ), params ); }
00121     const BasisFn_base::Fderiv& fderiv( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return fderiv_s( hkl.invresolsq( cell ), params ); }
00122   private:
00123     Resolution_ordinal s_ord; //<! resolution ordinal
00124   };
00125 
00126 
00128 
00130   class BasisFn_spline : public BasisFn_base
00131   {
00132   public:
00134     BasisFn_spline( const HKL_info& hklinfo, const int& nbins_, const ftype power = 1.0 ) : BasisFn_base( nbins_ ) { s_ord.init( hklinfo, power ); }
00136     BasisFn_spline( const HKL_data_base& hkldata, const int& nbins_, const ftype power = 1.0  ) : BasisFn_base( nbins_ ) { s_ord.init( hkldata, hkldata.base_cell(), power ); }
00138     ftype f_s( const ftype& s, const std::vector<ftype>& params ) const;
00140     const BasisFn_base::Fderiv& fderiv_s( const ftype& s, const std::vector<ftype>& params ) const;
00142     FNtype type() const { return LINEAR; }
00144     int num_diagonals() const { return 3; }
00146     ftype f( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return f_s( hkl.invresolsq( cell ), params ); }
00148     const BasisFn_base::Fderiv& fderiv( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return fderiv_s( hkl.invresolsq( cell ), params ); }
00149   private:
00150     Resolution_ordinal s_ord; //<! resolution ordinal
00151   };
00152 
00153 
00155 
00156   class BasisFn_gaussian : public BasisFn_base
00157   {
00158   public:
00160     BasisFn_gaussian() : BasisFn_base( 2 ) {}
00162     //ftype f_s( const ftype& s, const std::vector<ftype>& params ) const;
00164     const BasisFn_base::Fderiv& fderiv_s( const ftype& s, const std::vector<ftype>& params ) const;
00166     //ftype f( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return f_s( hkl.invresolsq( cell ), params ); }
00168     const BasisFn_base::Fderiv& fderiv( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return fderiv_s( hkl.invresolsq( cell ), params ); }
00170     ftype scale( const std::vector<ftype>& params ) const;
00172     ftype u_iso( const std::vector<ftype>& params ) const;
00173   };
00174 
00175 
00177 
00178   class BasisFn_aniso_gaussian : public BasisFn_base
00179   {
00180   public:
00182     BasisFn_aniso_gaussian() : BasisFn_base( 7 ) {}
00184     const BasisFn_base::Fderiv& fderiv_coord( const Coord_reci_orth& xs, const std::vector<ftype>& params ) const;
00186     //ftype f( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return f_coord( hkl.coord_reci_orth( cell ), params ); }
00188     const BasisFn_base::Fderiv& fderiv( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return fderiv_coord( hkl.coord_reci_orth( cell ), params ); }
00190     ftype scale( const std::vector<ftype>& params ) const;
00192     U_aniso_orth u_aniso_orth( const std::vector<ftype>& params ) const;
00193   };
00194 
00195 
00197 
00201   class BasisFn_log_gaussian : public BasisFn_base
00202   {
00203   public:
00205     BasisFn_log_gaussian() : BasisFn_base( 2 ) {}
00207     //ftype f_s( const ftype& s, const std::vector<ftype>& params ) const;
00209     const BasisFn_base::Fderiv& fderiv_s( const ftype& s, const std::vector<ftype>& params ) const;
00211     //ftype f( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return f_s( hkl.invresolsq( cell ), params ); }
00213     const BasisFn_base::Fderiv& fderiv( const HKL& hkl, const Cell& cell, const
00214 std::vector<ftype>& params ) const { return fderiv_s( hkl.invresolsq( cell ), params ); }
00216     FNtype type() const { return LINEAR; }
00218     ftype scale( const std::vector<ftype>& params ) const;
00220     ftype u_iso( const std::vector<ftype>& params ) const;
00221   };
00222 
00223 
00225 
00229   class BasisFn_log_aniso_gaussian : public BasisFn_base
00230   {
00231   public:
00233     BasisFn_log_aniso_gaussian() : BasisFn_base( 7 ) {}
00235     const BasisFn_base::Fderiv& fderiv_coord( const Coord_reci_orth& xs, const std::vector<ftype>& params ) const;
00237     //ftype f( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return f_coord( hkl.coord_reci_orth( cell ), params ); }
00239     const BasisFn_base::Fderiv& fderiv( const HKL& hkl, const Cell& cell, const
00240 std::vector<ftype>& params ) const { return fderiv_coord( hkl.coord_reci_orth( cell ), params ); }
00242     FNtype type() const { return LINEAR; }
00244     ftype scale( const std::vector<ftype>& params ) const;
00246     U_aniso_orth u_aniso_orth( const std::vector<ftype>& params ) const;
00247   };
00248 
00249 
00251 
00252   class BasisFn_expcubic : public BasisFn_base
00253   {
00254   public:
00256     BasisFn_expcubic() : BasisFn_base( 4 ) {}
00258     const BasisFn_base::Fderiv& fderiv_s( const ftype& s, const std::vector<ftype>& params ) const;
00260     //ftype f( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return f_s( hkl.invresolsq( cell ), params ); }
00262     const BasisFn_base::Fderiv& fderiv( const HKL& hkl, const Cell& cell, const std::vector<ftype>& params ) const { return fderiv_s( hkl.invresolsq( cell ), params ); }
00263   };
00264 
00265 
00266 } // namespace clipper
00267 
00268 #endif