00001
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #ifndef CLIPPER_SPACEGROUP
00047 #define CLIPPER_SPACEGROUP
00048
00049
00050 #include "symop.h"
00051 #include "spacegroup_data.h"
00052
00053
00054 namespace clipper {
00055
00056
00057 class HKL;
00058 class HKL_class;
00059 class Coord_frac;
00060
00061
00063
00073 class Spgr_descr
00074 {
00075 public:
00076 enum TYPE { Hall, HM, Symops, Number, Unknown };
00078 Spgr_descr();
00080 explicit Spgr_descr( const String& symb, TYPE type = Unknown );
00082 explicit Spgr_descr( const int& num );
00084 int spacegroup_number() const;
00086 String symbol_hall() const;
00088 String symbol_hm() const;
00090 String symbol_xhm() const;
00092 String symbol_hm_ext() const;
00094 static void set_preferred( const char& c );
00095
00097 class Symop_codes : public std::vector<Symop_code>
00098 {
00099 public:
00101 void init_hall( const String& symb );
00103 void init_symops( const String& symb );
00105 Symop_codes expand() const;
00107 Symop_codes primitive_noninversion_ops() const;
00109 Symop_codes inversion_ops() const;
00111 Symop_codes primitive_ops() const;
00113 Symop_codes centering_ops() const;
00115 Symop_codes laue_ops() const;
00117 Symop_codes pgrp_ops() const;
00119 Symop_codes patterson_ops() const;
00121 Symop_codes generator_ops() const;
00123 Symop_codes product( const Symop_codes& ops2 ) const;
00125 unsigned int hash() const;
00126 };
00127
00129 explicit Spgr_descr( const Symop_codes& ops );
00131 const Symop_codes& generator_ops() const { return generators_; }
00133 const unsigned int& hash() const { return hash_; }
00134
00135 protected:
00136 unsigned int hash_;
00137 Symop_codes generators_;
00138
00139 static char pref_12, pref_hr;
00140 };
00141
00142
00143
00144 class Spgr_cacheobj
00145 {
00146 public:
00147 typedef Spgr_descr Key;
00148 Spgr_cacheobj( const Key& spgr_cachekey );
00149 bool matches( const Key& spgr_cachekey ) const;
00150 String format() const;
00151
00152 Key spgr_cachekey_;
00153 int nsym, nsymn, nsymi, nsymc, nsymp;
00154 int lgrp;
00155 std::vector<Symop> symops;
00156 std::vector<Isymop> isymops;
00157 Vec3<> asu_min_, asu_max_;
00158 static Mutex mutex;
00159 };
00160
00161
00163
00172 class Spacegroup : public Spgr_descr
00173 {
00174 public:
00176 enum TYPE { Null, P1 };
00178 enum AXIS { A=0, B=1, C=2 };
00180 Spacegroup() {};
00182 explicit Spacegroup( TYPE type );
00184 explicit Spacegroup( const Spgr_descr& spgr_descr );
00186 void init( const Spgr_descr& spgr_descr );
00187
00189 bool is_null() const;
00190
00191
00193 inline const Spgr_descr& descr() const { return (*this); }
00195 inline const int& num_symops() const { return nsym; }
00197 inline const int& num_primops() const { return num_primitive_symops(); }
00199 inline const int& num_primitive_symops() const { return nsymp; }
00201 inline const int& num_centering_symops() const { return nsymc; }
00203 inline const int& num_inversion_symops() const { return nsymi; }
00205 inline const int& num_primitive_noninversion_symops() const { return nsymn;}
00207 inline const Symop& symop( const int& sym_no ) const
00208 { return symops[sym_no]; }
00210 inline const Symop& primitive_symop( const int& sym_no ) const
00211 { return symops[sym_no]; }
00213 inline const Symop& inversion_symop( const int& sym_no ) const
00214 { return symops[nsymn*sym_no]; }
00216 inline const Symop& centering_symop( const int& sym_no ) const
00217 { return symops[nsymp*sym_no]; }
00219 int order_of_symmetry_about_axis( const AXIS axis ) const;
00220
00222 HKL_class hkl_class( const HKL& hkl ) const;
00224 bool recip_asu( const HKL& hkl ) const;
00225
00227 int product_op( const int& s1, int& s2 ) const;
00229 int inverse_op( const int& s ) const;
00230
00232 Coord_frac asu_max() const;
00234 Coord_frac asu_min() const;
00235
00237 bool invariant_under_change_of_hand() const;
00238
00239
00240
00241
00242
00244 String symbol_laue() const;
00245
00247 static Spacegroup p1() { return Spacegroup( P1 ); }
00249 static Spacegroup null() { return Spacegroup( Null ); }
00250
00251 void debug() const;
00252
00253 private:
00254 ObjectCache<Spgr_cacheobj>::Reference cacheref;
00255 const Symop* symops;
00256 const Isymop* isymops;
00257 data::ASUfn asufn;
00258 int nsym, nsymn, nsymi, nsymc, nsymp;
00259 };
00260
00261
00262 }
00263
00264 #endif