Mantid
Loading...
Searching...
No Matches
SpaceGroupFactory.cpp
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
4// NScD Oak Ridge National Laboratory, European Spallation Source,
5// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
6// SPDX - License - Identifier: GPL - 3.0 +
14
15#include <algorithm>
16#include <boost/algorithm/string.hpp>
17#include <locale>
18#include <memory>
19#include <utility>
20
21namespace Mantid::Geometry {
22
25bool isValidGeneratorString(const std::string &generatorString) {
26 std::vector<std::string> generatorStrings;
27 boost::split(generatorStrings, generatorString, boost::is_any_of(";"));
28
29 return std::all_of(generatorStrings.cbegin(), generatorStrings.cend(), [&](const auto &identifier) {
30 try {
31 SymmetryOperationSymbolParser::parseIdentifier(identifier);
32 } catch (const Kernel::Exception::ParseError &) {
33 return false;
34 }
35 return true;
36 });
37}
38
56std::vector<std::string> operator*(const SymmetryOperation &symOp, const std::vector<std::string> &strings) {
57 if (strings.size() < 3) {
58 throw std::invalid_argument("There must be at least three strings in the "
59 "vector for SymmetryOperation * "
60 "std::vector<std::string>.");
61 }
62
63 std::vector<int> transformedIndices = symOp.matrix() * std::vector<int>{0, 1, 2};
64
65 std::vector<std::string> transformedStrings;
66 std::transform(transformedIndices.cbegin(), transformedIndices.cend(), std::back_inserter(transformedStrings),
67 [=](int index) { return strings[abs(index)]; });
68
69 if (transformedStrings.size() < strings.size()) {
70 transformedStrings.insert(transformedStrings.end(), strings.cbegin() + transformedStrings.size(), strings.cend());
71 }
72
73 return transformedStrings;
74}
75
77AbstractSpaceGroupGenerator::AbstractSpaceGroupGenerator(size_t number, std::string hmSymbol,
78 std::string generatorInformation)
79 : m_number(number), m_hmSymbol(std::move(hmSymbol)), m_generatorString(std::move(generatorInformation)),
80 m_prototype() {}
81
90
104 Group_const_sptr generatingGroup = generateGroup();
105
106 if (!generatingGroup) {
107 throw std::runtime_error("Could not create group from supplied symmetry operations.");
108 }
109
110 return std::make_shared<const SpaceGroup>(m_number, m_hmSymbol, *generatingGroup);
111}
112
116AlgorithmicSpaceGroupGenerator::AlgorithmicSpaceGroupGenerator(size_t number, const std::string &hmSymbol,
117 const std::string &generatorInformation)
118 : AbstractSpaceGroupGenerator(number, hmSymbol, generatorInformation) {
119 if (!isValidGeneratorString(generatorInformation)) {
120 throw std::runtime_error("Generator string could not be parsed: " + generatorInformation);
121 }
122}
123
127 Group_const_sptr baseGroup = GroupFactory::create<ProductOfCyclicGroups>(getGeneratorString());
128 Group_const_sptr centeringGroup = GroupFactory::create<CenteringGroup>(getCenteringSymbol());
129
130 return baseGroup * centeringGroup;
131}
132
135std::string AlgorithmicSpaceGroupGenerator::getCenteringSymbol() const { return getHMSymbol().substr(0, 1); }
136
141 const std::string &generatorInformation)
142 : AbstractSpaceGroupGenerator(number, hmSymbol, generatorInformation) {
143 setBaseAndTransformation(generatorInformation);
144}
145
150
152
153 return std::make_shared<Group>(transformation(*baseGroup));
154}
155
159 return SpaceGroupFactory::Instance().createSpaceGroup(m_baseGroupHMSymbol);
160}
161
180void TransformationSpaceGroupGenerator::setBaseAndTransformation(const std::string &generatorInformation) {
181 std::vector<std::string> parts;
182 boost::split(parts, generatorInformation, boost::is_any_of("|"));
183
184 if (parts.size() != 2) {
185 throw std::invalid_argument("Not a valid string for generation of "
186 "transformed space groups. Correct format is "
187 "'HM symbol | transformation'.");
188 }
189
190 m_baseGroupHMSymbol = boost::trim_copy(parts.front());
191 m_transformation = parts.back();
192}
193
197TabulatedSpaceGroupGenerator::TabulatedSpaceGroupGenerator(size_t number, const std::string &hmSymbol,
198 const std::string &generatorInformation)
199 : AbstractSpaceGroupGenerator(number, hmSymbol, generatorInformation) {
200 if (!isValidGeneratorString(generatorInformation)) {
201 throw std::runtime_error("Generator string could not be parsed: " + generatorInformation);
202 }
203}
204
207 return GroupFactory::create<Group>(getGeneratorString());
208}
209
213 if (!isSubscribed(hmSymbol)) {
214 throw std::invalid_argument("Space group with symbol '" + hmSymbol + "' is not registered.");
215 }
216
217 return constructFromPrototype(getPrototype(hmSymbol));
218}
219
221bool SpaceGroupFactoryImpl::isSubscribed(const std::string &hmSymbol) const {
222 return m_generatorMap.find(hmSymbol) != m_generatorMap.end();
223}
224
226bool SpaceGroupFactoryImpl::isSubscribed(size_t number) const { return m_numberMap.find(number) != m_numberMap.end(); }
227
230 std::vector<std::string> symbols;
231 symbols.reserve(m_generatorMap.size());
232 std::transform(m_generatorMap.cbegin(), m_generatorMap.cend(), std::back_inserter(symbols),
233 [](const auto &generator) { return generator.first; });
234 return symbols;
235}
236
238std::vector<std::string> SpaceGroupFactoryImpl::subscribedSpaceGroupSymbols(size_t number) const {
239 std::vector<std::string> symbols;
240
241 auto keyPair = m_numberMap.equal_range(number);
242
243 for (auto it = keyPair.first; it != keyPair.second; ++it) {
244 symbols.emplace_back(it->second);
245 }
246
247 return symbols;
248}
249
252 std::vector<size_t> numbers;
253 numbers.reserve(m_numberMap.size());
254
255 for (auto it = m_numberMap.begin(); it != m_numberMap.end(); it = m_numberMap.upper_bound(it->first)) {
256 numbers.emplace_back(it->first);
257 }
258
259 return numbers;
260}
261
262std::vector<std::string> SpaceGroupFactoryImpl::subscribedSpaceGroupSymbols(const PointGroup_sptr &pointGroup) {
263 if (m_pointGroupMap.empty()) {
265 }
266
267 std::string pointGroupSymbol = pointGroup->getSymbol();
268
269 std::vector<std::string> symbols;
270 auto keyPair = m_pointGroupMap.equal_range(pointGroupSymbol);
271
272 for (auto it = keyPair.first; it != keyPair.second; ++it) {
273 symbols.emplace_back(it->second);
274 }
275
276 return symbols;
277}
278
281void SpaceGroupFactoryImpl::unsubscribeSpaceGroup(const std::string &hmSymbol) {
282 if (!isSubscribed(hmSymbol)) {
283 throw std::invalid_argument("Cannot unsubscribe space group that is not registered.");
284 }
285
286 auto eraseGenerator = m_generatorMap.find(hmSymbol);
287 AbstractSpaceGroupGenerator_sptr generator = eraseGenerator->second;
288
289 auto eraseNumber = m_numberMap.find(generator->getNumber());
290
291 m_numberMap.erase(eraseNumber);
292 m_generatorMap.erase(eraseGenerator);
293}
294
313void SpaceGroupFactoryImpl::subscribeGeneratedSpaceGroup(size_t number, const std::string &hmSymbol,
314 const std::string &generators) {
315 subscribeUsingGenerator<AlgorithmicSpaceGroupGenerator>(number, hmSymbol, generators);
316}
317
320void SpaceGroupFactoryImpl::subscribeTabulatedSpaceGroup(size_t number, const std::string &hmSymbol,
321 const std::string &symmetryOperations) {
322 subscribeUsingGenerator<TabulatedSpaceGroupGenerator>(number, hmSymbol, symmetryOperations);
323}
324
327std::string SpaceGroupFactoryImpl::getTransformedSymbolOrthorhombic(const std::string &hmSymbol,
328 const std::string &transformation) const {
329 // Split the symbol up in its components
330 std::vector<std::string> symbolComponents;
331 boost::split(symbolComponents, hmSymbol, boost::is_any_of(" "));
332
333 // Get the centering, that needs to be transformed as well.
334 std::string centeringLowerCase = boost::to_lower_copy(symbolComponents.front());
335
336 // Remove the centering, use only the a, b, c-part of the symbol
337 symbolComponents.erase(symbolComponents.begin());
338
339 // Use inverse symmetry operation to permute symbol
340 SymmetryOperation op = SymmetryOperation(transformation).inverse();
341
342 // Symbols that need to be replaced in the permutations
343 std::vector<std::string> axes{"a", "b", "c"};
344 std::vector<std::string> permutedAxes = op * axes;
345
346 // Permutation of the symbol, re-append centering symbol, lower case.
347 std::vector<std::string> permuted = op * symbolComponents;
348 permuted.insert(permuted.begin(), centeringLowerCase);
349
350 // Transform those components for which it is necessary (a, b, c)
351 std::transform(permuted.begin(), permuted.end(), permuted.begin(), [&](const std::string &symbol) {
352 auto needsTransformation = std::find(permutedAxes.cbegin(), permutedAxes.cend(), symbol);
353
354 if (needsTransformation == permutedAxes.cend()) {
355 return symbol;
356 }
357
358 return axes[std::distance(permutedAxes.cbegin(), needsTransformation)];
359 });
360
361 // Transform centering string back to upper case.
362 boost::to_upper(*permuted.begin());
363
364 return boost::join(permuted, " ");
365}
366
370 return std::make_shared<const SpaceGroup>(*prototype);
371}
372
376 m_pointGroupMap.clear();
377
378 for (auto &generator : m_generatorMap) {
379 SpaceGroup_const_sptr spaceGroup = getPrototype(generator.first);
380
381 m_pointGroupMap.emplace(spaceGroup->getPointGroup()->getSymbol(), generator.first);
382 }
383}
384
387 AbstractSpaceGroupGenerator_sptr generator = m_generatorMap.find(hmSymbol)->second;
388
389 if (!generator) {
390 throw std::runtime_error("No generator for symbol '" + hmSymbol + "'");
391 }
392
393 return generator->getPrototype();
394}
395
398 if (!generator) {
399 throw std::runtime_error("Cannot register null-generator.");
400 }
401
402 m_numberMap.emplace(generator->getNumber(), generator->getHMSymbol());
403 m_generatorMap.emplace(generator->getHMSymbol(), generator);
404
405 // Clear the point group map
406 m_pointGroupMap.clear();
407}
408
410SpaceGroupFactoryImpl::SpaceGroupFactoryImpl() : m_numberMap(), m_generatorMap(), m_pointGroupMap() {
411 Kernel::LibraryManager::Instance();
412}
413
414/* Space groups according to International Tables for Crystallography,
415 * using the generators specified there.
416 */
417// Triclinic
418DECLARE_TABULATED_SPACE_GROUP(1, "P 1", "x,y,z")
419DECLARE_GENERATED_SPACE_GROUP(2, "P -1", "-x,-y,-z")
420
421/* Monoclinic space groups.
422 *
423 * Unique axes b and c are given, as well as 3 cell choices where
424 * applicable. Since there are only so few monoclinic space group
425 * types, all the transformations are given explicitly. It would
426 * actually be shorter to provide all group definition explicitly
427 * with their generators, but this way the relationship between
428 * the groups is more pronounced.
429 */
430DECLARE_GENERATED_SPACE_GROUP(3, "P 1 2 1", "-x,y,-z")
431DECLARE_TRANSFORMED_SPACE_GROUP(3, "P 1 1 2", "P 1 2 1 | y,z,x")
432
433DECLARE_GENERATED_SPACE_GROUP(4, "P 1 21 1", "-x,y+1/2,-z")
434DECLARE_TRANSFORMED_SPACE_GROUP(4, "P 1 1 21", "P 1 21 1 | y,z,x")
435
436DECLARE_GENERATED_SPACE_GROUP(5, "C 1 2 1", "-x,y,-z")
437DECLARE_TRANSFORMED_SPACE_GROUP(5, "A 1 2 1", "C 1 2 1 | -x+z,y,-x")
438DECLARE_TRANSFORMED_SPACE_GROUP(5, "I 1 2 1", "C 1 2 1 | -z,y,x-z")
439DECLARE_TRANSFORMED_SPACE_GROUP(5, "A 1 1 2", "C 1 2 1 | y,z,x")
440DECLARE_TRANSFORMED_SPACE_GROUP(5, "B 1 1 2", "A 1 1 2 | -y,x-y,z")
441DECLARE_TRANSFORMED_SPACE_GROUP(5, "I 1 1 2", "A 1 1 2 | -x+y,-x,z")
442
443DECLARE_GENERATED_SPACE_GROUP(6, "P 1 m 1", "x,-y,z")
444DECLARE_TRANSFORMED_SPACE_GROUP(6, "P 1 1 m", "P 1 m 1 | y,z,x")
445
446DECLARE_GENERATED_SPACE_GROUP(7, "P 1 c 1", "x,-y,z+1/2")
447DECLARE_TRANSFORMED_SPACE_GROUP(7, "P 1 n 1", "P 1 c 1 | -x+z,y,-x")
448DECLARE_TRANSFORMED_SPACE_GROUP(7, "P 1 a 1", "P 1 c 1 | -z,y,x-z")
449DECLARE_TRANSFORMED_SPACE_GROUP(7, "P 1 1 a", "P 1 c 1 | y,z,x")
450DECLARE_TRANSFORMED_SPACE_GROUP(7, "P 1 1 n", "P 1 1 a | -y,x-y,z")
451DECLARE_TRANSFORMED_SPACE_GROUP(7, "P 1 1 b", "P 1 1 a | -x+y,-x,z")
452
453DECLARE_GENERATED_SPACE_GROUP(8, "C 1 m 1", "x,-y,z")
454DECLARE_TRANSFORMED_SPACE_GROUP(8, "A 1 m 1", "C 1 m 1 | -x+z,y,-x")
455DECLARE_TRANSFORMED_SPACE_GROUP(8, "I 1 m 1", "C 1 m 1 | -z,y,x-z")
456DECLARE_TRANSFORMED_SPACE_GROUP(8, "A 1 1 m", "C 1 m 1 | y,z,x")
457DECLARE_TRANSFORMED_SPACE_GROUP(8, "B 1 1 m", "A 1 1 m | -y,x-y,z")
458DECLARE_TRANSFORMED_SPACE_GROUP(8, "I 1 1 m", "A 1 1 m | -x+y,-x,z")
459
460DECLARE_GENERATED_SPACE_GROUP(9, "C 1 c 1", "x,-y,z+1/2")
461DECLARE_TRANSFORMED_SPACE_GROUP(9, "A 1 n 1", "C 1 c 1 | -x+z,y,-x")
462DECLARE_TRANSFORMED_SPACE_GROUP(9, "I 1 a 1", "C 1 c 1 | -z,y,x-z")
463DECLARE_TRANSFORMED_SPACE_GROUP(9, "A 1 1 a", "C 1 c 1 | y,z,x")
464DECLARE_TRANSFORMED_SPACE_GROUP(9, "B 1 1 n", "A 1 1 a | -y,x-y,z")
465DECLARE_TRANSFORMED_SPACE_GROUP(9, "I 1 1 b", "A 1 1 a | -x+y,-x,z")
466
467DECLARE_GENERATED_SPACE_GROUP(10, "P 1 2/m 1", "-x,y,-z; -x,-y,-z")
468DECLARE_TRANSFORMED_SPACE_GROUP(10, "P 1 1 2/m", "P 1 2/m 1 | y,z,x")
469
470DECLARE_GENERATED_SPACE_GROUP(11, "P 1 21/m 1", "-x,y+1/2,-z; -x,-y,-z")
471DECLARE_TRANSFORMED_SPACE_GROUP(11, "P 1 1 21/m", "P 1 21/m 1 | y,z,x")
472
473DECLARE_GENERATED_SPACE_GROUP(12, "C 1 2/m 1", "-x,y,-z; -x,-y,-z")
474DECLARE_TRANSFORMED_SPACE_GROUP(12, "A 1 2/m 1", "C 1 2/m 1 | -x+z,y,-x")
475DECLARE_TRANSFORMED_SPACE_GROUP(12, "I 1 2/m 1", "C 1 2/m 1 | -z,y,x-z")
476DECLARE_TRANSFORMED_SPACE_GROUP(12, "A 1 1 2/m", "C 1 2/m 1 | y,z,x")
477DECLARE_TRANSFORMED_SPACE_GROUP(12, "B 1 1 2/m", "A 1 1 2/m | -y,x-y,z")
478DECLARE_TRANSFORMED_SPACE_GROUP(12, "I 1 1 2/m", "A 1 1 2/m | -x+y,-x,z")
479
480DECLARE_GENERATED_SPACE_GROUP(13, "P 1 2/c 1", "-x,y,-z+1/2; -x,-y,-z")
481DECLARE_TRANSFORMED_SPACE_GROUP(13, "P 1 2/n 1", "P 1 2/c 1 | -x+z,y,-x")
482DECLARE_TRANSFORMED_SPACE_GROUP(13, "P 1 2/a 1", "P 1 2/c 1 | -z,y,x-z")
483DECLARE_TRANSFORMED_SPACE_GROUP(13, "P 1 1 2/a", "P 1 2/c 1 | y,z,x")
484DECLARE_TRANSFORMED_SPACE_GROUP(13, "P 1 1 2/n", "P 1 1 2/a | -y,x-y,z")
485DECLARE_TRANSFORMED_SPACE_GROUP(13, "P 1 1 2/b", "P 1 1 2/a | -x+y,-x,z")
486
487DECLARE_GENERATED_SPACE_GROUP(14, "P 1 21/c 1", "-x,y+1/2,-z+1/2; -x,-y,-z")
488DECLARE_TRANSFORMED_SPACE_GROUP(14, "P 1 21/n 1", "P 1 21/c 1 | -x+z,y,-x")
489DECLARE_TRANSFORMED_SPACE_GROUP(14, "P 1 21/a 1", "P 1 21/c 1 | -z,y,x-z")
490DECLARE_TRANSFORMED_SPACE_GROUP(14, "P 1 1 21/a", "P 1 21/c 1 | y,z,x")
491DECLARE_TRANSFORMED_SPACE_GROUP(14, "P 1 1 21/n", "P 1 1 21/a | -y,x-y,z")
492DECLARE_TRANSFORMED_SPACE_GROUP(14, "P 1 1 21/b", "P 1 1 21/a | -x+y,-x,z")
493
494DECLARE_GENERATED_SPACE_GROUP(15, "C 1 2/c 1", "-x,y,-z+1/2; -x,-y,-z")
495DECLARE_TRANSFORMED_SPACE_GROUP(15, "A 1 2/n 1", "C 1 2/c 1 | -x+z,y,-x")
496DECLARE_TRANSFORMED_SPACE_GROUP(15, "I 1 2/a 1", "C 1 2/c 1 | -z,y,x-z")
497DECLARE_TRANSFORMED_SPACE_GROUP(15, "A 1 1 2/a", "C 1 2/c 1 | y,z,x")
498DECLARE_TRANSFORMED_SPACE_GROUP(15, "B 1 1 2/n", "A 1 1 2/a | -y,x-y,z")
499DECLARE_TRANSFORMED_SPACE_GROUP(15, "I 1 1 2/b", "A 1 1 2/a | -x+y,-x,z")
500
501/* Orthorhombic space groups have a special subscribe-method in the
502 * factory, because each group has potentially 6 different settings.
503 * In addition some groups have more than one origin choice.
504 */
505DECLARE_ORTHORHOMBIC_SPACE_GROUP(16, "P 2 2 2", "-x,y,-z; x,-y,-z")
506DECLARE_ORTHORHOMBIC_SPACE_GROUP(17, "P 2 2 21", "-x,-y,z+1/2; -x,y,-z+1/2")
507DECLARE_ORTHORHOMBIC_SPACE_GROUP(18, "P 21 21 2", "-x,-y,z; -x+1/2,y+1/2,-z")
508DECLARE_ORTHORHOMBIC_SPACE_GROUP(19, "P 21 21 21", "-x+1/2,-y,z+1/2; -x,y+1/2,-z+1/2")
509DECLARE_ORTHORHOMBIC_SPACE_GROUP(20, "C 2 2 21", "-x,-y,z+1/2; -x,y,-z+1/2")
510DECLARE_ORTHORHOMBIC_SPACE_GROUP(21, "C 2 2 2", "-x,-y,z; -x,y,-z")
511DECLARE_ORTHORHOMBIC_SPACE_GROUP(22, "F 2 2 2", "-x,-y,z; -x,y,-z")
512DECLARE_ORTHORHOMBIC_SPACE_GROUP(23, "I 2 2 2", "-x,-y,z; -x,y,-z")
513DECLARE_ORTHORHOMBIC_SPACE_GROUP(24, "I 21 21 21", "-x+1/2,-y,z+1/2; -x,y+1/2,-z+1/2")
514DECLARE_ORTHORHOMBIC_SPACE_GROUP(25, "P m m 2", "-x,-y,z; x,-y,z")
515DECLARE_ORTHORHOMBIC_SPACE_GROUP(26, "P m c 21", "-x,-y,z+1/2; x,-y,z+1/2")
516DECLARE_ORTHORHOMBIC_SPACE_GROUP(27, "P c c 2", "-x,-y,z; x,-y,z+1/2")
517DECLARE_ORTHORHOMBIC_SPACE_GROUP(28, "P m a 2", "-x,-y,z; x+1/2,-y,z")
518DECLARE_ORTHORHOMBIC_SPACE_GROUP(29, "P c a 21", "-x,-y,z+1/2; x+1/2,-y,z")
519DECLARE_ORTHORHOMBIC_SPACE_GROUP(30, "P n c 2", "-x,-y,z; x,-y+1/2,z+1/2")
520DECLARE_ORTHORHOMBIC_SPACE_GROUP(31, "P m n 21", "-x+1/2,-y,z+1/2; x+1/2,-y,z+1/2")
521DECLARE_ORTHORHOMBIC_SPACE_GROUP(32, "P b a 2", "-x,-y,z; x+1/2,-y+1/2,z")
522DECLARE_ORTHORHOMBIC_SPACE_GROUP(33, "P n a 21", "-x,-y,z+1/2; x+1/2,-y+1/2,z")
523DECLARE_ORTHORHOMBIC_SPACE_GROUP(34, "P n n 2", "-x,-y,z; x+1/2,-y+1/2,z+1/2")
524DECLARE_ORTHORHOMBIC_SPACE_GROUP(35, "C m m 2", "-x,-y,z; x,-y,z")
525DECLARE_ORTHORHOMBIC_SPACE_GROUP(36, "C m c 21", "-x,-y,z+1/2; x,-y,z+1/2")
526DECLARE_ORTHORHOMBIC_SPACE_GROUP(37, "C c c 2", "-x,-y,z; x,-y,z+1/2")
527DECLARE_ORTHORHOMBIC_SPACE_GROUP(38, "A m m 2", "-x,-y,z; x,-y,z")
528DECLARE_ORTHORHOMBIC_SPACE_GROUP(39, "A e m 2", "-x,-y,z; x,-y,z+1/2")
529DECLARE_ORTHORHOMBIC_SPACE_GROUP(40, "A m a 2", "-x,-y,z; x+1/2,-y,z")
530DECLARE_ORTHORHOMBIC_SPACE_GROUP(41, "A e a 2", "-x,-y,z; x+1/2,-y+1/2,z")
531DECLARE_ORTHORHOMBIC_SPACE_GROUP(42, "F m m 2", "-x,-y,z; x,-y,z")
532DECLARE_ORTHORHOMBIC_SPACE_GROUP(43, "F d d 2", "-x,-y,z; x+1/4,-y+1/4,z+1/4")
533DECLARE_ORTHORHOMBIC_SPACE_GROUP(44, "I m m 2", "-x,-y,z; x,-y,z")
534DECLARE_ORTHORHOMBIC_SPACE_GROUP(45, "I b a 2", "-x,-y,z; x+1/2,-y+1/2,z")
535DECLARE_ORTHORHOMBIC_SPACE_GROUP(46, "I m a 2", "-x,-y,z; x+1/2,-y,z")
536DECLARE_ORTHORHOMBIC_SPACE_GROUP(47, "P m m m", "-x,-y,z; -x,y,-z; -x,-y,-z")
537
538DECLARE_ORTHORHOMBIC_SPACE_GROUP(48, "P n n n", "-x,-y,z; -x,y,-z; -x+1/2,-y+1/2,-z+1/2")
539DECLARE_TRANSFORMED_ORTHORHOMBIC_SPACE_GROUP(48, "P n n n :2", "P n n n | x-1/4,y-1/4,z-1/4")
540
541DECLARE_ORTHORHOMBIC_SPACE_GROUP(49, "P c c m", "-x,-y,z; -x,y,-z+1/2; -x,-y,-z")
542
543DECLARE_ORTHORHOMBIC_SPACE_GROUP(50, "P b a n", "-x,-y,z; -x,y,-z; -x+1/2,-y+1/2,-z")
544DECLARE_TRANSFORMED_ORTHORHOMBIC_SPACE_GROUP(50, "P b a n :2", "P b a n | x-1/4,y-1/4,z")
545
546DECLARE_ORTHORHOMBIC_SPACE_GROUP(51, "P m m a", "-x+1/2,-y,z; -x,y,-z; -x,-y,-z")
547DECLARE_ORTHORHOMBIC_SPACE_GROUP(52, "P n n a", "-x+1/2,-y,z; -x+1/2,y+1/2,-z+1/2; -x,-y,-z")
548DECLARE_ORTHORHOMBIC_SPACE_GROUP(53, "P m n a", "-x+1/2,-y,z+1/2; -x+1/2,y,-z+1/2; -x,-y,-z")
549DECLARE_ORTHORHOMBIC_SPACE_GROUP(54, "P c c a", "-x+1/2,-y,z; -x,y,-z+1/2; -x,-y,-z")
550DECLARE_ORTHORHOMBIC_SPACE_GROUP(55, "P b a m", "-x,-y,z; -x+1/2,y+1/2,-z; -x,-y,-z")
551DECLARE_ORTHORHOMBIC_SPACE_GROUP(56, "P c c n", "-x+1/2,-y+1/2,z; -x,y+1/2,-z+1/2; -x,-y,-z")
552DECLARE_ORTHORHOMBIC_SPACE_GROUP(57, "P b c m", "-x,-y,z+1/2; -x,y+1/2,-z+1/2; -x,-y,-z")
553DECLARE_ORTHORHOMBIC_SPACE_GROUP(58, "P n n m", "-x,-y,z; -x+1/2,y+1/2,-z+1/2; -x,-y,-z")
554
555DECLARE_ORTHORHOMBIC_SPACE_GROUP(59, "P m m n", "-x,-y,z; -x+1/2,y+1/2,-z; -x+1/2,-y+1/2,-z")
556DECLARE_TRANSFORMED_ORTHORHOMBIC_SPACE_GROUP(59, "P m m n :2", "P m m n | x-1/4,y-1/4,z")
557
558DECLARE_ORTHORHOMBIC_SPACE_GROUP(60, "P b c n", "-x+1/2,-y+1/2,z+1/2; -x,y,-z+1/2; -x,-y,-z")
559DECLARE_ORTHORHOMBIC_SPACE_GROUP(61, "P b c a", "-x+1/2,-y,z+1/2; -x,y+1/2,-z+1/2; -x,-y,-z")
560DECLARE_ORTHORHOMBIC_SPACE_GROUP(62, "P n m a", "-x+1/2,-y,z+1/2; -x,y+1/2,-z; -x,-y,-z")
561DECLARE_ORTHORHOMBIC_SPACE_GROUP(63, "C m c m", "-x,-y,z+1/2; -x,y,-z+1/2; -x,-y,-z")
562DECLARE_ORTHORHOMBIC_SPACE_GROUP(64, "C m c e", "-x,-y+1/2,z+1/2; -x,y+1/2,-z+1/2; -x,-y,-z")
563DECLARE_ORTHORHOMBIC_SPACE_GROUP(65, "C m m m", "-x,-y,z; -x,y,-z; -x,-y,-z")
564DECLARE_ORTHORHOMBIC_SPACE_GROUP(66, "C c c m", "-x,-y,z; -x,y,-z+1/2; -x,-y,-z")
565DECLARE_ORTHORHOMBIC_SPACE_GROUP(67, "C m m e", "-x,-y+1/2,z; -x,y+1/2,-z; -x,-y,-z")
566DECLARE_ORTHORHOMBIC_SPACE_GROUP(68, "C c c e", "-x+1/2,-y+1/2,z; -x,y,-z; -x,-y+1/2,-z+1/2")
567DECLARE_ORTHORHOMBIC_SPACE_GROUP(69, "F m m m", "-x,-y,z; -x,y,-z; -x,-y,-z")
568
569DECLARE_ORTHORHOMBIC_SPACE_GROUP(70, "F d d d", "-x,-y,z; -x,y,-z; -x+1/4,-y+1/4,-z+1/4")
570DECLARE_TRANSFORMED_ORTHORHOMBIC_SPACE_GROUP(70, "F d d d :2", "F d d d | x+1/8,y+1/8,z+1/8")
571
572DECLARE_ORTHORHOMBIC_SPACE_GROUP(71, "I m m m", "-x,-y,z; -x,y,-z; -x,-y,-z")
573DECLARE_ORTHORHOMBIC_SPACE_GROUP(72, "I b a m", "-x,-y,z; -x+1/2,y+1/2,-z; -x,-y,-z")
574DECLARE_ORTHORHOMBIC_SPACE_GROUP(73, "I b c a", "-x+1/2,-y,z+1/2; -x,y+1/2,-z+1/2; -x,-y,-z")
575DECLARE_ORTHORHOMBIC_SPACE_GROUP(74, "I m m a", "-x,-y+1/2,z; -x,y+1/2,-z; -x,-y,-z")
576
577// Tetragonal
578DECLARE_GENERATED_SPACE_GROUP(75, "P 4", "-x,-y,z; -y,x,z")
579DECLARE_GENERATED_SPACE_GROUP(76, "P 41", "-x,-y,z+1/2; -y,x,z+1/4")
580DECLARE_GENERATED_SPACE_GROUP(77, "P 42", "-x,-y,z; -y,x,z+1/2")
581DECLARE_GENERATED_SPACE_GROUP(78, "P 43", "-x,-y,z+1/2; -y,x,z+3/4")
582DECLARE_GENERATED_SPACE_GROUP(79, "I 4", "-x,-y,z; -y,x,z")
583DECLARE_GENERATED_SPACE_GROUP(80, "I 41", "-x+1/2,-y+1/2,z+1/2; -y,x+1/2,z+1/4")
584DECLARE_GENERATED_SPACE_GROUP(81, "P -4", "-x,-y,z; y,-x,-z")
585DECLARE_GENERATED_SPACE_GROUP(82, "I -4", "-x,-y,z; y,-x,-z")
586DECLARE_GENERATED_SPACE_GROUP(83, "P 4/m", "-x,-y,z; -y,x,z; -x,-y,-z")
587DECLARE_GENERATED_SPACE_GROUP(84, "P 42/m", "-x,-y,z; -y,x,z+1/2; -x,-y,-z")
588
589DECLARE_GENERATED_SPACE_GROUP(85, "P 4/n", "-x,-y,z; -y+1/2,x+1/2,z; -x+1/2,-y+1/2,-z")
590DECLARE_TRANSFORMED_SPACE_GROUP(85, "P 4/n :2", "P 4/n | x+1/4,y-1/4,z")
591
592DECLARE_GENERATED_SPACE_GROUP(86, "P 42/n", "-x,-y,z; -y+1/2,x+1/2,z+1/2; -x+1/2,-y+1/2,-z+1/2")
593DECLARE_TRANSFORMED_SPACE_GROUP(86, "P 42/n :2", "P 42/n | x+1/4,y+1/4,z+1/4")
594
595DECLARE_GENERATED_SPACE_GROUP(87, "I 4/m", "-x,-y,z; -y,x,z; -x,-y,-z")
596
597DECLARE_GENERATED_SPACE_GROUP(88, "I 41/a", "-x+1/2,-y+1/2,z+1/2; -y,x+1/2,z+1/4; -x,-y+1/2,-z+1/4")
598DECLARE_TRANSFORMED_SPACE_GROUP(88, "I 41/a :2", "I 41/a | x,y+1/4,z+1/8")
599
600DECLARE_GENERATED_SPACE_GROUP(89, "P 4 2 2", "-x,-y,z; -y,x,z; -x,y,-z")
601DECLARE_GENERATED_SPACE_GROUP(90, "P 4 21 2", "-x,-y,z; -y+1/2,x+1/2,z; -x+1/2,y+1/2,-z")
602DECLARE_GENERATED_SPACE_GROUP(91, "P 41 2 2", "-x,-y,z+1/2; -y,x,z+1/4; -x,y,-z")
603DECLARE_GENERATED_SPACE_GROUP(92, "P 41 21 2", "-x,-y,z+1/2; -y+1/2,x+1/2,z+1/4; -x+1/2,y+1/2,-z+1/4")
604DECLARE_GENERATED_SPACE_GROUP(93, "P 42 2 2", "-x,-y,z; -y,x,z+1/2; -x,y,-z")
605DECLARE_GENERATED_SPACE_GROUP(94, "P 42 21 2", "-x,-y,z; -y+1/2,x+1/2,z+1/2; -x+1/2,y+1/2,-z+1/2")
606DECLARE_GENERATED_SPACE_GROUP(95, "P 43 2 2", "-x,-y,z+1/2; -y,x,z+3/4; -x,y,-z")
607DECLARE_GENERATED_SPACE_GROUP(96, "P 43 21 2", "-x,-y,z+1/2; -y+1/2,x+1/2,z+3/4; -x+1/2,y+1/2,-z+3/4")
608DECLARE_GENERATED_SPACE_GROUP(97, "I 4 2 2", "-x,-y,z; -y,x,z; -x,y,-z")
609DECLARE_GENERATED_SPACE_GROUP(98, "I 41 2 2", "-x+1/2,-y+1/2,z+1/2; -y,x+1/2,z+1/4; -x+1/2,y,-z+3/4")
610DECLARE_GENERATED_SPACE_GROUP(99, "P 4 m m", "-x,-y,z; -y,x,z; x,-y,z")
611DECLARE_GENERATED_SPACE_GROUP(100, "P 4 b m", "-x,-y,z; -y,x,z; x+1/2,-y+1/2,z")
612DECLARE_GENERATED_SPACE_GROUP(101, "P 42 c m", "-x,-y,z; -y,x,z+1/2; x,-y,z+1/2")
613DECLARE_GENERATED_SPACE_GROUP(102, "P 42 n m", "-x,-y,z; -y+1/2,x+1/2,z+1/2; x+1/2,-y+1/2,z+1/2")
614DECLARE_GENERATED_SPACE_GROUP(103, "P 4 c c", "-x,-y,z; -y,x,z; x,-y,z+1/2")
615DECLARE_GENERATED_SPACE_GROUP(104, "P 4 n c", "-x,-y,z; -y,x,z; x+1/2,-y+1/2,z+1/2")
616DECLARE_GENERATED_SPACE_GROUP(105, "P 42 m c", "-x,-y,z; -y,x,z+1/2; x,-y,z")
617DECLARE_GENERATED_SPACE_GROUP(106, "P 42 b c", "-x,-y,z; -y,x,z+1/2; x+1/2,-y+1/2,z")
618DECLARE_GENERATED_SPACE_GROUP(107, "I 4 m m", "-x,-y,z; -y,x,z; x,-y,z")
619DECLARE_GENERATED_SPACE_GROUP(108, "I 4 c m", "-x,-y,z; -y,x,z; x,-y,z+1/2")
620DECLARE_GENERATED_SPACE_GROUP(109, "I 41 m d", "-x+1/2,-y+1/2,z+1/2; -y,x+1/2,z+1/4; x,-y,z")
621DECLARE_GENERATED_SPACE_GROUP(110, "I 41 c d", "-x+1/2,-y+1/2,z+1/2; -y,x+1/2,z+1/4; x,-y,z+1/2")
622DECLARE_GENERATED_SPACE_GROUP(111, "P -4 2 m", "-x,-y,z; y,-x,-z; -x,y,-z")
623DECLARE_GENERATED_SPACE_GROUP(112, "P -4 2 c", "-x,-y,z; y,-x,-z; -x,y,-z+1/2")
624DECLARE_GENERATED_SPACE_GROUP(113, "P -4 21 m", "-x,-y,z; y,-x,-z; -x+1/2,y+1/2,-z")
625DECLARE_GENERATED_SPACE_GROUP(114, "P -4 21 c", "-x,-y,z; y,-x,-z; -x+1/2,y+1/2,-z+1/2")
626DECLARE_GENERATED_SPACE_GROUP(115, "P -4 m 2", "-x,-y,z; y,-x,-z; x,-y,z")
627DECLARE_GENERATED_SPACE_GROUP(116, "P -4 c 2", "-x,-y,z; y,-x,-z; x,-y,z+1/2")
628DECLARE_GENERATED_SPACE_GROUP(117, "P -4 b 2", "-x,-y,z; y,-x,-z; x+1/2,-y+1/2,z")
629DECLARE_GENERATED_SPACE_GROUP(118, "P -4 n 2", "-x,-y,z; y,-x,-z; x+1/2,-y+1/2,z+1/2")
630DECLARE_GENERATED_SPACE_GROUP(119, "I -4 m 2", "-x,-y,z; y,-x,-z; x,-y,z")
631DECLARE_GENERATED_SPACE_GROUP(120, "I -4 c 2", "-x,-y,z; y,-x,-z; x,-y,z+1/2")
632DECLARE_GENERATED_SPACE_GROUP(121, "I -4 2 m", "-x,-y,z; y,-x,-z; -x,y,-z")
633DECLARE_GENERATED_SPACE_GROUP(122, "I -4 2 d", "-x,-y,z; y,-x,-z; -x+1/2,y,-z+3/4")
634DECLARE_GENERATED_SPACE_GROUP(123, "P 4/m m m", "-x,-y,z; -y,x,z; -x,y,-z; -x,-y,-z")
635DECLARE_GENERATED_SPACE_GROUP(124, "P 4/m c c", "-x,-y,z; -y,x,z; -x,y,-z+1/2; -x,-y,-z")
636
637DECLARE_GENERATED_SPACE_GROUP(125, "P 4/n b m", "-x,-y,z; -y,x,z; -x,y,-z; -x+1/2,-y+1/2,-z")
638DECLARE_TRANSFORMED_SPACE_GROUP(125, "P 4/n b m :2", "P 4/n b m | x+1/4,y+1/4,z")
639
640DECLARE_GENERATED_SPACE_GROUP(126, "P 4/n n c", "-x,-y,z; -y,x,z; -x,y,-z; -x+1/2,-y+1/2,-z+1/2")
641DECLARE_TRANSFORMED_SPACE_GROUP(126, "P 4/n n c :2", "P 4/n n c | x+1/4,y+1/4,z+1/4")
642
643DECLARE_GENERATED_SPACE_GROUP(127, "P 4/m b m", "-x,-y,z; -y,x,z; -x+1/2,y+1/2,-z; -x,-y,-z")
644DECLARE_GENERATED_SPACE_GROUP(128, "P 4/m n c", "-x,-y,z; -y,x,z; -x+1/2,y+1/2,-z+1/2; -x,-y,-z")
645
646DECLARE_GENERATED_SPACE_GROUP(129, "P 4/n m m", "-x,-y,z; -y+1/2,x+1/2,z; -x+1/2,y+1/2,-z; -x+1/2,-y+1/2,-z")
647DECLARE_TRANSFORMED_SPACE_GROUP(129, "P 4/n m m :2", "P 4/n m m | x+1/4,y-1/4,z")
648
649DECLARE_GENERATED_SPACE_GROUP(130, "P 4/n c c", "-x,-y,z; -y+1/2,x+1/2,z; -x+1/2,y+1/2,-z+1/2; -x+1/2,-y+1/2,-z")
650DECLARE_TRANSFORMED_SPACE_GROUP(130, "P 4/n c c :2", "P 4/n c c | x+1/4,y-1/4,z")
651
652DECLARE_GENERATED_SPACE_GROUP(131, "P 42/m m c", "-x,-y,z; -y,x,z+1/2; -x,y,-z; -x,-y,-z")
653DECLARE_GENERATED_SPACE_GROUP(132, "P 42/m c m", "-x,-y,z; -y,x,z+1/2; -x,y,-z+1/2; -x,-y,-z")
654
655DECLARE_GENERATED_SPACE_GROUP(133, "P 42/n b c", "-x,-y,z; -y+1/2,x+1/2,z+1/2; -x,y,-z+1/2; -x+1/2,-y+1/2,-z+1/2")
656DECLARE_TRANSFORMED_SPACE_GROUP(133, "P 42/n b c :2", "P 42/n b c | x+1/4,y-1/4,z+1/4")
657
658DECLARE_GENERATED_SPACE_GROUP(134, "P 42/n n m", "-x,-y,z; -y+1/2,x+1/2,z+1/2; -x,y,-z; -x+1/2,-y+1/2,-z+1/2")
659DECLARE_TRANSFORMED_SPACE_GROUP(134, "P 42/n n m :2", "P 42/n n m | x+1/4,y-1/4,z+1/4")
660
661DECLARE_GENERATED_SPACE_GROUP(135, "P 42/m b c", "-x,-y,z; -y,x,z+1/2; -x+1/2,y+1/2,-z; -x,-y,-z")
662DECLARE_GENERATED_SPACE_GROUP(136, "P 42/m n m", "-x,-y,z; -y+1/2,x+1/2,z+1/2; -x+1/2,y+1/2,-z+1/2; -x,-y,-z")
663
665 "-x,-y,z; -y+1/2,x+1/2,z+1/2; -x+1/2,y+1/2,-z+1/2; -x+1/2,-y+1/2,-z+1/2")
666DECLARE_TRANSFORMED_SPACE_GROUP(137, "P 42/n m c :2", "P 42/n m c | x+1/4,y-1/4,z+1/4")
667
668DECLARE_GENERATED_SPACE_GROUP(138, "P 42/n c m", "-x,-y,z; -y+1/2,x+1/2,z+1/2; -x+1/2,y+1/2,-z; -x+1/2,-y+1/2,-z+1/2")
669DECLARE_TRANSFORMED_SPACE_GROUP(138, "P 42/n c m :2", "P 42/n c m | x+1/4,y-1/4,z+1/4")
670
671DECLARE_GENERATED_SPACE_GROUP(139, "I 4/m m m", "-x,-y,z; -y,x,z; -x,y,-z; -x,-y,-z")
672DECLARE_GENERATED_SPACE_GROUP(140, "I 4/m c m", "-x,-y,z; -y,x,z; -x,y,-z+1/2; -x,-y,-z")
674 "-x+1/2,-y+1/2,z+1/2; -y,x+1/2,z+1/4; -x+1/2,y,-z+3/4; -x,-y+1/2,-z+1/4")
675DECLARE_TRANSFORMED_SPACE_GROUP(141, "I 41/a m d :2", "I 41/a m d | x,y-1/4,z+1/8")
676
678 "-x+1/2,-y+1/2,z+1/2; -y,x+1/2,z+1/4; -x+1/2,y,-z+1/4; -x,-y+1/2,-z+1/4")
679DECLARE_TRANSFORMED_SPACE_GROUP(142, "I 41/a c d :2", "I 41/a c d | x,y-1/4,z+1/8")
680
681// Trigonal
682DECLARE_GENERATED_SPACE_GROUP(143, "P 3", "-y,x-y,z")
683DECLARE_GENERATED_SPACE_GROUP(144, "P 31", "-y,x-y,z+1/3")
684DECLARE_GENERATED_SPACE_GROUP(145, "P 32", "-y,x-y,z+2/3")
685
686DECLARE_GENERATED_SPACE_GROUP(146, "R 3", "-y,x-y,z")
687DECLARE_TRANSFORMED_SPACE_GROUP(146, "R 3 :r", "R 3 | 2/3x-1/3y-1/3z, 1/3x+1/3y-2/3z, 1/3x+1/3y+1/3z")
688
689DECLARE_GENERATED_SPACE_GROUP(147, "P -3", "-y,x-y,z; -x,-y,-z")
690
691DECLARE_GENERATED_SPACE_GROUP(148, "R -3", "-y,x-y,z; -x,-y,-z")
692DECLARE_TRANSFORMED_SPACE_GROUP(148, "R -3 :r", "R -3 | 2/3x-1/3y-1/3z, 1/3x+1/3y-2/3z, 1/3x+1/3y+1/3z")
693
694DECLARE_GENERATED_SPACE_GROUP(149, "P 3 1 2", "-y,x-y,z; -y,-x,-z")
695DECLARE_GENERATED_SPACE_GROUP(150, "P 3 2 1", "-y,x-y,z; y,x,-z")
696DECLARE_GENERATED_SPACE_GROUP(151, "P 31 1 2", "-y,x-y,z+1/3; -y,-x,-z+2/3")
697DECLARE_GENERATED_SPACE_GROUP(152, "P 31 2 1", "-y,x-y,z+1/3; y,x,-z")
698DECLARE_GENERATED_SPACE_GROUP(153, "P 32 1 2", "-y,x-y,z+2/3; -y,-x,-z+1/3")
699DECLARE_GENERATED_SPACE_GROUP(154, "P 32 2 1", "-y,x-y,z+2/3; y,x,-z")
700
701DECLARE_GENERATED_SPACE_GROUP(155, "R 32", "-y,x-y,z; y,x,-z")
702DECLARE_TRANSFORMED_SPACE_GROUP(155, "R 32 :r", "R 32 | 2/3x-1/3y-1/3z, 1/3x+1/3y-2/3z, 1/3x+1/3y+1/3z")
703
704DECLARE_GENERATED_SPACE_GROUP(156, "P 3 m 1", "-y,x-y,z; -y,-x,z")
705DECLARE_GENERATED_SPACE_GROUP(157, "P 3 1 m", "-y,x-y,z; y,x,z")
706DECLARE_GENERATED_SPACE_GROUP(158, "P 3 c 1", "-y,x-y,z; -y,-x,z+1/2")
707DECLARE_GENERATED_SPACE_GROUP(159, "P 3 1 c", "-y,x-y,z; y,x,z+1/2")
708
709DECLARE_GENERATED_SPACE_GROUP(160, "R 3 m", "-y,x-y,z; -y,-x,z")
710DECLARE_TRANSFORMED_SPACE_GROUP(160, "R 3 m :r", "R 3 m | 2/3x-1/3y-1/3z, 1/3x+1/3y-2/3z, 1/3x+1/3y+1/3z")
711
712DECLARE_GENERATED_SPACE_GROUP(161, "R 3 c", "-y,x-y,z; -y,-x,z+1/2")
713DECLARE_TRANSFORMED_SPACE_GROUP(161, "R 3 c :r", "R 3 c | 2/3x-1/3y-1/3z, 1/3x+1/3y-2/3z, 1/3x+1/3y+1/3z")
714
715DECLARE_GENERATED_SPACE_GROUP(162, "P -3 1 m", "-y,x-y,z; -y,-x,-z; -x,-y,-z")
716DECLARE_GENERATED_SPACE_GROUP(163, "P -3 1 c", "-y,x-y,z; -y,-x,-z+1/2; -x,-y,-z")
717DECLARE_GENERATED_SPACE_GROUP(164, "P -3 m 1", "-y,x-y,z; y,x,-z; -x,-y,-z")
718DECLARE_GENERATED_SPACE_GROUP(165, "P -3 c 1", "-y,x-y,z; y,x,-z+1/2; -x,-y,-z")
719
720DECLARE_GENERATED_SPACE_GROUP(166, "R -3 m", "-y,x-y,z; y,x,-z; -x,-y,-z")
721DECLARE_TRANSFORMED_SPACE_GROUP(166, "R -3 m :r", "R -3 m | 2/3x-1/3y-1/3z, 1/3x+1/3y-2/3z, 1/3x+1/3y+1/3z")
722
723DECLARE_GENERATED_SPACE_GROUP(167, "R -3 c", "-y,x-y,z; y,x,-z+1/2; -x,-y,-z")
724DECLARE_TRANSFORMED_SPACE_GROUP(167, "R -3 c :r", "R -3 c | 2/3x-1/3y-1/3z, 1/3x+1/3y-2/3z, 1/3x+1/3y+1/3z")
725
726// Hexagonal
727DECLARE_GENERATED_SPACE_GROUP(168, "P 6", "-y,x-y,z; -x,-y,z")
728DECLARE_GENERATED_SPACE_GROUP(169, "P 61", "-y,x-y,z+1/3; -x,-y,z+1/2")
729DECLARE_GENERATED_SPACE_GROUP(170, "P 65", "-y,x-y,z+2/3; -x,-y,z+1/2")
730DECLARE_GENERATED_SPACE_GROUP(171, "P 62", "-y,x-y,z+2/3; -x,-y,z")
731DECLARE_GENERATED_SPACE_GROUP(172, "P 64", "-y,x-y,z+1/3; -x,-y,z")
732DECLARE_GENERATED_SPACE_GROUP(173, "P 63", "-y,x-y,z; -x,-y,z+1/2")
733DECLARE_GENERATED_SPACE_GROUP(174, "P -6", "-y,x-y,z; x,y,-z")
734DECLARE_GENERATED_SPACE_GROUP(175, "P 6/m", "-y,x-y,z; -x,-y,z; -x,-y,-z")
735DECLARE_GENERATED_SPACE_GROUP(176, "P 63/m", "-y,x-y,z; -x,-y,z+1/2; -x,-y,-z")
736DECLARE_GENERATED_SPACE_GROUP(177, "P 6 2 2", "-y,x-y,z; -x,-y,z; y,x,-z")
737DECLARE_GENERATED_SPACE_GROUP(178, "P 61 2 2", "-y,x-y,z+1/3; -x,-y,z+1/2; y,x,-z+1/3")
738DECLARE_GENERATED_SPACE_GROUP(179, "P 65 2 2", "-y,x-y,z+2/3; -x,-y,z+1/2; y,x,-z+2/3")
739DECLARE_GENERATED_SPACE_GROUP(180, "P 62 2 2", "-y,x-y,z+2/3; -x,-y,z; y,x,-z+2/3")
740DECLARE_GENERATED_SPACE_GROUP(181, "P 64 2 2", "-y,x-y,z+1/3; -x,-y,z; y,x,-z+1/3")
741DECLARE_GENERATED_SPACE_GROUP(182, "P 63 2 2", "-y,x-y,z; -x,-y,z+1/2; y,x,-z")
742DECLARE_GENERATED_SPACE_GROUP(183, "P 6 m m", "-y,x-y,z; -x,-y,z; -y,-x,z")
743DECLARE_GENERATED_SPACE_GROUP(184, "P 6 c c", "-y,x-y,z; -x,-y,z; -y,-x,z+1/2")
744DECLARE_GENERATED_SPACE_GROUP(185, "P 63 c m", "-y,x-y,z; -x,-y,z+1/2; -y,-x,z+1/2")
745DECLARE_GENERATED_SPACE_GROUP(186, "P 63 m c", "-y,x-y,z; -x,-y,z+1/2; -y,-x,z")
746DECLARE_GENERATED_SPACE_GROUP(187, "P -6 m 2", "-y,x-y,z; x,y,-z; -y,-x,z")
747DECLARE_GENERATED_SPACE_GROUP(188, "P -6 c 2", "-y,x-y,z; x,y,-z+1/2; -y,-x,z+1/2")
748DECLARE_GENERATED_SPACE_GROUP(189, "P -6 2 m", "-y,x-y,z; x,y,-z; y,x,-z")
749DECLARE_GENERATED_SPACE_GROUP(190, "P -6 2 c", "-y,x-y,z; x,y,-z+1/2; y,x,-z")
750DECLARE_GENERATED_SPACE_GROUP(191, "P 6/m m m", "-y,x-y,z; x,y,-z; y,x,-z; -x,-y,-z")
751DECLARE_GENERATED_SPACE_GROUP(192, "P 6/m c c", "-y,x-y,z; -x,-y,z; y,x,-z+1/2; -x,-y,-z")
752DECLARE_GENERATED_SPACE_GROUP(193, "P 63/m c m", "-y,x-y,z; -x,-y,z+1/2; y,x,-z+1/2; -x,-y,-z")
753DECLARE_GENERATED_SPACE_GROUP(194, "P 63/m m c", "-y,x-y,z; -x,-y,z+1/2; y,x,-z; -x,-y,-z")
754
755// Cubic
756DECLARE_GENERATED_SPACE_GROUP(195, "P 2 3", "-x,-y,z; -x,y,-z; z,x,y")
757DECLARE_GENERATED_SPACE_GROUP(196, "F 2 3", "-x,-y,z; -x,y,-z; z,x,y")
758DECLARE_GENERATED_SPACE_GROUP(197, "I 2 3", "-x,-y,z; -x,y,-z; z,x,y")
759DECLARE_GENERATED_SPACE_GROUP(198, "P 21 3", "-x+1/2,-y,z+1/2; -x,y+1/2,-z+1/2; z,x,y")
760DECLARE_GENERATED_SPACE_GROUP(199, "I 21 3", "-x+1/2,-y,z+1/2; -x,y+1/2,-z+1/2; z,x,y")
761DECLARE_GENERATED_SPACE_GROUP(200, "P m -3", "-x,-y,z; -x,y,-z; z,x,y; -x,-y,-z")
762
763DECLARE_GENERATED_SPACE_GROUP(201, "P n -3", "-x,-y,z; -x,y,-z; z,x,y; -x+1/2,-y+1/2,-z+1/2")
764DECLARE_TRANSFORMED_SPACE_GROUP(201, "P n -3 :2", "P n -3 | x+1/4,y+1/4,z+1/4")
765
766DECLARE_GENERATED_SPACE_GROUP(202, "F m -3", "-x,-y,z; -x,y,-z; z,x,y; -x,-y,-z")
767
768DECLARE_GENERATED_SPACE_GROUP(203, "F d -3", "-x,-y,z; -x,y,-z; z,x,y; -x+1/4,-y+1/4,-z+1/4")
769DECLARE_TRANSFORMED_SPACE_GROUP(203, "F d -3 :2", "F d -3 | x+1/8,y+1/8,z+1/8")
770
771DECLARE_GENERATED_SPACE_GROUP(204, "I m -3", "-x,-y,z; -x,y,-z; z,x,y; -x,-y,-z")
772DECLARE_GENERATED_SPACE_GROUP(205, "P a -3", "-x+1/2,-y,z+1/2; -x,y+1/2,-z+1/2; z,x,y; -x,-y,-z")
773DECLARE_GENERATED_SPACE_GROUP(206, "I a -3", "-x+1/2,-y,z+1/2; -x,y+1/2,-z+1/2; z,x,y; -x,-y,-z")
774DECLARE_GENERATED_SPACE_GROUP(207, "P 4 3 2", "-x,-y,z; -x,y,-z; z,x,y; y,x,-z")
775DECLARE_GENERATED_SPACE_GROUP(208, "P 42 3 2", "-x,-y,z; -x,y,-z; z,x,y; y+1/2,x+1/2,-z+1/2")
776DECLARE_GENERATED_SPACE_GROUP(209, "F 4 3 2", "-x,-y,z; -x,y,-z; z,x,y; y,x,-z")
777
778DECLARE_GENERATED_SPACE_GROUP(210, "F 41 3 2", "-x,-y+1/2,z+1/2; -x+1/2,y+1/2,-z; z,x,y; y+3/4,x+1/4,-z+3/4")
779DECLARE_GENERATED_SPACE_GROUP(211, "I 4 3 2", "-x,-y,z; -x,y,-z; z,x,y; y,x,-z")
780DECLARE_GENERATED_SPACE_GROUP(212, "P 43 3 2", "-x+1/2,-y,z+1/2; -x,y+1/2,-z+1/2; z,x,y; y+1/4,x+3/4,-z+3/4")
781DECLARE_GENERATED_SPACE_GROUP(213, "P 41 3 2", "-x+1/2,-y,z+1/2; -x,y+1/2,-z+1/2; z,x,y; y+3/4,x+1/4,-z+1/4")
782DECLARE_GENERATED_SPACE_GROUP(214, "I 41 3 2", "-x+1/2,-y,z+1/2; -x,y+1/2,-z+1/2; z,x,y; y+3/4,x+1/4,-z+1/4")
783DECLARE_GENERATED_SPACE_GROUP(215, "P -4 3 m", "-x,-y,z; -x,y,-z; z,x,y; y,x,z")
784DECLARE_GENERATED_SPACE_GROUP(216, "F -4 3 m", "-x,-y,z; -x,y,-z; z,x,y; y,x,z")
785DECLARE_GENERATED_SPACE_GROUP(217, "I -4 3 m", "-x,-y,z; -x,y,-z; z,x,y; y,x,z")
786DECLARE_GENERATED_SPACE_GROUP(218, "P -4 3 n", "-x,-y,z; -x,y,-z; z,x,y; y+1/2,x+1/2,z+1/2")
787DECLARE_GENERATED_SPACE_GROUP(219, "F -4 3 c", "-x,-y,z; -x,y,-z; z,x,y; y+1/2,x+1/2,z+1/2")
788DECLARE_GENERATED_SPACE_GROUP(220, "I -4 3 d", "-x+1/2,-y,z+1/2; -x,y+1/2,-z+1/2; z,x,y; y+1/4,x+1/4,z+1/4")
789DECLARE_GENERATED_SPACE_GROUP(221, "P m -3 m", "-x,-y,z; -x,y,-z; z,x,y; y,x,-z; -x,-y,-z")
790
791DECLARE_GENERATED_SPACE_GROUP(222, "P n -3 n", "-x,-y,z; -x,y,-z; z,x,y; y,x,-z; -x+1/2,-y+1/2,-z+1/2")
792DECLARE_TRANSFORMED_SPACE_GROUP(222, "P n -3 n :2", "P n -3 n | x+1/4,y+1/4,z+1/4")
793
794DECLARE_GENERATED_SPACE_GROUP(223, "P m -3 n", "-x,-y,z; -x,y,-z; z,x,y; y+1/2,x+1/2,-z+1/2; -x,-y,-z")
795
796DECLARE_GENERATED_SPACE_GROUP(224, "P n -3 m", "-x,-y,z; -x,y,-z; z,x,y; y+1/2,x+1/2,-z+1/2; -x+1/2,-y+1/2,-z+1/2")
797DECLARE_TRANSFORMED_SPACE_GROUP(224, "P n -3 m :2", "P n -3 m | x+1/4,y+1/4,z+1/4")
798
799DECLARE_GENERATED_SPACE_GROUP(225, "F m -3 m", "-x,-y,z; -x,y,-z; z,x,y; y,x,-z; -x,-y,-z")
800DECLARE_GENERATED_SPACE_GROUP(226, "F m -3 c", "-x,-y,z; -x,y,-z; z,x,y; y+1/2,x+1/2,-z+1/2; -x,-y,-z")
801
803 "-x,-y+1/2,z+1/2; -x+1/2,y+1/2,-z; z,x,y; "
804 "y+3/4,x+1/4,-z+3/4; -x+1/4,-y+1/4,-z+1/4")
805DECLARE_TRANSFORMED_SPACE_GROUP(227, "F d -3 m :2", "F d -3 m | x+1/8,y+1/8,z+1/8")
806
807DECLARE_GENERATED_SPACE_GROUP(228, "F d -3 c",
808 "-x,-y+1/2,z+1/2; -x+1/2,y+1/2,-z; z,x,y; "
809 "y+3/4,x+1/4,-z+3/4; -x+3/4,-y+3/4,-z+3/4")
810DECLARE_TRANSFORMED_SPACE_GROUP(228, "F d -3 c :2", "F d -3 c | x+3/8,y+3/8,z+3/8")
811
812DECLARE_GENERATED_SPACE_GROUP(229, "I m -3 m", "-x,-y,z; -x,y,-z; z,x,y; y,x,-z; -x,-y,-z")
813DECLARE_GENERATED_SPACE_GROUP(230, "I a -3 d", "-x+1/2,-y,z+1/2; -x,y+1/2,-z+1/2; z,x,y; y+3/4,x+1/4,-z+1/4; -x,-y,-z")
814
815} // namespace Mantid::Geometry
std::map< DeltaEMode::Type, std::string > index
#define DECLARE_TABULATED_SPACE_GROUP(number, hmSymbol, symmetryOperations)
#define DECLARE_TRANSFORMED_SPACE_GROUP(number, hmSymbol, generators)
#define DECLARE_GENERATED_SPACE_GROUP(number, hmSymbol, generators)
#define DECLARE_TRANSFORMED_ORTHORHOMBIC_SPACE_GROUP(number, hmSymbol, generators)
#define DECLARE_ORTHORHOMBIC_SPACE_GROUP(number, hmSymbol, generators)
AbstractSpaceGroupGenerator is used by SpaceGroupFactory to delay (possibly costly) construction of s...
SpaceGroup_const_sptr getPrototype()
Returns the internally stored prototype, generates one if necessary.
virtual Group_const_sptr generateGroup() const =0
SpaceGroup_const_sptr generatePrototype()
Generates a prototype space group object.
Group_const_sptr generateGroup() const override
Uses an algorithm based on Shmueli, U.
AlgorithmicSpaceGroupGenerator(size_t number, const std::string &hmSymbol, const std::string &generatorInformation)
Constructor of AlgorithmicSpaceGroupGenerator which throws an std::runtime_error exception when the g...
std::string getCenteringSymbol() const
Returns the centering symbol, which is extracted from the Hermann-Mauguin-symbol.
std::multimap< std::string, std::string > m_pointGroupMap
std::vector< std::string > subscribedSpaceGroupSymbols() const
Returns a vector with all subscribed space group symbols.
void fillPointGroupMap()
Fills the internal multimap that maintains the mapping between space and point groups.
void subscribe(const AbstractSpaceGroupGenerator_sptr &generator)
Puts the space group factory into the factory.
void subscribeTabulatedSpaceGroup(size_t number, const std::string &hmSymbol, const std::string &symmetryOperations)
Subscribes a "tabulated space group" into the factory where all symmetry operations need to be suppli...
void unsubscribeSpaceGroup(const std::string &hmSymbol)
Unsubscribes the space group with the given Hermann-Mauguin symbol, but throws std::invalid_argument ...
SpaceGroup_const_sptr getPrototype(const std::string &hmSymbol)
Returns a prototype object for the requested space group.
SpaceGroup_const_sptr constructFromPrototype(const SpaceGroup_const_sptr &prototype) const
Returns a copy-constructed instance of the supplied space group prototype object.
void subscribeGeneratedSpaceGroup(size_t number, const std::string &hmSymbol, const std::string &generators)
Subscribes a space group into the factory using generators.
std::multimap< size_t, std::string > m_numberMap
std::map< std::string, AbstractSpaceGroupGenerator_sptr > m_generatorMap
std::vector< size_t > subscribedSpaceGroupNumbers() const
Returns a vector with all subscribed space group numbers.
SpaceGroup_const_sptr createSpaceGroup(const std::string &hmSymbol)
Creates a space group given the Hermann-Mauguin symbol, throws std::invalid_argument if symbol is not...
bool isSubscribed(const std::string &hmSymbol) const
Returns true if space group with given symbol is subscribed.
std::string getTransformedSymbolOrthorhombic(const std::string &hmSymbol, const std::string &transformation) const
Method to get the transformed symbol of an orthorhombic space group under the supplied transformation...
SpaceGroupFactoryImpl()
Constructor cannot be called, since SingletonHolder is used.
Crystallographic symmetry operations are composed of a rotational component, which is represented by ...
SymmetryOperation inverse() const
Returns the inverse of the symmetry operation.
const Kernel::IntMatrix & matrix() const
Returns a const reference to the internally stored matrix.
TabulatedSpaceGroupGenerator(size_t number, const std::string &hmSymbol, const std::string &generatorInformation)
Constructor of TabulatedSpaceGroupGenerator, throws an std::runtime_error exception if generatorInfor...
Group_const_sptr generateGroup() const override
Returns a group that contains the symmetry operations in.
TransformationSpaceGroupGenerator(size_t number, const std::string &hmSymbol, const std::string &generatorInformation)
Constructor of TransformationSpaceGroupGenerator that may throw an std::invalid_argument exception wh...
Group_const_sptr generateGroup() const override
Generates a group from the SymmetryOperations obtained by applying the stored transformation to the b...
virtual SpaceGroup_const_sptr getBaseSpaceGroup() const
This method is virtual for testing purposes so that using the actual SpaceGroupFactory can be circumv...
void setBaseAndTransformation(const std::string &generatorInformation)
Method to extract base space group symbol and transformation.
Records the filename, the description of failure and the line on which it happened.
Definition Exception.h:115
MatrixWorkspace_sptr MANTID_API_DLL operator*(const MatrixWorkspace_sptr &lhs, const MatrixWorkspace_sptr &rhs)
Multiply two workspaces.
std::shared_ptr< PointGroup > PointGroup_sptr
Shared pointer to a PointGroup.
Definition PointGroup.h:69
bool MANTID_GEOMETRY_DLL isValidGeneratorString(const std::string &generatorString)
Free function that tries to parse the given list of symmetry operations and returns true if successfu...
std::shared_ptr< const SpaceGroup > SpaceGroup_const_sptr
Definition SpaceGroup.h:82
std::shared_ptr< AbstractSpaceGroupGenerator > AbstractSpaceGroupGenerator_sptr
std::shared_ptr< const Group > Group_const_sptr
Definition Group.h:179
STL namespace.