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_CONTAINER_HKL 00046 #define CLIPPER_CONTAINER_HKL 00047 00048 00049 #include "container_types.h" 00050 #include "hkl_data.h" 00051 00052 00053 namespace clipper 00054 { 00055 00056 extern const HKL_info NullHKL_info; //<! null instance 00057 00058 00060 00063 class CHKL_info : public Container, public HKL_info 00064 { 00065 public: 00067 CHKL_info( const String name = "", 00068 const Spacegroup& spacegroup = NullSpacegroup, 00069 const Cell& cell = NullCell, 00070 const Resolution& resolution = NullResolution, 00071 const bool& generate = false ); 00073 CHKL_info( Container& parent, const String name = "", 00074 const bool& generate = false ); 00076 void init( const Spacegroup& spacegroup, const Cell& cell, 00077 const Resolution& resolution, const bool& generate = false ); 00078 00080 void generate_hkl_list(); 00082 void update(); 00083 private: 00084 bool generate_; 00085 }; 00086 00087 00089 00091 template<class T> class CHKL_data : public Container, public HKL_data<T> 00092 { 00093 public: 00095 CHKL_data() {} 00097 CHKL_data( Container& parent, const String name = "" ); 00099 void init( const HKL_info& hkl_info, const Cell& cell ); 00101 void init( const Spacegroup& spacegroup, const Cell& cell, const HKL_sampling& hkl_sampling ) { clipper::Message::message( clipper::Message_fatal("CHKL_data deprecated") ); } 00103 void update(); 00104 00106 HKL_data<T>& operator =( const HKL_data<T>& other ) 00107 { return ( dynamic_cast<HKL_data<T>&>(*this) = other ); } 00109 HKL_data<T>& operator =( const T& value ) 00110 { return ( dynamic_cast<HKL_data<T>&>(*this) = value ); } 00111 }; 00112 00113 00114 // template implementations 00115 00116 00124 template<class T> CHKL_data<T>::CHKL_data( Container& parent, const String name ) : Container( parent, name ) 00125 { 00126 init( NullHKL_info, NullCell ); 00127 } 00128 00129 00135 template<class T> void CHKL_data<T>::init( const HKL_info& hkl_info, const Cell& cell ) 00136 { 00137 // use supplied values by default 00138 const HKL_info* hp = &hkl_info; 00139 const Cell* cp = &cell; 00140 // otherwise get them from the tree 00141 if ( hp->is_null() ) hp = parent_of_type_ptr<const HKL_info>(); 00142 if ( cp->is_null() ) cp = parent_of_type_ptr<const Cell>(); 00143 // if we have an hkl_info, try and init 00144 if ( hp != NULL ) { 00145 // if no cell then inherit 00146 if ( cp == NULL ) cp = &(hp->cell()); 00147 // now initialise 00148 if ( !hp->is_null() && !cp->is_null() ) 00149 HKL_data<T>::init( *hp, *cp ); 00150 } 00151 Container::update(); 00152 } 00153 00154 00160 template<class T> void CHKL_data<T>::update() 00161 { 00162 if ( HKL_data_base::is_null() ) 00163 init( NullHKL_info, NullCell ); 00164 else 00165 Container::update(); 00166 HKL_data<T>::update(); 00167 } 00168 00169 00170 } // namespace clipper 00171 00172 #endif