SimpleFastOpenAtomicVisualiser
Loading...
Searching...
No Matches
util.h
Go to the documentation of this file.
1#ifndef UTIL_H
2#define UTIL_H
3
4#include <cmath>
5#include <string>
6#include <sstream>
7#include <limits.h>
8#include <filesystem>
9#include <algorithm>
10#include <vector>
11#include <regex>
12
13#include <GLFW/glfw3.h>
14
15#include <glm/glm.hpp>
16
17#include <colour.h>
18
35glm::vec3 cartesian2Spherical(glm::vec3 xyz)
36{
37 float r = glm::length(xyz);
38 float sgn = (-1.0*xyz.z) < 0 ? -1.0 : 1.0;
39 return
40 {
41 r,
42 std::acos(xyz.y/r),
43 sgn * std::acos(xyz.x/std::sqrt(xyz.x*xyz.x+xyz.z*xyz.z))
44 };
45}
46
63glm::vec3 spherical2cartesian(glm::vec3 rthetaphi)
64{
65
66 return
67 {
68 rthetaphi.x*std::sin(rthetaphi.y)*std::cos(rthetaphi.z),
69 rthetaphi.x*std::cos(rthetaphi.y),
70 -rthetaphi.x*std::sin(rthetaphi.y)*std::sin(rthetaphi.z)
71 };
72}
73
81std::string fixedLengthNumber(double x, unsigned length)
82{
83 std::string d = std::to_string(x);
84 std::string dtrunc(length,' ');
85 for (unsigned c = 0; c < dtrunc.length(); c++/*ayy lmao*/)
86 {
87
88 if (c >= d.length())
89 {
90 dtrunc[c] = '0';
91 }
92 else
93 {
94 dtrunc[c] = d[c];
95 }
96 }
97 return dtrunc;
98}
99
108std::vector<std::string> split(std::string str, std::regex delim)
109{
110 std::vector<std::string> s;
111 auto matches = std::sregex_iterator(str.begin(), str.end(), delim);
112 if (std::distance(matches, std::sregex_iterator()) == 0) { return {str}; }
113 auto key = matches->position();
114 if (key > 0)
115 {
116 s.push_back(str.substr(0, key));
117 }
118 while (matches != std::sregex_iterator())
119 {
120 key = matches->position();
121 matches++;
122 auto next = matches->position();
123 s.push_back(str.substr(key, next-1-key));
124 }
125 return s;
126}
127
128void remove(std::string & str, const char ch)
129{
130 str.erase(std::remove(str.begin(), str.end(), ch), str.cend());
131}
132
141std::string sidebyside(std::string left, std::string right, uint8_t rjust)
142{
143 std::vector<std::string> l = split(left, std::regex("\\n"));
144 std::vector<std::string> r = split(right, std::regex("\\n"));
145
146 for (auto & str : l) { remove(str, '\n'); }
147 for (auto & str : r) { remove(str, '\n'); }
148
149 std::string combined;
150 std::vector<std::string>::iterator riter = r.begin();
151 for (auto liter = l.begin(); liter != l.end(); liter++)
152 {
153 combined += *liter;
154 if (riter != r.end())
155 {
156 int padding = std::max(int(rjust)-int((*liter).size()), 0);
157 combined += std::string(padding, ' ') + *riter + "\n";
158 riter++;
159 }
160 else
161 {
162 combined += "\n";
163 }
164 }
165
166 while (riter != r.end())
167 {
168 combined += std::string(rjust, ' ') + *riter + "\n";
169 riter++;
170 }
171 return combined;
172}
173
179std::string timeStamp()
180{
181 std::time_t end_time = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
182 std::string ts = std::ctime(&end_time);
183 std::replace(ts.begin(), ts.end(), ' ', '-');
184 std::replace(ts.begin(), ts.end(), ':', '-');
185 ts.erase(ts.end()-1);
186 return ts;
187}
188
193const std::vector<Atom> sfoavAtoms =
194{
195 {Element::S, {-11.3966, -2.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::S), CPK_COLOURS.at(Element::S)},
196 {Element::S, {-10.3966, -2.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::S), CPK_COLOURS.at(Element::S)},
197 {Element::S, {-9.39655, -2.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::S), CPK_COLOURS.at(Element::S)},
198 {Element::S, {-10.3966, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::S), CPK_COLOURS.at(Element::S)},
199 {Element::S, {-9.39655, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::S), CPK_COLOURS.at(Element::S)},
200 {Element::S, {-8.39655, -2.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::S), CPK_COLOURS.at(Element::S)},
201 {Element::S, {-8.39655, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::S), CPK_COLOURS.at(Element::S)},
202 {Element::S, {-11.3966, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::S), CPK_COLOURS.at(Element::S)},
203 {Element::S, {-11.3966, 0.896552, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::S), CPK_COLOURS.at(Element::S)},
204 {Element::S, {-10.3966, -0.103448, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::S), CPK_COLOURS.at(Element::S)},
205 {Element::S, {-9.39655, -0.103448, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::S), CPK_COLOURS.at(Element::S)},
206 {Element::S, {-8.39655, -1.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::S), CPK_COLOURS.at(Element::S)},
207 {Element::F, {-6.39655, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::F), CPK_COLOURS.at(Element::F)},
208 {Element::F, {-5.39655, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::F), CPK_COLOURS.at(Element::F)},
209 {Element::F, {-4.39655, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::F), CPK_COLOURS.at(Element::F)},
210 {Element::F, {-6.39655, -0.103448, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::F), CPK_COLOURS.at(Element::F)},
211 {Element::F, {-5.39655, -0.103448, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::F), CPK_COLOURS.at(Element::F)},
212 {Element::F, {-6.39655, 0.896552, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::F), CPK_COLOURS.at(Element::F)},
213 {Element::F, {-6.39655, -1.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::F), CPK_COLOURS.at(Element::F)},
214 {Element::F, {-6.39655, -2.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::F), CPK_COLOURS.at(Element::F)},
215 {Element::F, {-4.39655, -0.103448, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::F), CPK_COLOURS.at(Element::F)},
216 {Element::F, {-3.39655, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::F), CPK_COLOURS.at(Element::F)},
217 {Element::O, {-1.39655, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::O), CPK_COLOURS.at(Element::O)},
218 {Element::O, {-1.39655, 0.896552, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::O), CPK_COLOURS.at(Element::O)},
219 {Element::O, {-1.39655, -0.103448, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::O), CPK_COLOURS.at(Element::O)},
220 {Element::O, {-1.39655, -1.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::O), CPK_COLOURS.at(Element::O)},
221 {Element::O, {-1.39655, -2.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::O), CPK_COLOURS.at(Element::O)},
222 {Element::O, {-0.39655, -2.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::O), CPK_COLOURS.at(Element::O)},
223 {Element::O, {0.603449, -2.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::O), CPK_COLOURS.at(Element::O)},
224 {Element::O, {1.603449, -2.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::O), CPK_COLOURS.at(Element::O)},
225 {Element::O, {1.603449, -1.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::O), CPK_COLOURS.at(Element::O)},
226 {Element::O, {1.603449, -0.103448, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::O), CPK_COLOURS.at(Element::O)},
227 {Element::O, {1.603449, 0.896552, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::O), CPK_COLOURS.at(Element::O)},
228 {Element::O, {1.603449, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::O), CPK_COLOURS.at(Element::O)},
229 {Element::O, {0.603449, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::O), CPK_COLOURS.at(Element::O)},
230 {Element::O, {-0.39655, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::O), CPK_COLOURS.at(Element::O)},
231 {Element::Ar, {-1.39655+1.603449*3.0, -2.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::Ar), CPK_COLOURS.at(Element::Ar)},
232 {Element::Ar, {-1.39655+1.603449*3.0, -1.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::Ar), CPK_COLOURS.at(Element::Ar)},
233 {Element::Ar, {-1.39655+1.603449*3.0, -0.103448, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::Ar), CPK_COLOURS.at(Element::Ar)},
234 {Element::Ar, {-1.39655+1.603449*3.0, 0.896552, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::Ar), CPK_COLOURS.at(Element::Ar)},
235 {Element::Ar, {-0.396552+1.603449*3.0, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::Ar), CPK_COLOURS.at(Element::Ar)},
236 {Element::Ar, {0.603448+1.603449*3.0, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::Ar), CPK_COLOURS.at(Element::Ar)},
237 {Element::Ar, {1.60345+1.603449*3.0, 0.896552, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::Ar), CPK_COLOURS.at(Element::Ar)},
238 {Element::Ar, {1.60345+1.603449*3.0, -0.103448, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::Ar), CPK_COLOURS.at(Element::Ar)},
239 {Element::Ar, {1.60345+1.603449*3.0, -1.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::Ar), CPK_COLOURS.at(Element::Ar)},
240 {Element::Ar, {1.60345+1.603449*3.0, -2.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::Ar), CPK_COLOURS.at(Element::Ar)},
241 {Element::Ar, {0.603448+1.603449*3.0, -0.103448, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::Ar), CPK_COLOURS.at(Element::Ar)},
242 {Element::Ar, {-0.396552+1.603449*3.0, -0.103448, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::Ar), CPK_COLOURS.at(Element::Ar)},
243 {Element::V, {8.60345, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::V), CPK_COLOURS.at(Element::V)},
244 {Element::V, {11.6034, 1.89655, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::V), CPK_COLOURS.at(Element::V)},
245 {Element::V, {8.60345, 0.896552, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::V), CPK_COLOURS.at(Element::V)},
246 {Element::V, {8.60345, -0.103448, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::V), CPK_COLOURS.at(Element::V)},
247 {Element::V, {11.6034, 0.896552, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::V), CPK_COLOURS.at(Element::V)},
248 {Element::V, {11.6034, -0.103448, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::V), CPK_COLOURS.at(Element::V)},
249 {Element::V, {10.6034, -2.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::V), CPK_COLOURS.at(Element::V)},
250 {Element::V, {9.60345, -2.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::V), CPK_COLOURS.at(Element::V)},
251 {Element::V, {8.60345, -1.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::V), CPK_COLOURS.at(Element::V)},
252 {Element::V, {11.6034, -1.10345, 0.0}, 0.5f*ELEMENT_RADIUS.at(Element::V), CPK_COLOURS.at(Element::V)}
253};
254
259const std::map<int, std::string> keyCodes
260{
261 {GLFW_KEY_UNKNOWN, "Unknown"},
262 {GLFW_KEY_SPACE, "Space"},
263 {GLFW_KEY_APOSTROPHE, "Apostrophe"},
264 {GLFW_KEY_COMMA, "Comma"},
265 {GLFW_KEY_MINUS, "Minus"},
266 {GLFW_KEY_PERIOD, "Period"},
267 {GLFW_KEY_SLASH, "Slash"},
268 {GLFW_KEY_0, "0"},
269 {GLFW_KEY_1, "1"},
270 {GLFW_KEY_2, "2"},
271 {GLFW_KEY_3, "3"},
272 {GLFW_KEY_4, "4"},
273 {GLFW_KEY_5, "5"},
274 {GLFW_KEY_6, "6"},
275 {GLFW_KEY_7, "7"},
276 {GLFW_KEY_8, "8"},
277 {GLFW_KEY_9, "9"},
278 {GLFW_KEY_SEMICOLON, "Semicolon"},
279 {GLFW_KEY_EQUAL, "Equal"},
280 {GLFW_KEY_A, "A"},
281 {GLFW_KEY_B, "B"},
282 {GLFW_KEY_C, "C"},
283 {GLFW_KEY_D, "D"},
284 {GLFW_KEY_E, "E"},
285 {GLFW_KEY_F, "F"},
286 {GLFW_KEY_G, "G"},
287 {GLFW_KEY_H, "H"},
288 {GLFW_KEY_I, "I"},
289 {GLFW_KEY_J, "J"},
290 {GLFW_KEY_K, "K"},
291 {GLFW_KEY_L, "L"},
292 {GLFW_KEY_M, "M"},
293 {GLFW_KEY_N, "N"},
294 {GLFW_KEY_O, "O"},
295 {GLFW_KEY_P, "P"},
296 {GLFW_KEY_Q, "Q"},
297 {GLFW_KEY_R, "R"},
298 {GLFW_KEY_S, "S"},
299 {GLFW_KEY_T, "T"},
300 {GLFW_KEY_U, "U"},
301 {GLFW_KEY_V, "V"},
302 {GLFW_KEY_W, "W"},
303 {GLFW_KEY_X, "X"},
304 {GLFW_KEY_Y, "Y"},
305 {GLFW_KEY_Z, "Z"},
306 {GLFW_KEY_LEFT_BRACKET, "LeftBracket"},
307 {GLFW_KEY_BACKSLASH, "Backslash"},
308 {GLFW_KEY_RIGHT_BRACKET, "RightBracket"},
309 {GLFW_KEY_GRAVE_ACCENT, "GraveAccent"},
310 {GLFW_KEY_WORLD_1, "World1"},
311 {GLFW_KEY_WORLD_2, "World2"},
312 {GLFW_KEY_ESCAPE, "Escape"},
313 {GLFW_KEY_ENTER, "Enter"},
314 {GLFW_KEY_TAB, "Tab"},
315 {GLFW_KEY_BACKSPACE, "Backspace"},
316 {GLFW_KEY_INSERT, "Insert"},
317 {GLFW_KEY_DELETE, "Delete"},
318 {GLFW_KEY_RIGHT, "Right"},
319 {GLFW_KEY_LEFT, "Left"},
320 {GLFW_KEY_DOWN, "Down"},
321 {GLFW_KEY_UP, "Up"},
322 {GLFW_KEY_PAGE_UP, "PageUp"},
323 {GLFW_KEY_PAGE_DOWN, "PageDown"},
324 {GLFW_KEY_HOME, "Home"},
325 {GLFW_KEY_END, "End"},
326 {GLFW_KEY_CAPS_LOCK, "CapsLock"},
327 {GLFW_KEY_SCROLL_LOCK, "ScrollLock"},
328 {GLFW_KEY_NUM_LOCK, "NumLock"},
329 {GLFW_KEY_PRINT_SCREEN, "PrintScreen"},
330 {GLFW_KEY_PAUSE, "Pause"},
331 {GLFW_KEY_F1, "F1"},
332 {GLFW_KEY_F2, "F2"},
333 {GLFW_KEY_F3, "F3"},
334 {GLFW_KEY_F4, "F4"},
335 {GLFW_KEY_F5, "F5"},
336 {GLFW_KEY_F6, "F6"},
337 {GLFW_KEY_F7, "F7"},
338 {GLFW_KEY_F8, "F8"},
339 {GLFW_KEY_F9, "F9"},
340 {GLFW_KEY_F10, "F10"},
341 {GLFW_KEY_F11, "F11"},
342 {GLFW_KEY_F12, "F12"},
343 {GLFW_KEY_F13, "F13"},
344 {GLFW_KEY_F14, "F14"},
345 {GLFW_KEY_F15, "F15"},
346 {GLFW_KEY_F16, "F16"},
347 {GLFW_KEY_F17, "F17"},
348 {GLFW_KEY_F18, "F18"},
349 {GLFW_KEY_F19, "F19"},
350 {GLFW_KEY_F20, "F20"},
351 {GLFW_KEY_F21, "F21"},
352 {GLFW_KEY_F22, "F22"},
353 {GLFW_KEY_F23, "F23"},
354 {GLFW_KEY_F24, "F24"},
355 {GLFW_KEY_F25, "F25"},
356 {GLFW_KEY_KP_0, "Keypad0"},
357 {GLFW_KEY_KP_1, "Keypad1"},
358 {GLFW_KEY_KP_2, "Keypad2"},
359 {GLFW_KEY_KP_3, "Keypad3"},
360 {GLFW_KEY_KP_4, "Keypad4"},
361 {GLFW_KEY_KP_5, "Keypad5"},
362 {GLFW_KEY_KP_6, "Keypad6"},
363 {GLFW_KEY_KP_7, "Keypad7"},
364 {GLFW_KEY_KP_8, "Keypad8"},
365 {GLFW_KEY_KP_9, "Keypad9"},
366 {GLFW_KEY_KP_DECIMAL, "KeypadDecimal"},
367 {GLFW_KEY_KP_DIVIDE, "KeypadDivide"},
368 {GLFW_KEY_KP_MULTIPLY, "KeypadMultiply"},
369 {GLFW_KEY_KP_SUBTRACT, "KeypadSubtract"},
370 {GLFW_KEY_KP_ADD, "KeypadAdd"},
371 {GLFW_KEY_KP_ENTER, "KeypadEnter"},
372 {GLFW_KEY_KP_EQUAL, "KeypadEqual"},
373 {GLFW_KEY_LEFT_SHIFT, "LeftShift"},
374 {GLFW_KEY_LEFT_CONTROL, "LeftControl"},
375 {GLFW_KEY_LEFT_ALT, "LeftAlt"},
376 {GLFW_KEY_LEFT_SUPER, "LeftSuper"},
377 {GLFW_KEY_RIGHT_SHIFT, "RightShift"},
378 {GLFW_KEY_RIGHT_CONTROL, "RightControl"},
379 {GLFW_KEY_RIGHT_ALT, "RightAlt"},
380 {GLFW_KEY_RIGHT_SUPER, "RightSuper"},
381 {GLFW_KEY_MENU, "Menu"}
382};
383
384#endif /* UTIL_H */
const std::map< Element, glm::vec4 > CPK_COLOURS
Corey–Pauling–Koltun colourings.
Definition colour.h:18
glm::vec< L, float, glm::qualifier::highp > vec
Definition commandLine.h:214
const std::map< Element, float > ELEMENT_RADIUS
Map Element to a Van der Waals radius in Angstroms.
Definition element.h:461
const std::map< int, std::string > keyCodes
String name for a GLFW_KEY index.
Definition util.h:260
std::vector< std::string > split(std::string str, std::regex delim)
Split a std::string by a std::regex token.
Definition util.h:108
void remove(std::string &str, const char ch)
Definition util.h:128
std::string fixedLengthNumber(double x, unsigned length)
Convert a double to a fixes length std::string.
Definition util.h:81
glm::vec3 spherical2cartesian(glm::vec3 rthetaphi)
convert spherical coordinates to cartesian coordinates.
Definition util.h:63
const std::vector< Atom > sfoavAtoms
A set of atoms spelling SFOAV to display during loading.
Definition util.h:193
std::string timeStamp()
Current timestamp.
Definition util.h:179
std::string sidebyside(std::string left, std::string right, uint8_t rjust)
Combined two strings (split by newlines) side by side.
Definition util.h:141
glm::vec3 cartesian2Spherical(glm::vec3 xyz)
Map cartesian coordinates to spherical.
Definition util.h:35