8#ifndef GEMMI_SYMMETRY_HPP_
9#define GEMMI_SYMMETRY_HPP_
26# pragma clang diagnostic push
27# pragma clang diagnostic ignored "-Wmissing-braces"
39 while (*p ==
' ' || *p ==
'\t' || *p ==
'_')
54 static constexpr int DEN = 24;
55 typedef std::array<std::array<int, 3>, 3>
Rot;
56 typedef std::array<int, 3>
Tran;
67 for (
int i = 0;
i != 3; ++
i) {
77 for (
int i = 0;
i != 3; ++
i)
87 return { -
rot[0][0], -
rot[0][1], -
rot[0][2],
110 const int table[] = {0, 0, 2, 3, 4, 6, 1};
112 return det > 0 ? table[3 + tr] : -table[3 - tr];
118 for (
int i = 0;
i != 3; ++
i) {
120 for (
int j = 0;
j != 3; ++
j) {
131 std::array<double, 3>
apply_to_xyz(
const std::array<double, 3>& xyz)
const {
132 std::array<double, 3>
out;
133 for (
int i = 0;
i != 3; ++
i)
144 for (
int i = 0;
i != 3; ++
i)
145 r[
i] = (
rot[0][
i] * hkl[0] +
rot[1][
i] * hkl[1] +
rot[2][
i] * hkl[2]);
149 return {{ hkl[0] /
DEN, hkl[1] /
DEN, hkl[2] /
DEN }};
156 constexpr double mult = -2 * 3.1415926535897932384626433832795 /
Op::DEN;
161 std::array<std::array<int, 4>, 4>
t;
162 for (
int i = 0;
i < 3; ++
i)
164 t[3] = { 0, 0, 0, 1 };
169 std::array<std::array<double, 4>, 4>
t;
171 for (
int i = 0;
i < 3; ++
i)
173 t[3] = { 0., 0., 0., 1. };
178 return {{
DEN,0,0, 0,
DEN,0, 0,0,
DEN}, {0,0,0}};
211 for (
int i = 0;
i != 3; ++
i)
220 static_assert(
Op::DEN == 24,
"");
224 fail(
"all numbers in Seitz matrix must be equal Z/24");
225 return static_cast<int>(
r);
228 if (std::fabs(
t[3][0]) + std::fabs(
t[3][1]) + std::fabs(
t[3][2]) +
229 std::fabs(
t[3][3] - 1) > 1
e-3)
230 fail(
"the last row in Seitz matrix must be [0 0 0 1]");
231 for (
int i = 0;
i < 3; ++
i) {
232 for (
int j = 0;
j < 3; ++
j)
243 static const signed char values[] =
245 { 1, 2, 3, 0, 0, 0, 0, 1, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 };
246 size_t idx = size_t((c | 0x20) -
'a');
247 if (idx >=
sizeof(values) || values[idx] == 0)
248 fail(
"unexpected character '", c,
"' in: ", s);
249 return values[idx] - 1;
253 std::array<int, 4>
r = { 0, 0, 0, 0 };
255 const char* c = s.c_str();
256 while (*(c = impl::skip_blank(c))) {
257 if (*c ==
'+' || *c ==
'-') {
259 c = impl::skip_blank(++c);
262 fail(
"wrong or unsupported triplet format: " + s);
265 if (*c >=
'0' && *c <=
'9') {
268 num *= std::strtol(c, &
endptr, 10);
272 c = impl::skip_blank(
endptr + 1);
282 c = impl::skip_blank(++c);
291 fail(
"Wrong denominator " + std::to_string(
den) +
" in: " + s);
298 fail(
"trailing sign in: " + s);
303 if (std::count(s.begin(), s.end(),
',') != 2)
304 fail(
"expected exactly two commas in triplet");
305 size_t comma1 = s.find(
',');
310 Op::Rot rot = {a[0], a[1], a[2], b[0], b[1], b[2], c[0], c[1], c[2]};
312 return { rot, tran };
321inline void append_small_number(std::string& s,
int n) {
322 if (n < 0 || n >= 100) {
323 s += std::to_string(n);
328 s += char(
'0' + tens);
329 s += char(
'0' + n - 10 * tens);
333inline void append_sign_of(std::string& s,
int n) {
341inline std::pair<int,int> get_op_fraction(
int w) {
344 for (
int i = 0; i != 3; ++i)
356inline void append_fraction(std::string& s, std::pair<int,int> frac) {
357 append_small_number(s, frac.first);
358 if (frac.second != 1) {
360 append_small_number(s, frac.second);
369 const char*
letters =
"xyz hkl abc XYZ HKL ABC";
370 switch(
style | 0x20) {
374 default:
fail(
"unexpected triplet style: ",
style);
378 for (
int i = 0;
i != 3; ++
i)
380 impl::append_sign_of(s, xyz[
i]);
381 int a = std::abs(xyz[
i]);
383 std::pair<int,int> frac = impl::get_op_fraction(a);
384 if (frac.first == 1) {
387 impl::append_small_number(s, frac.second);
389 impl::append_fraction(s, frac);
398 impl::append_sign_of(s, w);
399 std::pair<int,int> frac = impl::get_op_fraction(std::abs(w));
400 impl::append_fraction(s, frac);
418 constexpr int d = 2 *
t;
420 switch (centring_type & ~0x20) {
421 case 'P':
return {{0, 0, 0}};
422 case 'A':
return {{0, 0, 0}, {0,
h,
h}};
423 case 'B':
return {{0, 0, 0}, {
h, 0,
h}};
424 case 'C':
return {{0, 0, 0}, {
h,
h, 0}};
425 case 'I':
return {{0, 0, 0}, {
h,
h,
h}};
426 case 'R':
return {{0, 0, 0}, {
d,
t,
t}, {
t,
d,
d}};
428 case 'H':
return {{0, 0, 0}, {
d,
t, 0}, {
t,
d, 0}};
429 case 'S':
return {{0, 0, 0}, {
t,
t,
d}, {
d,
t,
d}};
430 case 'T':
return {{0, 0, 0}, {
t,
d,
t}, {
d,
t,
d}};
431 case 'F':
return {{0, 0, 0}, {0,
h,
h}, {
h, 0,
h}, {
h,
h, 0}};
432 default:
fail(
"not a centring type: ", centring_type);
466 for (
char c : {
'A',
'B',
'C',
'I',
'F',
'R',
'H',
'S',
'T'}) {
468 if (c ==
'R' || c ==
'H')
494 if (op.apply_to_hkl_without_division(hkl) ==
mhkl)
503 if (op.apply_to_hkl_without_division(hkl) ==
denh)
512 return (hkl[0] * c[0] + hkl[1] * c[1] + hkl[2] * c[2]) %
Op::DEN != 0;
521 if (op->apply_to_hkl_without_division(hkl) ==
denh) {
525 op->tran[2] + c[2]}}, hkl))
538 *op =
cob.combine(*op).combine(
inv).wrap();
561 *tr =
cob.combine(
cvec).combine(
inv).wrap().tran;
565 for (
int i =
static_cast<int>(
cen_ops.size()) - 1; i > 0; --i)
566 for (
int j = i - 1; j >= 0; --j)
578 ops.reserve(sym_ops.size() * cen_ops.size());
579 for (
const Op&
so : sym_ops)
581 ops.push_back(
so.add_centering(
co));
582 std::sort(
ops.begin(),
ops.end());
587 int n_cen = n / (
int) sym_ops.size();
588 int n_sym = n % (
int) sym_ops.size();
589 return sym_ops.at(n_sym).add_centering(cen_ops.at(n_cen));
593 if (cen_ops.size() != other.
cen_ops.size() ||
594 sym_ops.size() != other.
sym_ops.size())
600 if (cen_ops.size() != other.
cen_ops.size())
602 if (std::is_sorted(cen_ops.begin(), cen_ops.end()) &&
604 return cen_ops == other.
cen_ops;
605 std::vector<Op::Tran>
v1 = cen_ops;
606 std::vector<Op::Tran>
v2 = other.
cen_ops;
607 std::sort(
v1.begin(),
v1.end());
608 std::sort(
v2.begin(),
v2.end());
613 if (sym_ops.size() != other.
sym_ops.size())
616 std::vector<Op::Rot>
r(
g.sym_ops.size());
617 for (
size_t i = 0;
i !=
r.size(); ++
i)
618 r[
i] =
g.sym_ops[
i].rot;
619 std::sort(
r.begin(),
r.end());
629 int r[3] = {
T,
T,
T};
631 for (
int i = 0;
i != 3; ++
i)
632 if (op.tran[
i] != 0 && op.tran[
i] <
r[
i])
634 return {
T /
r[0],
T /
r[1],
T /
r[2]};
638 for (
const Op& op : sym_ops)
639 if (op.rot[u][v] != 0)
647 for (
Op& op :
r.sym_ops)
648 op.tran[0] = op.tran[1] = op.tran[2] = 0;
656 if (++n_sym == (
int) gops.
sym_ops.size()) {
662 return gops.
sym_ops.at(n_sym).translated(gops.
cen_ops.at(n_cen)).wrap();
665 return n_sym == other.
n_sym && n_cen == other.
n_cen;
671 Iter end()
const {
return {*
this, 0, (
int) cen_ops.size()}; };
674inline void GroupOps::add_missing_elements() {
676 if (sym_ops.empty() || sym_ops[0] != Op::identity())
678 if (sym_ops.size() == 1)
684 std::vector<Op>
gen(sym_ops.begin() + 1, sym_ops.end());
687 for (
Op g = sym_ops[1] * sym_ops[1];
g.rot !=
idrot;
g *= sym_ops[1]) {
688 sym_ops.push_back(
g);
690 fail(
"Too many elements in the group - bad generators");
696inline void GroupOps::add_missing_elements_part2(
const std::vector<Op>&
gen,
698 for (
size_t i = 1;
i <
gen.size(); ++
i) {
699 std::vector<Op>
coset_repr(1, Op::identity());
703 for (
size_t j = 0;
j != len; ++
j) {
704 for (
size_t n = 0; n !=
i + 1; ++n) {
706 if (find_by_rotation(
sg.rot) ==
nullptr) {
707 sym_ops.push_back(
sg);
709 sym_ops.push_back(
sg * sym_ops[
k]);
718 fail(
"Too many elements in the group - bad generators");
729 const Op identity = Op::identity();
731 go.sym_ops.push_back(identity);
732 for (
const Op& op :
ops)
733 if (
Op*
old_op =
go.find_by_rotation(op.rot)) {
734 if (op.rot == identity.
rot)
735 go.cen_ops.push_back(op.tran);
736 if (op.tran == identity.
tran)
739 go.sym_ops.push_back(op);
750 constexpr int d = Op::DEN;
752 case 1:
return {
d,0,0, 0,
d,0, 0,0,
d};
753 case 2:
return {-
d,0,0, 0,-
d,0, 0,0,
d};
754 case 3:
return {0,-
d,0,
d,-
d,0, 0,0,
d};
755 case 4:
return {0,-
d,0,
d,0,0, 0,0,
d};
756 case 6:
return {
d,-
d,0,
d,0,0, 0,0,
d};
757 case '\'':
return {0,-
d,0, -
d,0,0, 0,0,-
d};
758 case '"':
return {0,
d,0,
d,0,0, 0,0,-
d};
759 case '*':
return {0,0,
d,
d,0,0, 0,
d,0};
760 default:
fail(
"incorrect axis definition");
764 constexpr int h = Op::DEN / 2;
765 constexpr int q = Op::DEN / 4;
767 case 'a':
return {
h, 0, 0};
768 case 'b':
return {0,
h, 0};
769 case 'c':
return {0, 0,
h};
770 case 'n':
return {
h,
h,
h};
771 case 'u':
return {
q, 0, 0};
772 case 'v':
return {0,
q, 0};
773 case 'w':
return {0, 0,
q};
774 case 'd':
return {
q,
q,
q};
775 default:
fail(std::string(
"unknown symbol: ") + symbol);
780 int pos,
int& prev) {
781 Op op = Op::identity();
782 bool neg = (*start ==
'-');
783 const char*
p = (
neg ? start + 1 : start);
784 if (*
p <
'1' || *
p ==
'5' || *
p >
'6')
785 fail(
"wrong n-fold order notation: " + std::string(start, end));
790 for (;
p < end; ++
p) {
791 if (*
p >=
'1' && *
p <=
'5') {
793 fail(
"two numeric subscripts");
795 }
else if (*
p ==
'\'' || *
p ==
'"' || *
p ==
'*') {
796 if (
N != (*
p ==
'*' ? 3 : 2))
797 fail(
"wrong symbol: " + std::string(start, end));
799 }
else if (*
p ==
'x' || *
p ==
'y' || *
p ==
'z') {
809 }
else if (pos == 2 &&
N == 2) {
810 if (prev == 2 || prev == 4)
812 else if (prev == 3 || prev == 6)
814 }
else if (pos == 3 &&
N == 3) {
817 fail(
"missing axis");
842 if (std::memchr(start,
',', end - start) !=
nullptr)
845 Op cob = Op::identity();
847 for (
int i = 0;
i != 3; ++
i) {
848 cob.tran[
i] = std::strtol(start, &
endptr, 10) % 12 * (Op::DEN / 12);
852 fail(
"unexpected change-of-basis format: " + std::string(start, end));
858 while (*
p !=
'\0' && *
p !=
' ' && *
p !=
'\t' && *
p !=
'_')
864 hall = impl::skip_blank(hall);
866 ops.sym_ops.emplace_back(Op::identity());
868 const char*
lat = impl::skip_blank(
centrosym ? hall + 1 : hall);
870 fail(
"not a hall symbol: " + std::string(hall));
874 const char*
part = impl::skip_blank(
lat + 1);
875 while (*
part !=
'\0' && *
part !=
'(') {
878 if (
part[0] !=
'1' || (
part[1] !=
' ' &&
part[1] !=
'\0')) {
880 ops.sym_ops.emplace_back(op);
885 ops.sym_ops.push_back({Op::identity().negated_rot(), {0,0,0}});
887 const char*
rb = std::strchr(
part,
')');
889 fail(
"missing ')': " + std::string(hall));
890 if (
ops.sym_ops.empty())
891 fail(
"misplaced translation: " + std::string(hall));
895 fail(
"unexpected characters after ')': " + std::string(hall));
902 ops.add_missing_elements();
913 static const char*
names[7] = {
914 "triclinic",
"monoclinic",
"orthorhombic",
"tetragonal",
915 "trigonal",
"hexagonal",
"cubic"
921 C1=0,
Ci,
C2,
Cs,
C2h,
D2,
C2v,
D2h,
C4,
S4,
C4h,
D4,
C4v,
D2d,
D4h,
C3,
922 C3i,
D3,
C3v,
D3d,
C6,
C3h,
C6h,
D6,
C6v,
D3h,
D6h,
T,
Th,
O,
Td,
Oh
927 "1",
"-1",
"2",
"m",
"2/m",
"222",
"mm2",
"mmm",
928 "4",
"-4",
"4/m",
"422",
"4mm",
"-42m",
"4/mmm",
"3",
929 "-3",
"32",
"3m",
"-3m",
"6",
"-6",
"6/m",
"622",
930 "6mm",
"-62m",
"6/mmm",
"23",
"m-3",
"432",
"-43m",
"m-3m",
936enum class Laue :
unsigned char {
937 L1=0,
L2m,
Lmmm,
L4m,
L4mmm,
L3,
L3m,
L6m,
L6mmm,
Lm3,
Lm3m
943 Laue::L2m, Laue::L2m, Laue::L2m,
944 Laue::Lmmm, Laue::Lmmm, Laue::Lmmm,
945 Laue::L4m, Laue::L4m, Laue::L4m,
946 Laue::L4mmm, Laue::L4mmm, Laue::L4mmm, Laue::L4mmm,
948 Laue::L3m, Laue::L3m, Laue::L3m,
949 Laue::L6m, Laue::L6m, Laue::L6m,
950 Laue::L6mmm, Laue::L6mmm, Laue::L6mmm, Laue::L6mmm,
951 Laue::Lm3, Laue::Lm3,
952 Laue::Lm3m, Laue::Lm3m, Laue::Lm3m,
954 return laue[
static_cast<int>(
pg)];
960 PointGroup::Ci, PointGroup::C2h, PointGroup::D2h, PointGroup::C4h,
961 PointGroup::D4h, PointGroup::C3i, PointGroup::D3d, PointGroup::C6h,
962 PointGroup::D6h, PointGroup::Th, PointGroup::Oh
964 return pg[
static_cast<int>(
laue)];
973 CrystalSystem::Triclinic,
974 CrystalSystem::Monoclinic,
975 CrystalSystem::Orthorhombic,
976 CrystalSystem::Tetragonal, CrystalSystem::Tetragonal,
977 CrystalSystem::Trigonal, CrystalSystem::Trigonal,
978 CrystalSystem::Hexagonal, CrystalSystem::Hexagonal,
979 CrystalSystem::Cubic, CrystalSystem::Cubic
990 enum :
unsigned char {
S=0x20,
E=(0x20|0x40),
Y=0x80,
Z=(0x20|0x80) };
991 static const unsigned char indices[230] = {
992 0|
Z, 1|
Y, 2|
Z, 2|
S, 2|
Z, 3|
Y, 3, 3|
Y, 3, 4|
Y,
993 4, 4|
Y, 4, 4, 4, 5|
Z, 5|
S, 5|
S, 5|
S, 5|
S,
994 5|
Z, 5|
Z, 5|
Z, 5|
S, 6|
Y, 6, 6, 6, 6, 6,
995 6, 6, 6, 6, 6|
Y, 6, 6, 6|
Y, 6, 6,
996 6, 6|
Y, 6, 6|
Y, 6, 6, 7|
Y, 7, 7, 7,
997 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
998 7, 7, 7, 7, 7|
Y, 7, 7, 7, 7|
Y, 7,
999 7|
Y, 7, 7, 7, 8|
Z, 8|
E, 8|
S, 8|
E, 8|
Z, 8|
S,
1000 9|
Y, 9|
Y, 10|
Y, 10, 10, 10, 10|
Y, 10, 11|
Z, 11|
S,
1001 11|
E, 11|
E, 11|
S, 11|
S, 11|
E, 11|
E, 11|
Z, 11|
S, 12|
Y, 12,
1002 12, 12, 12, 12, 12, 12, 12|
Y, 12, 12, 12,
1003 13|
Y, 13, 13, 13, 13|
Y, 13, 13, 13, 13|
Y, 13,
1004 13|
Y, 13, 14|
Y, 14, 14, 14, 14, 14, 14, 14,
1005 14, 14, 14, 14, 14, 14, 14, 14, 14|
Y, 14,
1006 14, 14, 15|
Z, 15|
E, 15|
E, 15|
Z, 16|
Y, 16|
Y, 17|
Z, 17|
Z,
1007 17|
E, 17|
E, 17|
E, 17|
E, 17|
Z, 18|
Y, 18|
Y, 18, 18, 18|
Y,
1008 18, 19|
Y, 19, 19|
Y, 19, 19|
Y, 19, 20|
Z, 20|
E, 20|
E,
1009 20|
E, 20|
E, 20|
S, 21|
Y, 22|
Y, 22, 23|
Z, 23|
E, 23|
E, 23|
E,
1010 23|
E, 23|
S, 24|
Y, 24, 24, 24, 25|
Y, 25, 25|
Y, 25,
1011 26|
Y, 26, 26, 26, 27|
Z, 27|
Z, 27|
Z, 27|
S, 27|
S, 28|
Y,
1012 28, 28|
Y, 28, 28|
Y, 28, 28, 29|
Z, 29|
S, 29|
Z, 29|
S,
1013 29|
Z, 29|
E, 29|
E, 29|
S, 30|
Y, 30|
Y, 30|
Y, 30, 30, 30,
1014 31|
Y, 31, 31, 31, 31|
Y, 31, 31, 31, 31|
Y, 31
1044 constexpr int D = Op::DEN;
1046 case 43:
return {
D/8,
D/8, 0};
1047 case 80:
return {
D/4, 0, 0};
1048 case 98:
return {
D/4, 0,
D/8};
1049 case 109:
return {
D/4, 0, 0};
1050 case 110:
return {
D/4, 0, 0};
1051 case 122:
return {
D/4, 0,
D/8};
1052 case 210:
return {
D/8,
D/8,
D/8};
1053 default:
return {0, 0, 0};
1059 static const char*
basisops[49] = {
1080 "x-1/4,y-1/4,z-1/4",
1084 "x-1/2,y-1/4,z+1/4",
1085 "z+1/4,x-1/2,y-1/4",
1086 "y-1/4,z+1/4,x-1/2",
1087 "x+1/8,y+1/8,z+1/8",
1088 "x+1/4,y-1/4,z+1/4",
1090 "x+1/4,y+1/4,z+1/4",
1092 "x-1/4,y+1/4,z+1/4",
1093 "x-1/4,y+1/4,z-1/4",
1094 "x-1/2,y+1/4,z+1/8",
1095 "x-1/2,y+1/4,z-3/8",
1097 "x-1/8,y-1/8,z-1/8",
1098 "x+1/4,y+1/4,-x+z-1/4",
1101 "-x,-y/2+z/2,y/2+z/2",
1102 "-x/2+z/2,-y,x/2+z/2",
1103 "x/2+y/2,x/2-y/2,-z",
1104 "y/2+z/2,x/2+z/2,x/2+y/2",
1105 "-x/2+y/2+z/2,x/2-y/2+z/2,x/2+y/2-z/2",
1108 "x/2+y/2,-x/2+y/2,z",
1116 constexpr int D = Op::DEN;
1117 constexpr int H = Op::DEN / 2;
1118 constexpr int T = Op::DEN / 3;
1119 switch (centring_type) {
1120 case 'P':
return {
D,0,0, 0,
D,0, 0,0,
D};
1121 case 'A':
return {-
D,0,0, 0,-
H,
H, 0,
H,
H};
1122 case 'B':
return {-
H,0,
H, 0,-
D,0,
H,0,
H};
1123 case 'C':
return {
H,
H,0,
H,-
H,0, 0,0,-
D};
1124 case 'I':
return {-
H,
H,
H,
H,-
H,
H,
H,
H,-
H};
1125 case 'R':
return {2*
T,-
T,-
T,
T,
T,-2*
T,
T,
T,
T};
1126 case 'H':
return {2*
T,-
T,0,
T,
T,0, 0,0,
D};
1127 case 'F':
return {0,
H,
H,
H,0,
H,
H,
H,0};
1128 default:
fail(
"not a centring type: ", centring_type);
1145 std::string
ret = hm;
1161 size_t len = s.size();
1162 if (len > 6 && s[2] ==
'1' && s[len - 2] ==
' ' && s[len - 1] ==
'1')
1163 s = s[0] + s.substr(4, len - 4 - 2);
1166 s.erase(std::remove(s.begin(), s.end(),
' '), s.end());
1174 s += ccp4_lattice_type();
1201 return qualifier[qualifier[0] ==
'-' ? 1 : 0];
1215 if (is_centrosymmetric())
1216 return Op::identity();
1218 Op op{Op::inversion_rot(), {2*
t[0], 2*
t[1], 2*
t[2]}};
1219 if (!is_reference_setting()) {
1239template<
class Dummy>
1244 static const unsigned char ccp4_hkl_asu[230];
1247template<
class Dummy>
1248const SpaceGroup Tables_<Dummy>::main[559] = {
1252 { 1, 1,
"P 1" , 0,
"",
"P 1" , 0 },
1253 { 2, 2,
"P -1" , 0,
"",
"-P 1" , 0 },
1254 { 3, 3,
"P 1 2 1" , 0,
"b",
"P 2y" , 0 },
1255 { 3, 1003,
"P 1 1 2" , 0,
"c",
"P 2" , 1 },
1256 { 3, 0,
"P 2 1 1" , 0,
"a",
"P 2x" , 2 },
1257 { 4, 4,
"P 1 21 1" , 0,
"b",
"P 2yb" , 0 },
1258 { 4, 1004,
"P 1 1 21" , 0,
"c",
"P 2c" , 1 },
1259 { 4, 0,
"P 21 1 1" , 0,
"a",
"P 2xa" , 2 },
1260 { 5, 5,
"C 1 2 1" , 0,
"b1",
"C 2y" , 0 },
1261 { 5, 2005,
"A 1 2 1" , 0,
"b2",
"A 2y" , 3 },
1262 { 5, 4005,
"I 1 2 1" , 0,
"b3",
"I 2y" , 4 },
1263 { 5, 0,
"A 1 1 2" , 0,
"c1",
"A 2" , 1 },
1264 { 5, 1005,
"B 1 1 2" , 0,
"c2",
"B 2" , 5 },
1265 { 5, 0,
"I 1 1 2" , 0,
"c3",
"I 2" , 6 },
1266 { 5, 0,
"B 2 1 1" , 0,
"a1",
"B 2x" , 2 },
1267 { 5, 0,
"C 2 1 1" , 0,
"a2",
"C 2x" , 7 },
1268 { 5, 0,
"I 2 1 1" , 0,
"a3",
"I 2x" , 8 },
1269 { 6, 6,
"P 1 m 1" , 0,
"b",
"P -2y" , 0 },
1270 { 6, 1006,
"P 1 1 m" , 0,
"c",
"P -2" , 1 },
1271 { 6, 0,
"P m 1 1" , 0,
"a",
"P -2x" , 2 },
1272 { 7, 7,
"P 1 c 1" , 0,
"b1",
"P -2yc" , 0 },
1273 { 7, 0,
"P 1 n 1" , 0,
"b2",
"P -2yac" , 9 },
1274 { 7, 0,
"P 1 a 1" , 0,
"b3",
"P -2ya" , 3 },
1275 { 7, 0,
"P 1 1 a" , 0,
"c1",
"P -2a" , 1 },
1276 { 7, 0,
"P 1 1 n" , 0,
"c2",
"P -2ab" , 10},
1277 { 7, 1007,
"P 1 1 b" , 0,
"c3",
"P -2b" , 5 },
1278 { 7, 0,
"P b 1 1" , 0,
"a1",
"P -2xb" , 2 },
1279 { 7, 0,
"P n 1 1" , 0,
"a2",
"P -2xbc" , 11},
1280 { 7, 0,
"P c 1 1" , 0,
"a3",
"P -2xc" , 7 },
1281 { 8, 8,
"C 1 m 1" , 0,
"b1",
"C -2y" , 0 },
1282 { 8, 0,
"A 1 m 1" , 0,
"b2",
"A -2y" , 3 },
1283 { 8, 0,
"I 1 m 1" , 0,
"b3",
"I -2y" , 4 },
1284 { 8, 0,
"A 1 1 m" , 0,
"c1",
"A -2" , 1 },
1285 { 8, 1008,
"B 1 1 m" , 0,
"c2",
"B -2" , 5 },
1286 { 8, 0,
"I 1 1 m" , 0,
"c3",
"I -2" , 6 },
1287 { 8, 0,
"B m 1 1" , 0,
"a1",
"B -2x" , 2 },
1288 { 8, 0,
"C m 1 1" , 0,
"a2",
"C -2x" , 7 },
1289 { 8, 0,
"I m 1 1" , 0,
"a3",
"I -2x" , 8 },
1290 { 9, 9,
"C 1 c 1" , 0,
"b1",
"C -2yc" , 0 },
1291 { 9, 0,
"A 1 n 1" , 0,
"b2",
"A -2yab" , 12},
1292 { 9, 0,
"I 1 a 1" , 0,
"b3",
"I -2ya" , 13},
1293 { 9, 0,
"A 1 a 1" , 0,
"-b1",
"A -2ya" , 3 },
1294 { 9, 0,
"C 1 n 1" , 0,
"-b2",
"C -2yac" , 14},
1295 { 9, 0,
"I 1 c 1" , 0,
"-b3",
"I -2yc" , 4 },
1296 { 9, 0,
"A 1 1 a" , 0,
"c1",
"A -2a" , 1 },
1297 { 9, 0,
"B 1 1 n" , 0,
"c2",
"B -2ab" , 15},
1298 { 9, 0,
"I 1 1 b" , 0,
"c3",
"I -2b" , 16},
1299 { 9, 1009,
"B 1 1 b" , 0,
"-c1",
"B -2b" , 5 },
1300 { 9, 0,
"A 1 1 n" , 0,
"-c2",
"A -2ab" , 10},
1301 { 9, 0,
"I 1 1 a" , 0,
"-c3",
"I -2a" , 6 },
1302 { 9, 0,
"B b 1 1" , 0,
"a1",
"B -2xb" , 2 },
1303 { 9, 0,
"C n 1 1" , 0,
"a2",
"C -2xac" , 17},
1304 { 9, 0,
"I c 1 1" , 0,
"a3",
"I -2xc" , 18},
1305 { 9, 0,
"C c 1 1" , 0,
"-a1",
"C -2xc" , 7 },
1306 { 9, 0,
"B n 1 1" , 0,
"-a2",
"B -2xab" , 11},
1307 { 9, 0,
"I b 1 1" , 0,
"-a3",
"I -2xb" , 8 },
1308 { 10, 10,
"P 1 2/m 1" , 0,
"b",
"-P 2y" , 0 },
1309 { 10, 1010,
"P 1 1 2/m" , 0,
"c",
"-P 2" , 1 },
1310 { 10, 0,
"P 2/m 1 1" , 0,
"a",
"-P 2x" , 2 },
1311 { 11, 11,
"P 1 21/m 1", 0,
"b",
"-P 2yb" , 0 },
1312 { 11, 1011,
"P 1 1 21/m", 0,
"c",
"-P 2c" , 1 },
1313 { 11, 0,
"P 21/m 1 1", 0,
"a",
"-P 2xa" , 2 },
1314 { 12, 12,
"C 1 2/m 1" , 0,
"b1",
"-C 2y" , 0 },
1315 { 12, 0,
"A 1 2/m 1" , 0,
"b2",
"-A 2y" , 3 },
1316 { 12, 0,
"I 1 2/m 1" , 0,
"b3",
"-I 2y" , 4 },
1317 { 12, 0,
"A 1 1 2/m" , 0,
"c1",
"-A 2" , 1 },
1318 { 12, 1012,
"B 1 1 2/m" , 0,
"c2",
"-B 2" , 5 },
1319 { 12, 0,
"I 1 1 2/m" , 0,
"c3",
"-I 2" , 6 },
1320 { 12, 0,
"B 2/m 1 1" , 0,
"a1",
"-B 2x" , 2 },
1321 { 12, 0,
"C 2/m 1 1" , 0,
"a2",
"-C 2x" , 7 },
1322 { 12, 0,
"I 2/m 1 1" , 0,
"a3",
"-I 2x" , 8 },
1323 { 13, 13,
"P 1 2/c 1" , 0,
"b1",
"-P 2yc" , 0 },
1324 { 13, 0,
"P 1 2/n 1" , 0,
"b2",
"-P 2yac" , 9 },
1325 { 13, 0,
"P 1 2/a 1" , 0,
"b3",
"-P 2ya" , 3 },
1326 { 13, 0,
"P 1 1 2/a" , 0,
"c1",
"-P 2a" , 1 },
1327 { 13, 0,
"P 1 1 2/n" , 0,
"c2",
"-P 2ab" , 10},
1328 { 13, 1013,
"P 1 1 2/b" , 0,
"c3",
"-P 2b" , 5 },
1329 { 13, 0,
"P 2/b 1 1" , 0,
"a1",
"-P 2xb" , 2 },
1330 { 13, 0,
"P 2/n 1 1" , 0,
"a2",
"-P 2xbc" , 11},
1331 { 13, 0,
"P 2/c 1 1" , 0,
"a3",
"-P 2xc" , 7 },
1332 { 14, 14,
"P 1 21/c 1", 0,
"b1",
"-P 2ybc" , 0 },
1333 { 14, 2014,
"P 1 21/n 1", 0,
"b2",
"-P 2yn" , 9 },
1334 { 14, 3014,
"P 1 21/a 1", 0,
"b3",
"-P 2yab" , 3 },
1335 { 14, 0,
"P 1 1 21/a", 0,
"c1",
"-P 2ac" , 1 },
1336 { 14, 0,
"P 1 1 21/n", 0,
"c2",
"-P 2n" , 10},
1337 { 14, 1014,
"P 1 1 21/b", 0,
"c3",
"-P 2bc" , 5 },
1338 { 14, 0,
"P 21/b 1 1", 0,
"a1",
"-P 2xab" , 2 },
1339 { 14, 0,
"P 21/n 1 1", 0,
"a2",
"-P 2xn" , 11},
1340 { 14, 0,
"P 21/c 1 1", 0,
"a3",
"-P 2xac" , 7 },
1341 { 15, 15,
"C 1 2/c 1" , 0,
"b1",
"-C 2yc" , 0 },
1342 { 15, 0,
"A 1 2/n 1" , 0,
"b2",
"-A 2yab" , 12},
1343 { 15, 0,
"I 1 2/a 1" , 0,
"b3",
"-I 2ya" , 13},
1344 { 15, 0,
"A 1 2/a 1" , 0,
"-b1",
"-A 2ya" , 3 },
1345 { 15, 0,
"C 1 2/n 1" , 0,
"-b2",
"-C 2yac" , 19},
1346 { 15, 0,
"I 1 2/c 1" , 0,
"-b3",
"-I 2yc" , 4 },
1347 { 15, 0,
"A 1 1 2/a" , 0,
"c1",
"-A 2a" , 1 },
1348 { 15, 0,
"B 1 1 2/n" , 0,
"c2",
"-B 2ab" , 15},
1349 { 15, 0,
"I 1 1 2/b" , 0,
"c3",
"-I 2b" , 16},
1350 { 15, 1015,
"B 1 1 2/b" , 0,
"-c1",
"-B 2b" , 5 },
1351 { 15, 0,
"A 1 1 2/n" , 0,
"-c2",
"-A 2ab" , 10},
1352 { 15, 0,
"I 1 1 2/a" , 0,
"-c3",
"-I 2a" , 6 },
1353 { 15, 0,
"B 2/b 1 1" , 0,
"a1",
"-B 2xb" , 2 },
1354 { 15, 0,
"C 2/n 1 1" , 0,
"a2",
"-C 2xac" , 17},
1355 { 15, 0,
"I 2/c 1 1" , 0,
"a3",
"-I 2xc" , 18},
1356 { 15, 0,
"C 2/c 1 1" , 0,
"-a1",
"-C 2xc" , 7 },
1357 { 15, 0,
"B 2/n 1 1" , 0,
"-a2",
"-B 2xab" , 11},
1358 { 15, 0,
"I 2/b 1 1" , 0,
"-a3",
"-I 2xb" , 8 },
1359 { 16, 16,
"P 2 2 2" , 0,
"",
"P 2 2" , 0 },
1360 { 17, 17,
"P 2 2 21" , 0,
"",
"P 2c 2" , 0 },
1361 { 17, 1017,
"P 21 2 2" , 0,
"cab",
"P 2a 2a" , 1 },
1362 { 17, 2017,
"P 2 21 2" , 0,
"bca",
"P 2 2b" , 2 },
1363 { 18, 18,
"P 21 21 2" , 0,
"",
"P 2 2ab" , 0 },
1364 { 18, 3018,
"P 2 21 21" , 0,
"cab",
"P 2bc 2" , 1 },
1365 { 18, 2018,
"P 21 2 21" , 0,
"bca",
"P 2ac 2ac" , 2 },
1366 { 19, 19,
"P 21 21 21", 0,
"",
"P 2ac 2ab" , 0 },
1367 { 20, 20,
"C 2 2 21" , 0,
"",
"C 2c 2" , 0 },
1368 { 20, 0,
"A 21 2 2" , 0,
"cab",
"A 2a 2a" , 1 },
1369 { 20, 0,
"B 2 21 2" , 0,
"bca",
"B 2 2b" , 2 },
1370 { 21, 21,
"C 2 2 2" , 0,
"",
"C 2 2" , 0 },
1371 { 21, 0,
"A 2 2 2" , 0,
"cab",
"A 2 2" , 1 },
1372 { 21, 0,
"B 2 2 2" , 0,
"bca",
"B 2 2" , 2 },
1373 { 22, 22,
"F 2 2 2" , 0,
"",
"F 2 2" , 0 },
1374 { 23, 23,
"I 2 2 2" , 0,
"",
"I 2 2" , 0 },
1375 { 24, 24,
"I 21 21 21", 0,
"",
"I 2b 2c" , 0 },
1376 { 25, 25,
"P m m 2" , 0,
"",
"P 2 -2" , 0 },
1377 { 25, 0,
"P 2 m m" , 0,
"cab",
"P -2 2" , 1 },
1378 { 25, 0,
"P m 2 m" , 0,
"bca",
"P -2 -2" , 2 },
1379 { 26, 26,
"P m c 21" , 0,
"",
"P 2c -2" , 0 },
1380 { 26, 0,
"P c m 21" , 0,
"ba-c",
"P 2c -2c" , 7 },
1381 { 26, 0,
"P 21 m a" , 0,
"cab",
"P -2a 2a" , 1 },
1382 { 26, 0,
"P 21 a m" , 0,
"-cba",
"P -2 2a" , 3 },
1383 { 26, 0,
"P b 21 m" , 0,
"bca",
"P -2 -2b" , 2 },
1384 { 26, 0,
"P m 21 b" , 0,
"a-cb",
"P -2b -2" , 5 },
1385 { 27, 27,
"P c c 2" , 0,
"",
"P 2 -2c" , 0 },
1386 { 27, 0,
"P 2 a a" , 0,
"cab",
"P -2a 2" , 1 },
1387 { 27, 0,
"P b 2 b" , 0,
"bca",
"P -2b -2b" , 2 },
1388 { 28, 28,
"P m a 2" , 0,
"",
"P 2 -2a" , 0 },
1389 { 28, 0,
"P b m 2" , 0,
"ba-c",
"P 2 -2b" , 7 },
1390 { 28, 0,
"P 2 m b" , 0,
"cab",
"P -2b 2" , 1 },
1391 { 28, 0,
"P 2 c m" , 0,
"-cba",
"P -2c 2" , 3 },
1392 { 28, 0,
"P c 2 m" , 0,
"bca",
"P -2c -2c" , 2 },
1393 { 28, 0,
"P m 2 a" , 0,
"a-cb",
"P -2a -2a" , 5 },
1394 { 29, 29,
"P c a 21" , 0,
"",
"P 2c -2ac" , 0 },
1395 { 29, 0,
"P b c 21" , 0,
"ba-c",
"P 2c -2b" , 7 },
1396 { 29, 0,
"P 21 a b" , 0,
"cab",
"P -2b 2a" , 1 },
1397 { 29, 0,
"P 21 c a" , 0,
"-cba",
"P -2ac 2a" , 3 },
1398 { 29, 0,
"P c 21 b" , 0,
"bca",
"P -2bc -2c" , 2 },
1399 { 29, 0,
"P b 21 a" , 0,
"a-cb",
"P -2a -2ab" , 5 },
1400 { 30, 30,
"P n c 2" , 0,
"",
"P 2 -2bc" , 0 },
1401 { 30, 0,
"P c n 2" , 0,
"ba-c",
"P 2 -2ac" , 7 },
1402 { 30, 0,
"P 2 n a" , 0,
"cab",
"P -2ac 2" , 1 },
1403 { 30, 0,
"P 2 a n" , 0,
"-cba",
"P -2ab 2" , 3 },
1404 { 30, 0,
"P b 2 n" , 0,
"bca",
"P -2ab -2ab" , 2 },
1405 { 30, 0,
"P n 2 b" , 0,
"a-cb",
"P -2bc -2bc" , 5 },
1406 { 31, 31,
"P m n 21" , 0,
"",
"P 2ac -2" , 0 },
1407 { 31, 0,
"P n m 21" , 0,
"ba-c",
"P 2bc -2bc" , 7 },
1408 { 31, 0,
"P 21 m n" , 0,
"cab",
"P -2ab 2ab" , 1 },
1409 { 31, 0,
"P 21 n m" , 0,
"-cba",
"P -2 2ac" , 3 },
1410 { 31, 0,
"P n 21 m" , 0,
"bca",
"P -2 -2bc" , 2 },
1411 { 31, 0,
"P m 21 n" , 0,
"a-cb",
"P -2ab -2" , 5 },
1412 { 32, 32,
"P b a 2" , 0,
"",
"P 2 -2ab" , 0 },
1413 { 32, 0,
"P 2 c b" , 0,
"cab",
"P -2bc 2" , 1 },
1414 { 32, 0,
"P c 2 a" , 0,
"bca",
"P -2ac -2ac" , 2 },
1415 { 33, 33,
"P n a 21" , 0,
"",
"P 2c -2n" , 0 },
1416 { 33, 0,
"P b n 21" , 0,
"ba-c",
"P 2c -2ab" , 7 },
1417 { 33, 0,
"P 21 n b" , 0,
"cab",
"P -2bc 2a" , 1 },
1418 { 33, 0,
"P 21 c n" , 0,
"-cba",
"P -2n 2a" , 3 },
1419 { 33, 0,
"P c 21 n" , 0,
"bca",
"P -2n -2ac" , 2 },
1420 { 33, 0,
"P n 21 a" , 0,
"a-cb",
"P -2ac -2n" , 5 },
1421 { 34, 34,
"P n n 2" , 0,
"",
"P 2 -2n" , 0 },
1422 { 34, 0,
"P 2 n n" , 0,
"cab",
"P -2n 2" , 1 },
1423 { 34, 0,
"P n 2 n" , 0,
"bca",
"P -2n -2n" , 2 },
1424 { 35, 35,
"C m m 2" , 0,
"",
"C 2 -2" , 0 },
1425 { 35, 0,
"A 2 m m" , 0,
"cab",
"A -2 2" , 1 },
1426 { 35, 0,
"B m 2 m" , 0,
"bca",
"B -2 -2" , 2 },
1427 { 36, 36,
"C m c 21" , 0,
"",
"C 2c -2" , 0 },
1428 { 36, 0,
"C c m 21" , 0,
"ba-c",
"C 2c -2c" , 7 },
1429 { 36, 0,
"A 21 m a" , 0,
"cab",
"A -2a 2a" , 1 },
1430 { 36, 0,
"A 21 a m" , 0,
"-cba",
"A -2 2a" , 3 },
1431 { 36, 0,
"B b 21 m" , 0,
"bca",
"B -2 -2b" , 2 },
1432 { 36, 0,
"B m 21 b" , 0,
"a-cb",
"B -2b -2" , 5 },
1433 { 37, 37,
"C c c 2" , 0,
"",
"C 2 -2c" , 0 },
1434 { 37, 0,
"A 2 a a" , 0,
"cab",
"A -2a 2" , 1 },
1435 { 37, 0,
"B b 2 b" , 0,
"bca",
"B -2b -2b" , 2 },
1436 { 38, 38,
"A m m 2" , 0,
"",
"A 2 -2" , 0 },
1437 { 38, 0,
"B m m 2" , 0,
"ba-c",
"B 2 -2" , 7 },
1438 { 38, 0,
"B 2 m m" , 0,
"cab",
"B -2 2" , 1 },
1439 { 38, 0,
"C 2 m m" , 0,
"-cba",
"C -2 2" , 3 },
1440 { 38, 0,
"C m 2 m" , 0,
"bca",
"C -2 -2" , 2 },
1441 { 38, 0,
"A m 2 m" , 0,
"a-cb",
"A -2 -2" , 5 },
1442 { 39, 39,
"A b m 2" , 0,
"",
"A 2 -2b" , 0 },
1443 { 39, 0,
"B m a 2" , 0,
"ba-c",
"B 2 -2a" , 7 },
1444 { 39, 0,
"B 2 c m" , 0,
"cab",
"B -2a 2" , 1 },
1445 { 39, 0,
"C 2 m b" , 0,
"-cba",
"C -2a 2" , 3 },
1446 { 39, 0,
"C m 2 a" , 0,
"bca",
"C -2a -2a" , 2 },
1447 { 39, 0,
"A c 2 m" , 0,
"a-cb",
"A -2b -2b" , 5 },
1448 { 40, 40,
"A m a 2" , 0,
"",
"A 2 -2a" , 0 },
1449 { 40, 0,
"B b m 2" , 0,
"ba-c",
"B 2 -2b" , 7 },
1450 { 40, 0,
"B 2 m b" , 0,
"cab",
"B -2b 2" , 1 },
1451 { 40, 0,
"C 2 c m" , 0,
"-cba",
"C -2c 2" , 3 },
1452 { 40, 0,
"C c 2 m" , 0,
"bca",
"C -2c -2c" , 2 },
1453 { 40, 0,
"A m 2 a" , 0,
"a-cb",
"A -2a -2a" , 5 },
1454 { 41, 41,
"A b a 2" , 0,
"",
"A 2 -2ab" , 0 },
1455 { 41, 0,
"B b a 2" , 0,
"ba-c",
"B 2 -2ab" , 7 },
1456 { 41, 0,
"B 2 c b" , 0,
"cab",
"B -2ab 2" , 1 },
1457 { 41, 0,
"C 2 c b" , 0,
"-cba",
"C -2ac 2" , 3 },
1458 { 41, 0,
"C c 2 a" , 0,
"bca",
"C -2ac -2ac" , 2 },
1459 { 41, 0,
"A c 2 a" , 0,
"a-cb",
"A -2ab -2ab" , 5 },
1460 { 42, 42,
"F m m 2" , 0,
"",
"F 2 -2" , 0 },
1461 { 42, 0,
"F 2 m m" , 0,
"cab",
"F -2 2" , 1 },
1462 { 42, 0,
"F m 2 m" , 0,
"bca",
"F -2 -2" , 2 },
1463 { 43, 43,
"F d d 2" , 0,
"",
"F 2 -2d" , 0 },
1464 { 43, 0,
"F 2 d d" , 0,
"cab",
"F -2d 2" , 1 },
1465 { 43, 0,
"F d 2 d" , 0,
"bca",
"F -2d -2d" , 2 },
1466 { 44, 44,
"I m m 2" , 0,
"",
"I 2 -2" , 0 },
1467 { 44, 0,
"I 2 m m" , 0,
"cab",
"I -2 2" , 1 },
1468 { 44, 0,
"I m 2 m" , 0,
"bca",
"I -2 -2" , 2 },
1469 { 45, 45,
"I b a 2" , 0,
"",
"I 2 -2c" , 0 },
1470 { 45, 0,
"I 2 c b" , 0,
"cab",
"I -2a 2" , 1 },
1471 { 45, 0,
"I c 2 a" , 0,
"bca",
"I -2b -2b" , 2 },
1472 { 46, 46,
"I m a 2" , 0,
"",
"I 2 -2a" , 0 },
1473 { 46, 0,
"I b m 2" , 0,
"ba-c",
"I 2 -2b" , 7 },
1474 { 46, 0,
"I 2 m b" , 0,
"cab",
"I -2b 2" , 1 },
1475 { 46, 0,
"I 2 c m" , 0,
"-cba",
"I -2c 2" , 3 },
1476 { 46, 0,
"I c 2 m" , 0,
"bca",
"I -2c -2c" , 2 },
1477 { 46, 0,
"I m 2 a" , 0,
"a-cb",
"I -2a -2a" , 5 },
1478 { 47, 47,
"P m m m" , 0,
"",
"-P 2 2" , 0 },
1479 { 48, 48,
"P n n n" ,
'1',
"",
"P 2 2 -1n" , 20},
1480 { 48, 0,
"P n n n" ,
'2',
"",
"-P 2ab 2bc" , 0 },
1481 { 49, 49,
"P c c m" , 0,
"",
"-P 2 2c" , 0 },
1482 { 49, 0,
"P m a a" , 0,
"cab",
"-P 2a 2" , 1 },
1483 { 49, 0,
"P b m b" , 0,
"bca",
"-P 2b 2b" , 2 },
1484 { 50, 50,
"P b a n" ,
'1',
"",
"P 2 2 -1ab" , 21},
1485 { 50, 0,
"P b a n" ,
'2',
"",
"-P 2ab 2b" , 0 },
1486 { 50, 0,
"P n c b" ,
'1',
"cab",
"P 2 2 -1bc" , 22},
1487 { 50, 0,
"P n c b" ,
'2',
"cab",
"-P 2b 2bc" , 1 },
1488 { 50, 0,
"P c n a" ,
'1',
"bca",
"P 2 2 -1ac" , 23},
1489 { 50, 0,
"P c n a" ,
'2',
"bca",
"-P 2a 2c" , 2 },
1490 { 51, 51,
"P m m a" , 0,
"",
"-P 2a 2a" , 0 },
1491 { 51, 0,
"P m m b" , 0,
"ba-c",
"-P 2b 2" , 7 },
1492 { 51, 0,
"P b m m" , 0,
"cab",
"-P 2 2b" , 1 },
1493 { 51, 0,
"P c m m" , 0,
"-cba",
"-P 2c 2c" , 3 },
1494 { 51, 0,
"P m c m" , 0,
"bca",
"-P 2c 2" , 2 },
1495 { 51, 0,
"P m a m" , 0,
"a-cb",
"-P 2 2a" , 5 },
1496 { 52, 52,
"P n n a" , 0,
"",
"-P 2a 2bc" , 0 },
1497 { 52, 0,
"P n n b" , 0,
"ba-c",
"-P 2b 2n" , 7 },
1498 { 52, 0,
"P b n n" , 0,
"cab",
"-P 2n 2b" , 1 },
1499 { 52, 0,
"P c n n" , 0,
"-cba",
"-P 2ab 2c" , 3 },
1500 { 52, 0,
"P n c n" , 0,
"bca",
"-P 2ab 2n" , 2 },
1501 { 52, 0,
"P n a n" , 0,
"a-cb",
"-P 2n 2bc" , 5 },
1502 { 53, 53,
"P m n a" , 0,
"",
"-P 2ac 2" , 0 },
1503 { 53, 0,
"P n m b" , 0,
"ba-c",
"-P 2bc 2bc" , 7 },
1504 { 53, 0,
"P b m n" , 0,
"cab",
"-P 2ab 2ab" , 1 },
1505 { 53, 0,
"P c n m" , 0,
"-cba",
"-P 2 2ac" , 3 },
1506 { 53, 0,
"P n c m" , 0,
"bca",
"-P 2 2bc" , 2 },
1507 { 53, 0,
"P m a n" , 0,
"a-cb",
"-P 2ab 2" , 5 },
1508 { 54, 54,
"P c c a" , 0,
"",
"-P 2a 2ac" , 0 },
1509 { 54, 0,
"P c c b" , 0,
"ba-c",
"-P 2b 2c" , 7 },
1510 { 54, 0,
"P b a a" , 0,
"cab",
"-P 2a 2b" , 1 },
1511 { 54, 0,
"P c a a" , 0,
"-cba",
"-P 2ac 2c" , 3 },
1512 { 54, 0,
"P b c b" , 0,
"bca",
"-P 2bc 2b" , 2 },
1513 { 54, 0,
"P b a b" , 0,
"a-cb",
"-P 2b 2ab" , 5 },
1514 { 55, 55,
"P b a m" , 0,
"",
"-P 2 2ab" , 0 },
1515 { 55, 0,
"P m c b" , 0,
"cab",
"-P 2bc 2" , 1 },
1516 { 55, 0,
"P c m a" , 0,
"bca",
"-P 2ac 2ac" , 2 },
1517 { 56, 56,
"P c c n" , 0,
"",
"-P 2ab 2ac" , 0 },
1518 { 56, 0,
"P n a a" , 0,
"cab",
"-P 2ac 2bc" , 1 },
1519 { 56, 0,
"P b n b" , 0,
"bca",
"-P 2bc 2ab" , 2 },
1520 { 57, 57,
"P b c m" , 0,
"",
"-P 2c 2b" , 0 },
1521 { 57, 0,
"P c a m" , 0,
"ba-c",
"-P 2c 2ac" , 7 },
1522 { 57, 0,
"P m c a" , 0,
"cab",
"-P 2ac 2a" , 1 },
1523 { 57, 0,
"P m a b" , 0,
"-cba",
"-P 2b 2a" , 3 },
1524 { 57, 0,
"P b m a" , 0,
"bca",
"-P 2a 2ab" , 2 },
1525 { 57, 0,
"P c m b" , 0,
"a-cb",
"-P 2bc 2c" , 5 },
1526 { 58, 58,
"P n n m" , 0,
"",
"-P 2 2n" , 0 },
1527 { 58, 0,
"P m n n" , 0,
"cab",
"-P 2n 2" , 1 },
1528 { 58, 0,
"P n m n" , 0,
"bca",
"-P 2n 2n" , 2 },
1529 { 59, 59,
"P m m n" ,
'1',
"",
"P 2 2ab -1ab" , 21},
1530 { 59, 1059,
"P m m n" ,
'2',
"",
"-P 2ab 2a" , 0 },
1531 { 59, 0,
"P n m m" ,
'1',
"cab",
"P 2bc 2 -1bc" , 22},
1532 { 59, 0,
"P n m m" ,
'2',
"cab",
"-P 2c 2bc" , 1 },
1533 { 59, 0,
"P m n m" ,
'1',
"bca",
"P 2ac 2ac -1ac", 23},
1534 { 59, 0,
"P m n m" ,
'2',
"bca",
"-P 2c 2a" , 2 },
1535 { 60, 60,
"P b c n" , 0,
"",
"-P 2n 2ab" , 0 },
1536 { 60, 0,
"P c a n" , 0,
"ba-c",
"-P 2n 2c" , 7 },
1537 { 60, 0,
"P n c a" , 0,
"cab",
"-P 2a 2n" , 1 },
1538 { 60, 0,
"P n a b" , 0,
"-cba",
"-P 2bc 2n" , 3 },
1539 { 60, 0,
"P b n a" , 0,
"bca",
"-P 2ac 2b" , 2 },
1540 { 60, 0,
"P c n b" , 0,
"a-cb",
"-P 2b 2ac" , 5 },
1541 { 61, 61,
"P b c a" , 0,
"",
"-P 2ac 2ab" , 0 },
1542 { 61, 0,
"P c a b" , 0,
"ba-c",
"-P 2bc 2ac" , 3 },
1543 { 62, 62,
"P n m a" , 0,
"",
"-P 2ac 2n" , 0 },
1544 { 62, 0,
"P m n b" , 0,
"ba-c",
"-P 2bc 2a" , 7 },
1545 { 62, 0,
"P b n m" , 0,
"cab",
"-P 2c 2ab" , 1 },
1546 { 62, 0,
"P c m n" , 0,
"-cba",
"-P 2n 2ac" , 3 },
1547 { 62, 0,
"P m c n" , 0,
"bca",
"-P 2n 2a" , 2 },
1548 { 62, 0,
"P n a m" , 0,
"a-cb",
"-P 2c 2n" , 5 },
1549 { 63, 63,
"C m c m" , 0,
"",
"-C 2c 2" , 0 },
1550 { 63, 0,
"C c m m" , 0,
"ba-c",
"-C 2c 2c" , 7 },
1551 { 63, 0,
"A m m a" , 0,
"cab",
"-A 2a 2a" , 1 },
1552 { 63, 0,
"A m a m" , 0,
"-cba",
"-A 2 2a" , 3 },
1553 { 63, 0,
"B b m m" , 0,
"bca",
"-B 2 2b" , 2 },
1554 { 63, 0,
"B m m b" , 0,
"a-cb",
"-B 2b 2" , 5 },
1555 { 64, 64,
"C m c a" , 0,
"",
"-C 2ac 2" , 0 },
1556 { 64, 0,
"C c m b" , 0,
"ba-c",
"-C 2ac 2ac" , 7 },
1557 { 64, 0,
"A b m a" , 0,
"cab",
"-A 2ab 2ab" , 1 },
1558 { 64, 0,
"A c a m" , 0,
"-cba",
"-A 2 2ab" , 3 },
1559 { 64, 0,
"B b c m" , 0,
"bca",
"-B 2 2ab" , 2 },
1560 { 64, 0,
"B m a b" , 0,
"a-cb",
"-B 2ab 2" , 5 },
1561 { 65, 65,
"C m m m" , 0,
"",
"-C 2 2" , 0 },
1562 { 65, 0,
"A m m m" , 0,
"cab",
"-A 2 2" , 1 },
1563 { 65, 0,
"B m m m" , 0,
"bca",
"-B 2 2" , 2 },
1564 { 66, 66,
"C c c m" , 0,
"",
"-C 2 2c" , 0 },
1565 { 66, 0,
"A m a a" , 0,
"cab",
"-A 2a 2" , 1 },
1566 { 66, 0,
"B b m b" , 0,
"bca",
"-B 2b 2b" , 2 },
1567 { 67, 67,
"C m m a" , 0,
"",
"-C 2a 2" , 0 },
1568 { 67, 0,
"C m m b" , 0,
"ba-c",
"-C 2a 2a" , 14},
1569 { 67, 0,
"A b m m" , 0,
"cab",
"-A 2b 2b" , 1 },
1570 { 67, 0,
"A c m m" , 0,
"-cba",
"-A 2 2b" , 3 },
1571 { 67, 0,
"B m c m" , 0,
"bca",
"-B 2 2a" , 2 },
1572 { 67, 0,
"B m a m" , 0,
"a-cb",
"-B 2a 2" , 5 },
1573 { 68, 68,
"C c c a" ,
'1',
"",
"C 2 2 -1ac" , 24},
1574 { 68, 0,
"C c c a" ,
'2',
"",
"-C 2a 2ac" , 0 },
1575 { 68, 0,
"C c c b" ,
'1',
"ba-c",
"C 2 2 -1ac" , 24},
1576 { 68, 0,
"C c c b" ,
'2',
"ba-c",
"-C 2a 2c" , 21},
1577 { 68, 0,
"A b a a" ,
'1',
"cab",
"A 2 2 -1ab" , 25},
1578 { 68, 0,
"A b a a" ,
'2',
"cab",
"-A 2a 2b" , 1 },
1579 { 68, 0,
"A c a a" ,
'1',
"-cba",
"A 2 2 -1ab" , 25},
1580 { 68, 0,
"A c a a" ,
'2',
"-cba",
"-A 2ab 2b" , 3 },
1581 { 68, 0,
"B b c b" ,
'1',
"bca",
"B 2 2 -1ab" , 26},
1582 { 68, 0,
"B b c b" ,
'2',
"bca",
"-B 2ab 2b" , 2 },
1583 { 68, 0,
"B b a b" ,
'1',
"a-cb",
"B 2 2 -1ab" , 26},
1584 { 68, 0,
"B b a b" ,
'2',
"a-cb",
"-B 2b 2ab" , 5 },
1585 { 69, 69,
"F m m m" , 0,
"",
"-F 2 2" , 0 },
1586 { 70, 70,
"F d d d" ,
'1',
"",
"F 2 2 -1d" , 27},
1587 { 70, 0,
"F d d d" ,
'2',
"",
"-F 2uv 2vw" , 0 },
1588 { 71, 71,
"I m m m" , 0,
"",
"-I 2 2" , 0 },
1589 { 72, 72,
"I b a m" , 0,
"",
"-I 2 2c" , 0 },
1590 { 72, 0,
"I m c b" , 0,
"cab",
"-I 2a 2" , 1 },
1591 { 72, 0,
"I c m a" , 0,
"bca",
"-I 2b 2b" , 2 },
1592 { 73, 73,
"I b c a" , 0,
"",
"-I 2b 2c" , 0 },
1593 { 73, 0,
"I c a b" , 0,
"ba-c",
"-I 2a 2b" , 28},
1594 { 74, 74,
"I m m a" , 0,
"",
"-I 2b 2" , 0 },
1595 { 74, 0,
"I m m b" , 0,
"ba-c",
"-I 2a 2a" , 28},
1596 { 74, 0,
"I b m m" , 0,
"cab",
"-I 2c 2c" , 1 },
1597 { 74, 0,
"I c m m" , 0,
"-cba",
"-I 2 2b" , 3 },
1598 { 74, 0,
"I m c m" , 0,
"bca",
"-I 2 2a" , 2 },
1599 { 74, 0,
"I m a m" , 0,
"a-cb",
"-I 2c 2" , 5 },
1600 { 75, 75,
"P 4" , 0,
"",
"P 4" , 0 },
1601 { 76, 76,
"P 41" , 0,
"",
"P 4w" , 0 },
1602 { 77, 77,
"P 42" , 0,
"",
"P 4c" , 0 },
1603 { 78, 78,
"P 43" , 0,
"",
"P 4cw" , 0 },
1604 { 79, 79,
"I 4" , 0,
"",
"I 4" , 0 },
1605 { 80, 80,
"I 41" , 0,
"",
"I 4bw" , 0 },
1606 { 81, 81,
"P -4" , 0,
"",
"P -4" , 0 },
1607 { 82, 82,
"I -4" , 0,
"",
"I -4" , 0 },
1608 { 83, 83,
"P 4/m" , 0,
"",
"-P 4" , 0 },
1609 { 84, 84,
"P 42/m" , 0,
"",
"-P 4c" , 0 },
1610 { 85, 85,
"P 4/n" ,
'1',
"",
"P 4ab -1ab" , 29},
1611 { 85, 0,
"P 4/n" ,
'2',
"",
"-P 4a" , 0 },
1612 { 86, 86,
"P 42/n" ,
'1',
"",
"P 4n -1n" , 30},
1613 { 86, 0,
"P 42/n" ,
'2',
"",
"-P 4bc" , 0 },
1614 { 87, 87,
"I 4/m" , 0,
"",
"-I 4" , 0 },
1615 { 88, 88,
"I 41/a" ,
'1',
"",
"I 4bw -1bw" , 31},
1616 { 88, 0,
"I 41/a" ,
'2',
"",
"-I 4ad" , 0 },
1617 { 89, 89,
"P 4 2 2" , 0,
"",
"P 4 2" , 0 },
1618 { 90, 90,
"P 4 21 2" , 0,
"",
"P 4ab 2ab" , 0 },
1619 { 91, 91,
"P 41 2 2" , 0,
"",
"P 4w 2c" , 0 },
1620 { 92, 92,
"P 41 21 2" , 0,
"",
"P 4abw 2nw" , 0 },
1621 { 93, 93,
"P 42 2 2" , 0,
"",
"P 4c 2" , 0 },
1622 { 94, 94,
"P 42 21 2" , 0,
"",
"P 4n 2n" , 0 },
1623 { 95, 95,
"P 43 2 2" , 0,
"",
"P 4cw 2c" , 0 },
1624 { 96, 96,
"P 43 21 2" , 0,
"",
"P 4nw 2abw" , 0 },
1625 { 97, 97,
"I 4 2 2" , 0,
"",
"I 4 2" , 0 },
1626 { 98, 98,
"I 41 2 2" , 0,
"",
"I 4bw 2bw" , 0 },
1627 { 99, 99,
"P 4 m m" , 0,
"",
"P 4 -2" , 0 },
1628 {100, 100,
"P 4 b m" , 0,
"",
"P 4 -2ab" , 0 },
1629 {101, 101,
"P 42 c m" , 0,
"",
"P 4c -2c" , 0 },
1630 {102, 102,
"P 42 n m" , 0,
"",
"P 4n -2n" , 0 },
1631 {103, 103,
"P 4 c c" , 0,
"",
"P 4 -2c" , 0 },
1632 {104, 104,
"P 4 n c" , 0,
"",
"P 4 -2n" , 0 },
1633 {105, 105,
"P 42 m c" , 0,
"",
"P 4c -2" , 0 },
1634 {106, 106,
"P 42 b c" , 0,
"",
"P 4c -2ab" , 0 },
1635 {107, 107,
"I 4 m m" , 0,
"",
"I 4 -2" , 0 },
1636 {108, 108,
"I 4 c m" , 0,
"",
"I 4 -2c" , 0 },
1637 {109, 109,
"I 41 m d" , 0,
"",
"I 4bw -2" , 0 },
1638 {110, 110,
"I 41 c d" , 0,
"",
"I 4bw -2c" , 0 },
1639 {111, 111,
"P -4 2 m" , 0,
"",
"P -4 2" , 0 },
1640 {112, 112,
"P -4 2 c" , 0,
"",
"P -4 2c" , 0 },
1641 {113, 113,
"P -4 21 m" , 0,
"",
"P -4 2ab" , 0 },
1642 {114, 114,
"P -4 21 c" , 0,
"",
"P -4 2n" , 0 },
1643 {115, 115,
"P -4 m 2" , 0,
"",
"P -4 -2" , 0 },
1644 {116, 116,
"P -4 c 2" , 0,
"",
"P -4 -2c" , 0 },
1645 {117, 117,
"P -4 b 2" , 0,
"",
"P -4 -2ab" , 0 },
1646 {118, 118,
"P -4 n 2" , 0,
"",
"P -4 -2n" , 0 },
1647 {119, 119,
"I -4 m 2" , 0,
"",
"I -4 -2" , 0 },
1648 {120, 120,
"I -4 c 2" , 0,
"",
"I -4 -2c" , 0 },
1649 {121, 121,
"I -4 2 m" , 0,
"",
"I -4 2" , 0 },
1650 {122, 122,
"I -4 2 d" , 0,
"",
"I -4 2bw" , 0 },
1651 {123, 123,
"P 4/m m m" , 0,
"",
"-P 4 2" , 0 },
1652 {124, 124,
"P 4/m c c" , 0,
"",
"-P 4 2c" , 0 },
1653 {125, 125,
"P 4/n b m" ,
'1',
"",
"P 4 2 -1ab" , 21},
1654 {125, 0,
"P 4/n b m" ,
'2',
"",
"-P 4a 2b" , 0 },
1655 {126, 126,
"P 4/n n c" ,
'1',
"",
"P 4 2 -1n" , 20},
1656 {126, 0,
"P 4/n n c" ,
'2',
"",
"-P 4a 2bc" , 0 },
1657 {127, 127,
"P 4/m b m" , 0,
"",
"-P 4 2ab" , 0 },
1658 {128, 128,
"P 4/m n c" , 0,
"",
"-P 4 2n" , 0 },
1659 {129, 129,
"P 4/n m m" ,
'1',
"",
"P 4ab 2ab -1ab", 29},
1660 {129, 0,
"P 4/n m m" ,
'2',
"",
"-P 4a 2a" , 0 },
1661 {130, 130,
"P 4/n c c" ,
'1',
"",
"P 4ab 2n -1ab" , 29},
1662 {130, 0,
"P 4/n c c" ,
'2',
"",
"-P 4a 2ac" , 0 },
1663 {131, 131,
"P 42/m m c", 0,
"",
"-P 4c 2" , 0 },
1664 {132, 132,
"P 42/m c m", 0,
"",
"-P 4c 2c" , 0 },
1665 {133, 133,
"P 42/n b c",
'1',
"",
"P 4n 2c -1n" , 32},
1666 {133, 0,
"P 42/n b c",
'2',
"",
"-P 4ac 2b" , 0 },
1667 {134, 134,
"P 42/n n m",
'1',
"",
"P 4n 2 -1n" , 33},
1668 {134, 0,
"P 42/n n m",
'2',
"",
"-P 4ac 2bc" , 0 },
1669 {135, 135,
"P 42/m b c", 0,
"",
"-P 4c 2ab" , 0 },
1670 {136, 136,
"P 42/m n m", 0,
"",
"-P 4n 2n" , 0 },
1671 {137, 137,
"P 42/n m c",
'1',
"",
"P 4n 2n -1n" , 32},
1672 {137, 0,
"P 42/n m c",
'2',
"",
"-P 4ac 2a" , 0 },
1673 {138, 138,
"P 42/n c m",
'1',
"",
"P 4n 2ab -1n" , 33},
1674 {138, 0,
"P 42/n c m",
'2',
"",
"-P 4ac 2ac" , 0 },
1675 {139, 139,
"I 4/m m m" , 0,
"",
"-I 4 2" , 0 },
1676 {140, 140,
"I 4/m c m" , 0,
"",
"-I 4 2c" , 0 },
1677 {141, 141,
"I 41/a m d",
'1',
"",
"I 4bw 2bw -1bw", 34},
1678 {141, 0,
"I 41/a m d",
'2',
"",
"-I 4bd 2" , 0 },
1679 {142, 142,
"I 41/a c d",
'1',
"",
"I 4bw 2aw -1bw", 35},
1680 {142, 0,
"I 41/a c d",
'2',
"",
"-I 4bd 2c" , 0 },
1681 {143, 143,
"P 3" , 0,
"",
"P 3" , 0 },
1682 {144, 144,
"P 31" , 0,
"",
"P 31" , 0 },
1683 {145, 145,
"P 32" , 0,
"",
"P 32" , 0 },
1684 {146, 146,
"R 3" ,
'H',
"",
"R 3" , 0 },
1685 {146, 1146,
"R 3" ,
'R',
"",
"P 3*" , 36},
1686 {147, 147,
"P -3" , 0,
"",
"-P 3" , 0 },
1687 {148, 148,
"R -3" ,
'H',
"",
"-R 3" , 0 },
1688 {148, 1148,
"R -3" ,
'R',
"",
"-P 3*" , 36},
1689 {149, 149,
"P 3 1 2" , 0,
"",
"P 3 2" , 0 },
1690 {150, 150,
"P 3 2 1" , 0,
"",
"P 3 2\"" , 0 },
1691 {151, 151,
"P 31 1 2" , 0,
"",
"P 31 2 (0 0 4)", 0 },
1692 {152, 152,
"P 31 2 1" , 0,
"",
"P 31 2\"" , 0 },
1693 {153, 153,
"P 32 1 2" , 0,
"",
"P 32 2 (0 0 2)", 0 },
1694 {154, 154,
"P 32 2 1" , 0,
"",
"P 32 2\"" , 0 },
1695 {155, 155,
"R 3 2" ,
'H',
"",
"R 3 2\"" , 0 },
1696 {155, 1155,
"R 3 2" ,
'R',
"",
"P 3* 2" , 36},
1697 {156, 156,
"P 3 m 1" , 0,
"",
"P 3 -2\"" , 0 },
1698 {157, 157,
"P 3 1 m" , 0,
"",
"P 3 -2" , 0 },
1699 {158, 158,
"P 3 c 1" , 0,
"",
"P 3 -2\"c" , 0 },
1700 {159, 159,
"P 3 1 c" , 0,
"",
"P 3 -2c" , 0 },
1701 {160, 160,
"R 3 m" ,
'H',
"",
"R 3 -2\"" , 0 },
1702 {160, 1160,
"R 3 m" ,
'R',
"",
"P 3* -2" , 36},
1703 {161, 161,
"R 3 c" ,
'H',
"",
"R 3 -2\"c" , 0 },
1704 {161, 1161,
"R 3 c" ,
'R',
"",
"P 3* -2n" , 36},
1705 {162, 162,
"P -3 1 m" , 0,
"",
"-P 3 2" , 0 },
1706 {163, 163,
"P -3 1 c" , 0,
"",
"-P 3 2c" , 0 },
1707 {164, 164,
"P -3 m 1" , 0,
"",
"-P 3 2\"" , 0 },
1708 {165, 165,
"P -3 c 1" , 0,
"",
"-P 3 2\"c" , 0 },
1709 {166, 166,
"R -3 m" ,
'H',
"",
"-R 3 2\"" , 0 },
1710 {166, 1166,
"R -3 m" ,
'R',
"",
"-P 3* 2" , 36},
1711 {167, 167,
"R -3 c" ,
'H',
"",
"-R 3 2\"c" , 0 },
1712 {167, 1167,
"R -3 c" ,
'R',
"",
"-P 3* 2n" , 36},
1713 {168, 168,
"P 6" , 0,
"",
"P 6" , 0 },
1714 {169, 169,
"P 61" , 0,
"",
"P 61" , 0 },
1715 {170, 170,
"P 65" , 0,
"",
"P 65" , 0 },
1716 {171, 171,
"P 62" , 0,
"",
"P 62" , 0 },
1717 {172, 172,
"P 64" , 0,
"",
"P 64" , 0 },
1718 {173, 173,
"P 63" , 0,
"",
"P 6c" , 0 },
1719 {174, 174,
"P -6" , 0,
"",
"P -6" , 0 },
1720 {175, 175,
"P 6/m" , 0,
"",
"-P 6" , 0 },
1721 {176, 176,
"P 63/m" , 0,
"",
"-P 6c" , 0 },
1722 {177, 177,
"P 6 2 2" , 0,
"",
"P 6 2" , 0 },
1723 {178, 178,
"P 61 2 2" , 0,
"",
"P 61 2 (0 0 5)", 0 },
1724 {179, 179,
"P 65 2 2" , 0,
"",
"P 65 2 (0 0 1)", 0 },
1725 {180, 180,
"P 62 2 2" , 0,
"",
"P 62 2 (0 0 4)", 0 },
1726 {181, 181,
"P 64 2 2" , 0,
"",
"P 64 2 (0 0 2)", 0 },
1727 {182, 182,
"P 63 2 2" , 0,
"",
"P 6c 2c" , 0 },
1728 {183, 183,
"P 6 m m" , 0,
"",
"P 6 -2" , 0 },
1729 {184, 184,
"P 6 c c" , 0,
"",
"P 6 -2c" , 0 },
1730 {185, 185,
"P 63 c m" , 0,
"",
"P 6c -2" , 0 },
1731 {186, 186,
"P 63 m c" , 0,
"",
"P 6c -2c" , 0 },
1732 {187, 187,
"P -6 m 2" , 0,
"",
"P -6 2" , 0 },
1733 {188, 188,
"P -6 c 2" , 0,
"",
"P -6c 2" , 0 },
1734 {189, 189,
"P -6 2 m" , 0,
"",
"P -6 -2" , 0 },
1735 {190, 190,
"P -6 2 c" , 0,
"",
"P -6c -2c" , 0 },
1736 {191, 191,
"P 6/m m m" , 0,
"",
"-P 6 2" , 0 },
1737 {192, 192,
"P 6/m c c" , 0,
"",
"-P 6 2c" , 0 },
1738 {193, 193,
"P 63/m c m", 0,
"",
"-P 6c 2" , 0 },
1739 {194, 194,
"P 63/m m c", 0,
"",
"-P 6c 2c" , 0 },
1740 {195, 195,
"P 2 3" , 0,
"",
"P 2 2 3" , 0 },
1741 {196, 196,
"F 2 3" , 0,
"",
"F 2 2 3" , 0 },
1742 {197, 197,
"I 2 3" , 0,
"",
"I 2 2 3" , 0 },
1743 {198, 198,
"P 21 3" , 0,
"",
"P 2ac 2ab 3" , 0 },
1744 {199, 199,
"I 21 3" , 0,
"",
"I 2b 2c 3" , 0 },
1745 {200, 200,
"P m -3" , 0,
"",
"-P 2 2 3" , 0 },
1746 {201, 201,
"P n -3" ,
'1',
"",
"P 2 2 3 -1n" , 20},
1747 {201, 0,
"P n -3" ,
'2',
"",
"-P 2ab 2bc 3" , 0 },
1748 {202, 202,
"F m -3" , 0,
"",
"-F 2 2 3" , 0 },
1749 {203, 203,
"F d -3" ,
'1',
"",
"F 2 2 3 -1d" , 27},
1750 {203, 0,
"F d -3" ,
'2',
"",
"-F 2uv 2vw 3" , 0 },
1751 {204, 204,
"I m -3" , 0,
"",
"-I 2 2 3" , 0 },
1752 {205, 205,
"P a -3" , 0,
"",
"-P 2ac 2ab 3" , 0 },
1753 {206, 206,
"I a -3" , 0,
"",
"-I 2b 2c 3" , 0 },
1754 {207, 207,
"P 4 3 2" , 0,
"",
"P 4 2 3" , 0 },
1755 {208, 208,
"P 42 3 2" , 0,
"",
"P 4n 2 3" , 0 },
1756 {209, 209,
"F 4 3 2" , 0,
"",
"F 4 2 3" , 0 },
1757 {210, 210,
"F 41 3 2" , 0,
"",
"F 4d 2 3" , 0 },
1758 {211, 211,
"I 4 3 2" , 0,
"",
"I 4 2 3" , 0 },
1759 {212, 212,
"P 43 3 2" , 0,
"",
"P 4acd 2ab 3" , 0 },
1760 {213, 213,
"P 41 3 2" , 0,
"",
"P 4bd 2ab 3" , 0 },
1761 {214, 214,
"I 41 3 2" , 0,
"",
"I 4bd 2c 3" , 0 },
1762 {215, 215,
"P -4 3 m" , 0,
"",
"P -4 2 3" , 0 },
1763 {216, 216,
"F -4 3 m" , 0,
"",
"F -4 2 3" , 0 },
1764 {217, 217,
"I -4 3 m" , 0,
"",
"I -4 2 3" , 0 },
1765 {218, 218,
"P -4 3 n" , 0,
"",
"P -4n 2 3" , 0 },
1766 {219, 219,
"F -4 3 c" , 0,
"",
"F -4a 2 3" , 0 },
1767 {220, 220,
"I -4 3 d" , 0,
"",
"I -4bd 2c 3" , 0 },
1768 {221, 221,
"P m -3 m" , 0,
"",
"-P 4 2 3" , 0 },
1769 {222, 222,
"P n -3 n" ,
'1',
"",
"P 4 2 3 -1n" , 20},
1770 {222, 0,
"P n -3 n" ,
'2',
"",
"-P 4a 2bc 3" , 0 },
1771 {223, 223,
"P m -3 n" , 0,
"",
"-P 4n 2 3" , 0 },
1772 {224, 224,
"P n -3 m" ,
'1',
"",
"P 4n 2 3 -1n" , 30},
1773 {224, 0,
"P n -3 m" ,
'2',
"",
"-P 4bc 2bc 3" , 0 },
1774 {225, 225,
"F m -3 m" , 0,
"",
"-F 4 2 3" , 0 },
1775 {226, 226,
"F m -3 c" , 0,
"",
"-F 4a 2 3" , 0 },
1776 {227, 227,
"F d -3 m" ,
'1',
"",
"F 4d 2 3 -1d" , 27},
1777 {227, 0,
"F d -3 m" ,
'2',
"",
"-F 4vw 2vw 3" , 0 },
1778 {228, 228,
"F d -3 c" ,
'1',
"",
"F 4d 2 3 -1ad" , 37},
1779 {228, 0,
"F d -3 c" ,
'2',
"",
"-F 4ud 2vw 3" , 0 },
1780 {229, 229,
"I m -3 m" , 0,
"",
"-I 4 2 3" , 0 },
1781 {230, 230,
"I a -3 d" , 0,
"",
"-I 4bd 2c 3" , 0 },
1783 { 5, 5005,
"I 1 21 1" , 0,
"b4",
"I 2yb" , 38},
1784 { 5, 3005,
"C 1 21 1" , 0,
"b5",
"C 2yb" , 14},
1785 { 18, 1018,
"P 21212(a)", 0,
"",
"P 2ab 2a" , 14},
1786 { 20, 1020,
"C 2 2 21a)", 0,
"",
"C 2ac 2" , 39},
1787 { 21, 1021,
"C 2 2 2a" , 0,
"",
"C 2ab 2b" , 14},
1788 { 22, 1022,
"F 2 2 2a" , 0,
"",
"F 2 2c" , 40},
1789 { 23, 1023,
"I 2 2 2a" , 0,
"",
"I 2ab 2bc" , 33},
1790 { 94, 1094,
"P 42 21 2a", 0,
"",
"P 4bc 2a" , 20},
1791 {197, 1197,
"I 2 3a" , 0,
"",
"I 2ab 2bc 3" , 30},
1798 { 1, 0,
"A 1" , 0,
"",
"A 1" , 41},
1799 { 1, 0,
"B 1" , 0,
"",
"B 1" , 42},
1800 { 1, 0,
"C 1" , 0,
"",
"C 1" , 43},
1801 { 1, 0,
"F 1" , 0,
"",
"F 1" , 44},
1802 { 1, 0,
"I 1" , 0,
"",
"I 1" , 45},
1803 { 2, 0,
"A -1" , 0,
"",
"-A 1" , 41},
1804 { 2, 0,
"B -1" , 0,
"",
"-B 1" , 42},
1805 { 2, 0,
"C -1" , 0,
"",
"-C 1" , 43},
1806 { 2, 0,
"F -1" , 0,
"",
"-F 1" , 44},
1807 { 2, 0,
"I -1" , 0,
"",
"-I 1" , 45},
1809 { 3, 0,
"C 1 1 2" , 0,
"c1",
"C 2" , 46},
1810 { 4, 0,
"C 1 1 21" , 0,
"c1",
"C 2c" , 46},
1811 { 12, 0,
"F 1 2/m 1" , 0,
"b4",
"-F 2y" , 47},
1813 { 64, 0,
"A b a m" , 0,
"",
"-A 2 2ab" , 3 },
1815 { 89, 0,
"C 4 2 2" , 0,
"",
"C 4 2" , 48},
1816 { 90, 0,
"C 4 2 21" , 0,
"",
"C 4a 2" , 48},
1817 { 97, 0,
"F 4 2 2" , 0,
"",
"F 4 2" , 48},
1818 {115, 0,
"C -4 2 m" , 0,
"",
"C -4 2" , 48},
1819 {117, 0,
"C -4 2 b" , 0,
"",
"C -4 2ya" , 48},
1820 {139, 0,
"F 4/m m m" , 0,
"",
"-F 4 2" , 48},
1823template<
class Dummy>
1824const SpaceGroupAltName Tables_<Dummy>::alt_names[28] = {
1828 {
"A e m 2", 0, 190},
1829 {
"B m e 2", 0, 191},
1830 {
"B 2 e m", 0, 192},
1831 {
"C 2 m e", 0, 193},
1832 {
"C m 2 e", 0, 194},
1833 {
"A e 2 m", 0, 195},
1834 {
"A e a 2", 0, 202},
1835 {
"B b e 2", 0, 203},
1836 {
"B 2 e b", 0, 204},
1837 {
"C 2 c e", 0, 205},
1838 {
"C c 2 e", 0, 206},
1839 {
"A e 2 a", 0, 207},
1840 {
"C m c e", 0, 303},
1841 {
"C c m e", 0, 304},
1842 {
"A e m a", 0, 305},
1843 {
"A e a m", 0, 306},
1844 {
"B b e m", 0, 307},
1845 {
"B m e b", 0, 308},
1846 {
"C m m e", 0, 315},
1847 {
"A e m m", 0, 317},
1848 {
"B m e m", 0, 319},
1849 {
"C c c e",
'1', 321},
1850 {
"C c c e",
'2', 322},
1851 {
"A e a a",
'1', 325},
1852 {
"A e a a",
'2', 326},
1853 {
"B b e b",
'1', 329},
1854 {
"B b e b",
'2', 330},
1856 {
"P 21 21 2a", 0, 532},
1861template<
class Dummy>
1862const unsigned char Tables_<Dummy>::ccp4_hkl_asu[230] = {
1863 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1864 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1865 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
1866 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
1867 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
1868 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 7, 6, 7, 6, 7, 7, 7,
1869 6, 7, 6, 7, 7, 6, 6, 7, 7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4,
1870 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9,
1871 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
1880 return &spacegroup_tables::main[0];
1882 if (
sg.ccp4 == ccp4)
1890 throw std::invalid_argument(
"Invalid space-group number: "
1891 + std::to_string(ccp4));
1897 if (
sg.number == number &&
sg.is_reference_setting())
1899 throw std::invalid_argument(
"Invalid space-group number: "
1900 + std::to_string(number));
1906 double alpha=0.,
double gamma=0.)
noexcept {
1907 const char*
p = impl::skip_blank(name.c_str());
1908 if (*
p >=
'0' && *
p <=
'9') {
1910 long n = std::strtol(
p, &
endptr, 10);
1913 char first = *
p & ~0x20;
1918 p = impl::skip_blank(
p+1);
1919 size_t start =
p - name.c_str();
1921 for (
size_t i = start;
i < name.size(); ++
i) {
1922 if (name[
i] >=
'A' && name[
i] <=
'Z')
1924 else if (name[
i] ==
':')
1925 while (++
i < name.size())
1926 if (name[
i] >=
'a' && name[
i] <=
'z')
1931 p = name.c_str() + start;
1934 if (
sg.hm[0] == first) {
1935 if (
sg.hm[2] == *
p) {
1936 const char* a = impl::skip_blank(
p + 1);
1937 const char* b = impl::skip_blank(
sg.hm + 3);
1938 while (*a == *b && *b !=
'\0') {
1939 a = impl::skip_blank(a+1);
1940 b = impl::skip_blank(b+1);
1943 (*a ==
'\0' || (*a ==
':' && *impl::skip_blank(a+1) ==
sg.ext))) {
1952 if (*a ==
'\0' &&
sg.ext ==
'H' && gamma < 1.125 * alpha)
1956 }
else if (
sg.hm[2] ==
'1' &&
sg.hm[3] ==
' ') {
1959 const char* b =
sg.hm + 4;
1960 if (*b !=
'1' || (first ==
'B' && *++b ==
' ' && *++b !=
'1')) {
1961 char end = (b ==
sg.hm + 4 ?
' ' :
'\0');
1962 const char* a = impl::skip_blank(
p);
1963 while (*a == *b && *b != end) {
1967 if (*impl::skip_blank(a) ==
'\0' && *b == end)
1973 if (
sg.hm[0] == first &&
sg.hm[2] == *
p) {
1974 const char* a = impl::skip_blank(
p + 1);
1975 const char* b = impl::skip_blank(
sg.hm + 3);
1976 while (*a == *b && *b !=
'\0') {
1977 a = impl::skip_blank(a+1);
1978 b = impl::skip_blank(b+1);
1981 (*a ==
'\0' || (*a ==
':' && *impl::skip_blank(a+1) ==
sg.ext)))
1982 return &spacegroup_tables::main[
sg.pos];
1990 throw std::invalid_argument(
"Unknown space-group name: " + name);
1995 return spacegroup_tables::main[0];
2001 if ((c ==
sg.hall[0] || c ==
sg.hall[1]) &&
2016 fail(
"Missing space group");
2017 idx = spacegroup_tables::ccp4_hkl_asu[
sg->number - 1];
2020 is_ref =
sg->is_reference_setting();
2022 rot =
sg->basisop().rot;
2027 return is_in_reference_setting(hkl[0], hkl[1], hkl[2]);
2029 for (
int i = 0;
i != 3; ++
i)
2030 r[
i] = rot[0][
i] * hkl[0] + rot[1][
i] * hkl[1] + rot[2][
i] * hkl[2];
2031 return is_in_reference_setting(
r[0],
r[1],
r[2]);
2037 case 0:
return l>0 || (
l==0 && (
h>0 || (
h==0 &&
k>=0)));
2038 case 1:
return k>=0 && (
l>0 || (
l==0 &&
h>=0));
2040 case 2:
return h>=0 &&
k>=0 &&
l>=0;
2041 case 3:
return l>=0 && ((
h>=0 &&
k>0) || (
h==0 &&
k==0));
2043 case 4:
return h>=
k &&
k>=0 &&
l>=0;
2044 case 5:
return (
h>=0 &&
k>0) || (
h==0 &&
k==0 &&
l>=0);
2046 case 6:
return h>=
k &&
k>=0 && (
k>0 ||
l>=0);
2048 case 7:
return h>=
k &&
k>=0 && (
h>
k ||
l>=0);
2049 case 8:
return h>=0 && ((
l>=
h &&
k>
h) || (
l==
h &&
k==
h));
2050 case 9:
return k>=
l &&
l>=
h &&
h>=0;
2051 case 10:
return k>0 || (
k==0 && (
h>0 || (
h==0 &&
l>=0)));
2052 case 11:
return k>=0 && (
h>0 || (
h==0 &&
l>=0));
2053 case 13:
return l>=0 && ((
k>=0 &&
h>0) || (
h==0 &&
k==0));
2054 case 15:
return (
k>=0 &&
h>0) || (
h==0 &&
k==0 &&
l>=0);
2055 case 18:
return k>=0 &&
l>=0 && ((
h>
k &&
h>
l) || (
h==
k &&
h>=
l));
2056 case 19:
return h>=
k &&
k>=
l &&
l>=0;
2063 case 0:
return "l>0 or (l=0 and (h>0 or (h=0 and k>=0)))";
2064 case 1:
return "k>=0 and (l>0 or (l=0 and h>=0))";
2066 case 2:
return "h>=0 and k>=0 and l>=0";
2067 case 3:
return "l>=0 and ((h>=0 and k>0) or (h=0 and k=0))";
2069 case 4:
return "h>=k and k>=0 and l>=0";
2070 case 5:
return "(h>=0 and k>0) or (h=0 and k=0 and l>=0)";
2072 case 6:
return "h>=k and k>=0 and (k>0 or l>=0)";
2074 case 7:
return "h>=k and k>=0 and (h>k or l>=0)";
2075 case 8:
return "h>=0 and ((l>=h and k>h) or (l=h and k=h))";
2076 case 9:
return "k>=l and l>=h and h>=0";
2077 case 10:
return "k>0 or (k==0 and (h>0 or (h=0 and l>=0)))";
2078 case 11:
return "k>=0 and (h>0 or (h=0 and l>=0))";
2079 case 13:
return "l>=0 and ((k>=0 and h>0) or (h=0 and k==0))";
2080 case 15:
return "(k>=0 and h>0) or (h=0 and k==0 and l>=0)";
2081 case 18:
return "k>=0 and l>=0 and ((h>k and h>l) or (h=k and h>=l))";
2082 case 19:
return "h>=k and k>=l and l>=0";
2101 fail(
"Oops, maybe inconsistent GroupOps?");
2105 std::pair<Op::Miller,bool>
neg = {{0,0,0},
true};
2109 return {Op::divide_hkl_by_DEN(
new_hkl),
true};
2116 fail(
"Oops, maybe inconsistent GroupOps?");
2127 for (
int i = 0; i != 3; ++i)
2128 for (
int j = 0; j != 3; ++j)
2129 h = (h << 2) ^ (op.
rot[i][j] + 1);
2130 for (
int i = 0; i != 3; ++i)
2131 h = (h << 5) ^ op.
tran[i];
2138# pragma clang diagnostic pop
Op parse_triplet(const std::string &s)
const char * get_basisop(int basisop_idx)
const SpaceGroup & get_spacegroup_p1()
CrystalSystem crystal_system(Laue laue)
GroupOps generators_from_hall(const char *hall)
const SpaceGroup & get_spacegroup_reference_setting(int number)
const SpaceGroup & get_spacegroup_by_name(const std::string &name)
int interpret_miller_character(char c, const std::string &s)
unsigned char point_group_index_and_category(int space_group_number)
const char * point_group_hm(PointGroup pg)
const SpaceGroup * find_spacegroup_by_name(std::string name, double alpha=0., double gamma=0.) noexcept
Op::Rot centred_to_primitive(char centring_type)
bool operator==(const Op &a, const Op &b)
GroupOps symops_from_hall(const char *hall)
PointGroup point_group(int space_group_number)
const SpaceGroup * find_spacegroup_by_number(int ccp4) noexcept
GroupOps split_centering_vectors(const std::vector< Op > &ops)
Vec3 operator*(double d, const Vec3 &v)
Laue pointgroup_to_laue(PointGroup pg)
Op::Rot hall_rotation_z(int N)
Op & operator*=(Op &a, const Op &b)
const SpaceGroup & get_spacegroup_by_number(int ccp4)
bool is_enantiomorphic(int space_group_number)
Op::Tran nonzero_inversion_center(int space_group_number)
Inversion center of the Euclidean normalizer that is not at the origin of reference settings.
Op seitz_to_op(const std::array< std::array< double, 4 >, 4 > &t)
Op parse_hall_change_of_basis(const char *start, const char *end)
Op hall_matrix_symbol(const char *start, const char *end, int pos, int &prev)
std::string make_triplet_part(const std::array< int, 3 > &xyz, int w, char style='x')
std::vector< Op::Tran > centring_vectors(char centring_type)
const char * laue_class_str(Laue laue)
bool is_sohncke(int space_group_number)
void fail(const std::string &msg)
PointGroup laue_to_pointgroup(Laue laue)
Op::Tran hall_translation_from_symbol(char symbol)
const SpaceGroup * find_spacegroup_by_ops(const GroupOps &gops)
bool is_symmorphic(int space_group_number)
bool operator!=(const Op &a, const Op &b)
std::array< int, 4 > parse_triplet_part(const std::string &s)
impl::Tables_< void > spacegroup_tables
const char * skip_blank(const char *p)
const char * crystal_system_str(CrystalSystem system)
bool operator==(const Iter &other) const
bool operator!=(const Iter &other) const
Op * find_by_rotation(const Op::Rot &r)
const Op * find_by_rotation(const Op::Rot &r) const
bool has_same_centring(const GroupOps &other) const
void change_basis_backward(const Op &inv)
std::vector< Op > sym_ops
bool is_systematically_absent(const Op::Miller &hkl) const
char find_centering() const
void add_missing_elements()
bool is_same_as(const GroupOps &other) const
void change_basis_forward(const Op &cob)
std::array< int, 3 > find_grid_factors() const
std::vector< Op::Tran > cen_ops
int epsilon_factor(const Op::Miller &hkl) const
void change_basis_impl(const Op &cob, const Op &inv)
bool is_centrosymmetric() const
void add_missing_elements_part2(const std::vector< Op > &gen, size_t max_size, bool ignore_bad_gen)
bool are_directions_symmetry_related(int u, int v) const
int epsilon_factor_without_centering(const Op::Miller &hkl) const
std::vector< Op > all_ops_sorted() const
bool has_same_rotations(const GroupOps &other) const
GroupOps derive_symmorphic() const
static bool has_phase_shift(const Op::Tran &c, const Op::Miller &hkl)
bool is_reflection_centric(const Op::Miller &hkl) const
Op & translate(const Tran &a)
std::array< std::array< double, 4 >, 4 > float_seitz() const
Miller apply_to_hkl(const Miller &hkl) const
std::array< std::array< int, 4 >, 4 > int_seitz() const
std::array< std::array< int, 3 >, 3 > Rot
std::string triplet(char style='x') const
static Miller divide_hkl_by_DEN(const Miller &hkl)
std::array< double, 3 > apply_to_xyz(const std::array< double, 3 > &xyz) const
std::array< int, 3 > Miller
std::array< int, 3 > Tran
Miller apply_to_hkl_without_division(const Miller &hkl) const
Rot transposed_rot() const
double phase_shift(const Miller &hkl) const
Op translated(const Tran &a) const
Op combine(const Op &b) const
static constexpr Op::Rot inversion_rot()
static constexpr Op identity()
Op add_centering(const Tran &a) const
bool operator<(const Op &rhs) const
bool is_in_reference_setting(int h, int k, int l) const
std::pair< Op::Miller, bool > to_asu_sign(const Op::Miller &hkl, const GroupOps &gops) const
Similar to to_asu(), but the second returned value is sign: true for + or centric.
bool is_in(const Op::Miller &hkl) const
std::pair< Op::Miller, int > to_asu(const Op::Miller &hkl, const GroupOps &gops) const
Returns hkl in asu and MTZ ISYM - 2*n-1 for reflections in the positive asu (I+ of a Friedel pair),...
const char * condition_str() const
ReciprocalAsu(const SpaceGroup *sg, bool tnt=false)
const char * laue_str() const
const char * basisop_str() const
bool is_symmorphic() const
GroupOps operations() const
char monoclinic_unique_axis() const
returns 'a', 'b' or 'c' for monoclinic SG, '\0' otherwise
char ccp4_lattice_type() const
std::string short_name() const
const char * point_group_hm() const
Op change_of_hand_op() const
Returns change-of-hand operator. Compatible with similar sgtbx function.
const char * crystal_system_str() const
char centring_type() const
std::string pdb_name() const
bool is_centrosymmetric() const
Op centred_to_primitive() const
bool is_enantiomorphic() const
bool is_reference_setting() const
CrystalSystem crystal_system() const
PointGroup point_group() const
size_t operator()(const gemmi::Op &op) const