-
Notifications
You must be signed in to change notification settings - Fork 0
/
symmetryoperation.cpp
75 lines (61 loc) · 2.14 KB
/
symmetryoperation.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//
// Created by Jon on 23/08/2015.
//
#include "symmetryoperation.h"
namespace CIF {
void Symmetry::setOperation(int i, std::vector<std::string> factors) {
SymmetryOperation temp = SymmetryOperation(factors);
if (i == 0)
xOperation = temp;
else if (i == 1)
yOperation = temp;
else if (i == 2)
zOperation = temp;
// TODO: else statement with error handling
}
SymmetryOperation Symmetry::getOperation(int i) {
if (i == 0)
return xOperation;
else if (i == 1)
return yOperation;
else if (i == 2)
return zOperation;
else
throw std::runtime_error("Trying to get symmetry operation with unknown index: " + std::to_string(i));
}
SymmetryOperation::SymmetryOperation(std::vector<std::string> factors) {
xf = 0;
yf = 0;
zf = 0;
c = 0;
for (std::string term : factors) {
if (term.back() == 'x') {
term.pop_back();
xf += fractionToDecimal(term, 1.0);
} else if (term.back() == 'y') {
term.pop_back();
yf += fractionToDecimal(term, 1.0);
} else if (term.back() == 'z') {
term.pop_back();
zf += fractionToDecimal(term, 1.0);
} else
c += fractionToDecimal(term, 0.0);
}
}
double SymmetryOperation::applyOperation(double xin, double yin, double zin) {
return xf * xin + yf * yin + zf * zin + c;
}
double SymmetryOperation::applyOperation(std::vector<double> positions) {
return applyOperation(positions[0], positions[1], positions[2]);
}
double SymmetryOperation::fractionToDecimal(std::string fractionstring, double nullReturn) {
if (fractionstring == "")
return nullReturn;
if (fractionstring == "+")
return 1.0;
else if (fractionstring == "-")
return -1.0;
std::vector<std::string> fsplit = Utilities::split(fractionstring, '/');
return std::stod(fsplit[0]) / std::stod(fsplit[1]);
}
}