CHAPTER
13
The implementation of space group plays a central role in CCL and CPL to provide knowledge of crystallographic symmetry for other components of the libraries and applications. Other classes such as Miller indices and structure factor rely on the symmetry knowledge to perform their operations.
13.1
Space Group
13.1.1
ccl::spaceGroup class
This class loads in a database file that contains symmetry information of all 230 space groups. Various member functions return the symmetry operators and other characteristics of a space group.
13.1.1.1 Constructors and Assignment
spaceGroup(const size_t = 1);
spaceGroup(const char*);
spaceGroup(const std::string&);
The general constructors take a space group number, a C string or a std::string of a space group name to construct a space group. The default constructor constructs the space group P1. The space group name is a lowercase string similar to the space group symbol found in the International Tables. Table 13.1.1.0.1 lists these strings. When this class is constructed, a database file is loaded. An environment variable CCLHOME must be set to specify the location where CCL is installed. The space group library will be loaded from $CCLHOME/lib.
spaceGroup(const
spaceGroup&);
const
spaceGroup& operator=(const spaceGroup&);
Copy constructor and assignment operator = are available.
void setSpaceGroup(const size_t = 1);
void setSpaceGroup(const
char*);
void setSpaceGroup(const
std::string&);
After a space group is constructed, it is still possible to change it to another space group by using these set functions.
|
No. Name |
No. Name |
No. Name |
No. Name |
No. Name |
|
1 p1 2 p-1 3 p2 4 p21 5 c2 7 pc 8 cm 9 cc 10 p2/m 11 p21/m 12 c2/m 13 p2/c 14 p21/c 15 c2/c 16 p222 17 p2221 18 p21212 19 p212121 20 c2221 21 c222 22 f222 23 i222 24 i212121 25 pmm2 26 pmc21 27 pcc2 28 pma2 29 pca21 30 pnc2 31 pmn21 32 pba2 33 pna21 34 pnn2 35 cmm2 36 cmc21 37 ccc2 38 amm2 39 abm2 40 ama2 41 aba2 42 fmm2 43 fdd2 44 imm2 45 iba2 46 ima2 |
47 pmmm 48 pnnn 49 pccm 50 pban 51 pmma 52 pnna 53 pmna 54 pcca 55 pbam 56 pccn 57 pbcm 58 pnnm 59 pmmn 60 pbcn 61 pbca 62 pnma 63 cmcm 64 cmca 65 cmmm 66 cccm 67 cmma 68 ccca 69 fmmm 70 fddd 71 immm 72 ibam 73 ibca 74 imma 75 p4 76 p41 77 p42 78 p43 79 i4 80 i41 81 p-4 82 i-4 83 p4/m 84 p42/m 85 p4/n 86 p42/n 87 i4/m 88 i41/a 89 p422 90 p4212 91 p4122 92 p41212 |
93 p4222 94 p42212 95 p4322 96 p43212 97 i422 98 i4122 99 p4mm 100 p4bm 101 p42cm 102 p42nm 103 p4cc 104 p4nc 105 p42mc 106 p42bc 107 i4mm 108 i4cm 109 i41md 110 i41cd 111 p-42m 112 p-42c 113 p-421m 114 p-421c 115 p-4m2 116 p-4c2 117 p-4b2 118 p-4n2 119 i-4m2 120 i-4c2 121 i-42m 122 i-42d 123 p4/mmm 124 p4/mcc 125 p4/nbm 126 p4/nnc 127 p4/mbm 128 p4/mnc 129 p4/nmm 130 p4/ncc 131 p42/mmc 132 p42/mcm 133 p42/nbc 134 p42/nnm 135 p42/mbc 136 p42/mnm 137 p42/nmc 138 p42/ncm |
139 i4/mmm 140 i4/mcm 141 i41/amd 142 i41/acd 143 p3 144 p31 145 p32 146 r3 147 p-3 148 r-3 149 p312 150 p321 151 p3112 152 p3121 153 p3212 154 p3221 155 r32 156 p3m1 157 p31m 158 p3c1 159 p31c 160 r3m 161 r3c 162 p-31m 163 p-31c 164 p3m1 165 p-3c1 166 r-3m 167 r-3c 168 p6 169 p61 170 p65 171 p62 172 p64 173 p63 174 p-6 175 p6/m 176 p63/m 177 p622 178 p6122 179 p6522 180 p6222 181 p6422 182 p6322 183 p6mm 184 p6cc |
185 p63cm 186 p63mc 187 p-6m2 188 p-6c2 189 p-62m 190 p-62c 191 p6/mmm 192 p6/mcc 193 p63/mcm 194 p63/mmc 195 p23 196 f23 197 i23 198 p213 199 i213 200 pm-3 201 pn-3 202 fm-3 203 fd-3 204 im-3 205 pa-3 206 ia-3 207 p432 208 p4332 209 f432 210 f4132 211 i432 212 p4332 213 p4132 214 i4132 215 p-43m 216 f4-3m 217 i-43 218 p-43n 219 f-43c 220 i-43d 221 pm-3m 222 pn-3n 223 pm-3n 224 pn-3m 225 fm-3m 226 fm-3c 227 fd-3m 228 fd-3c 229 im-3m 230 ia-3d |
Table 13.1.1.1.1 Accepted strings for space group names.
13.1.1.2 Space Group
Characteristics
These member functions return several characteristics of a space group. All these functions are declared const, that is, by no means they can change the already constructed space group.
std::string spaceGroupName(const bool cap = 1) const;
Returns the space group name as std::string. The optional Boolean indicates whether the first character is capitalized. See Table 13.1.1.1.1 for possible returned values.
std::string
pointGroupName() const;
Returns the space group name without the first character for lattice type.
int lattice(const bool cap = 1) const;
Returns the lattice type of the space group as a single letter. The optional Boolean indicates whether the letter is capitalized.
size_t spaceGroupNumber() const;
Returns the space group number.
std::string getCrystalSystem() const;
std::string crystalSystem() const;
Return the crystal system as std::string. The possible returned values are triclinic, monoclinic, orthorhombic, tetragonal, trigonal, hexagonal, and cubic.
bool getCentralSymmetric() const;
bool centrosymmetric() const;
Test whether the space group is central symmetric. If one of the symmetry operators (See 13.1.3 below) has
R
=
,
this space group is central symmetric.
bool getEnantiomorphism() const;
bool enantiomorphic() const;
Test whether the space group is enantiomorphic. If one of the symmetry operators (See 13.1.1.3 below) has |R| = -1, this space group is enantiomorphic. All central symmetric space groups are enantiomorphic.
void rmInversion();
Removes the inversion operator and all derived operators from the inversion if any. Please note that this function indeed alters the symmetry of the space group. Use this function with caution.
13.1.1.3 Symmetry Operation and Symmetry Operators
The space defined by a unit cell is divided into several asymmetric units. The content of each asymmetric unit is a copy of another. The calculation of a position in an asymmetric unit from a position of another is a symmetry operation. Such operation can be described by this equation:
u = Rv + t
where u and v are two vectors in two asymmetric units, respectively. R is a 3-dimensional matrix, and t is a translation vector. The pair of R and t is called a symmetry operator. It can be shown that if u and v are both in the fractional coordinate system of the unit cell, R and t can be much simplified. R will consist of elements 1, 0, or, -1; t will consist of multiples of 1/4 or 1/6. Therefore, symmetry operation is always done in fractional coordinate system. Please note that R is not necessarily a rotation matrix, therefore may not be orthogonal. A space group has a fixed number of symmetry operators. One of them must be a 3-dimensional identity matrix and a 0 vector.
Some of the following functions take 0-offset subscript in parentheses (), which is not consistent with the conventional style. These functions remain due to backward compatibility.
If a subscript is out of range, an error message will be printed, and default matrix or vector will be returned. This behavior in future release.
size_t getOperateSize() const;
size_t operateSize() const;
size_t operatorSize() const;
Return the number of operators the space group has.
mac::matrix3D<int> R(const size_t i) const;
Returns the i-th operator matrix R, where i is a 1-offset subscript.
mac::matrix3D<int> getOperate(const size_t) const;
Returns a matrix R. This function takes a 0-offset subscript.
mac::vector3D<double> t(const size_t i) const;
Returns the i-th translation vector t, where i is a 1-offset subscript.
mac::vector3D<double> getTranslate(
const size_t)
const;
Given a 0-offset subscript, returns a vector t.
vector<mac::matrix3D<int> > operators() const;
vector<mac::matrix3D<int> > getOperate() const;
Returns all R¡¯s of this space group. The order of the returned std::vector is consistent with that from the next function getTranslate().
vector<mac::vector3D<double>
>
translations() const;
vector<mac::vector3D<double>
>
getTranslate() const;
Returns all t¡¯s of this space group. The order of the returned std::vector is consistent with that from the previous function getOperate().
13.1.1.4 Unique Symmetry Operators
Some symmetry operators may share the same R, but not the same t, so that the set of R¡¯s are therefore not unique. The following member functions deal with only the unique set of R¡¯s.
size_t uniqueOperatorSize() const;
size_t uniqueOperateSize() const;
size_t getUniqueOperateSize() const;
Return the number of unique R¡¯s for this space group.
mac::matrix3D<int> uniqueR(const size_t i) const;
Returns the i-th unique operator matrix R, where i is a 1-offset subscript. The order is determined as below.
mac::matrix3D<int> getUniqueOperate(const size_t)
const;
Given a 0-offset subscript, returns a unique R. The order is determined as below.
set<mac::matrix3D<int>
> uniqueOperators() const;
set<mac::matrix3D<int>
> getUniqueOperate()
const;
Returns all unique R¡¯s in the ascending order determined by lessThan comparison.
13.1.1.5
Patterson Space Group
The Patterson space group can be derived from the original space group
by removal of all translations of screw axes and sliders, but retaining the
translations of lattice centering, and addition of a inversion if needed.
spaceGroup
Patterson() const;
Returns Patterson space group of this space group. This function is const, that is, the original space group is not altered.
The Patterson space group of any space group listed in Table 13.1.1.0.1 can be found in that table, except four, Amm2, Abm2, Ama2, and Aba2. Their Patterson space group should be Cmmm but with a different orientation from those four original ones. A permuted space group Ammm is needed to keep the consistent orientation. Ammm is included in the space group database coming with the distribution, and named number 1065. Table 13.1.5.0.1 lists the results of the function Patterson().
|
No. Name Patterson |
No. Name Patterson |
No. Name Patterson |
|
1 P1 P-1 2 P-1 P-1 3 P2 P2/m 4 P21 P2/m 5 C2 C2/m 6 Pm P2/m 7 Pc P2/m 8 Cm C2/m 9 Cc C2/m 10 P2/m P2/m 11 P21/m P2/m 12 C2/m C2/m 13 P2/c P2/m 14 P21/c P2/m 15 C2/c C2/m 16 P222 Pmmm 17 P2221 Pmmm 18 P21212 Pmmm 19 P212121 Pmmm 20 C2221 Cmmm 21 C222 Cmmm 22 F222 Fmmm 23 I222 Immm 24 I212121 Immm 25 Pmm2 Pmmm 26 Pmc21 Pmmm 27 Pcc2 Pmmm 28 Pma2 Pmmm 29 Pca21 Pmmm 30 Pnc2 Pmmm 31 Pmn21 Pmmm 32 Pba2 Pmmm 33 Pna21 Pmmm 34 Pnn2 Pmmm 35 Cmm2 Cmmm 36 Cmc21 Cmmm 37 Ccc2 Cmmm 38 Amm2 Ammm 39 Abm2 Ammm 40 Ama2 Ammm 41 Aba2 Ammm 42 Fmm2 Fmmm 43 Fdd2 Fmmm 44 Imm2 Immm 45 Iba2 Immm 46 Ima2 Immm 47 Pmmm Pmmm 48 Pnnn Pmmm 49 Pccm Pmmm 50 Pban Pmmm 51 Pmma Pmmm 52 Pnna Pmmm 53 Pmna Pmmm 54 Pcca Pmmm 55 Pbam Pmmm 56 Pccn Pmmm 57 Pbcm Pmmm 58 Pnnm Pmmm 59 Pmmn Pmmm 60 Pbcn Pmmm 61 Pbca Pmmm 62 Pnma Pmmm 63 Cmcm Cmmm 64 Cmca Cmmm 65 Cmmm Cmmm 66 Cccm Cmmm 67 Cmma Cmmm 68 Ccca Cmmm 69 Fmmm Fmmm 70 Fddd Fmmm 71 Immm Immm 72 Ibam Immm 73 Ibca Immm 74 Imma Immm 75 P4 P4/m 76 P41 P4/m 77 P42 P4/m |
78 P43 P4/m 79 I4 I4/m 80 I41 I4/m 81 P-4 P4/m 82 I-4 I4/m 83 P4/m P4/m 84 P42/m P4/m 85 P4/n P4/m 86 P42/n P4/m 87 I4/m I4/m 88 I41/a I4/m 89 P422 P4/mmm< |