@ccp-nc/crystvis-js 0.4.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/.eslintrc.json +16 -0
  2. package/.github/workflows/test-mocha.yml +30 -0
  3. package/.vscode/settings.json +4 -0
  4. package/LICENSE +21 -0
  5. package/README.html +1127 -0
  6. package/README.md +76 -0
  7. package/demo/demo.css +30 -0
  8. package/demo/index.html +76 -0
  9. package/demo/main.js +143 -0
  10. package/docs/.nojekyll +0 -0
  11. package/docs-tutorials/Events.md +57 -0
  12. package/docs-tutorials/Queries.md +50 -0
  13. package/fonts/Rubik/OFL.txt +93 -0
  14. package/fonts/Rubik/README.txt +77 -0
  15. package/fonts/Rubik/Rubik-Italic-VariableFont_wght.ttf +0 -0
  16. package/fonts/Rubik/Rubik-VariableFont_wght.ttf +0 -0
  17. package/fonts/Rubik/static/Rubik-Black.ttf +0 -0
  18. package/fonts/Rubik/static/Rubik-BlackItalic.ttf +0 -0
  19. package/fonts/Rubik/static/Rubik-Bold.ttf +0 -0
  20. package/fonts/Rubik/static/Rubik-BoldItalic.ttf +0 -0
  21. package/fonts/Rubik/static/Rubik-ExtraBold.ttf +0 -0
  22. package/fonts/Rubik/static/Rubik-ExtraBoldItalic.ttf +0 -0
  23. package/fonts/Rubik/static/Rubik-Italic.ttf +0 -0
  24. package/fonts/Rubik/static/Rubik-Light.ttf +0 -0
  25. package/fonts/Rubik/static/Rubik-LightItalic.ttf +0 -0
  26. package/fonts/Rubik/static/Rubik-Medium.ttf +0 -0
  27. package/fonts/Rubik/static/Rubik-MediumItalic.ttf +0 -0
  28. package/fonts/Rubik/static/Rubik-Regular.ttf +0 -0
  29. package/fonts/Rubik/static/Rubik-SemiBold.ttf +0 -0
  30. package/fonts/Rubik/static/Rubik-SemiBoldItalic.ttf +0 -0
  31. package/index.html +25 -0
  32. package/index.js +11 -0
  33. package/jsconf.json +14 -0
  34. package/lib/assets/fonts/Rubik-Medium.fnt +297 -0
  35. package/lib/assets/fonts/Rubik-Medium.png +0 -0
  36. package/lib/assets/fonts/bmpfonts.in.js +16 -0
  37. package/lib/assets/fonts/bmpfonts.js +9 -0
  38. package/lib/assets/fonts/font.js +82 -0
  39. package/lib/assets/fonts/index.js +14 -0
  40. package/lib/assets/fonts/threebmfont.js +28 -0
  41. package/lib/data.js +125 -0
  42. package/lib/formats/cell.js +114 -0
  43. package/lib/formats/cif.js +22 -0
  44. package/lib/formats/magres.js +337 -0
  45. package/lib/formats/xyz.js +124 -0
  46. package/lib/loader.js +87 -0
  47. package/lib/model.js +2076 -0
  48. package/lib/modelview.js +382 -0
  49. package/lib/nmrdata.js +2898 -0
  50. package/lib/orbit.js +1233 -0
  51. package/lib/primitives/atoms.js +261 -0
  52. package/lib/primitives/cell.js +160 -0
  53. package/lib/primitives/dither.js +156 -0
  54. package/lib/primitives/ellipsoid.js +183 -0
  55. package/lib/primitives/geometries.js +20 -0
  56. package/lib/primitives/index.js +48 -0
  57. package/lib/primitives/isosurface.js +171 -0
  58. package/lib/primitives/shapes.js +100 -0
  59. package/lib/primitives/sprites.js +172 -0
  60. package/lib/query.js +158 -0
  61. package/lib/render.js +440 -0
  62. package/lib/selbox.js +361 -0
  63. package/lib/shaders/aura.frag +26 -0
  64. package/lib/shaders/aura.vert +37 -0
  65. package/lib/shaders/dither.frag +42 -0
  66. package/lib/shaders/dither.vert +8 -0
  67. package/lib/shaders/index.in.js +17 -0
  68. package/lib/shaders/index.js +25 -0
  69. package/lib/shaders/msdf300.frag +25 -0
  70. package/lib/shaders/msdf300.vert +45 -0
  71. package/lib/tensor.js +227 -0
  72. package/lib/utils.js +168 -0
  73. package/lib/visualizer.js +480 -0
  74. package/package.json +106 -0
  75. package/scripts/build-bundle.js +17 -0
  76. package/scripts/build-fonts.js +43 -0
  77. package/scripts/build-resources.js +46 -0
  78. package/scripts/plugins-shim.js +10 -0
  79. package/test/chemdata.js +69 -0
  80. package/test/data/CHA.cif +74 -0
  81. package/test/data/H2O.xyz +8 -0
  82. package/test/data/H2_bound.xyz +4 -0
  83. package/test/data/ethanol.cell +25 -0
  84. package/test/data/ethanol.magres +238 -0
  85. package/test/data/example_single.cif +789 -0
  86. package/test/data/frac.cell +8 -0
  87. package/test/data/org.cif +427 -0
  88. package/test/data/pyridine.xyz +13 -0
  89. package/test/data/si8.xyz +10 -0
  90. package/test/loader.js +107 -0
  91. package/test/model.js +368 -0
  92. package/test/query.js +135 -0
  93. package/test/tensor.js +133 -0
  94. package/test/test-html/examples.js +1485 -0
  95. package/test/test-html/index.html +33 -0
  96. package/test/test-html/index.js +279 -0
  97. package/tools/compile_colors.py +120 -0
  98. package/tools/compile_periodic.py +96 -0
  99. package/tools/ptable.json +497 -0
  100. package/tools/test +5844 -0
@@ -0,0 +1,33 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="x-ua-compatible" content="ie=edge">
6
+ <title>CrystVis.js test</title>
7
+ <meta name="description" content="">
8
+ <meta name="viewport" content="width=device-width, initial-scale=1">
9
+
10
+ <link rel="stylesheet" href="/node_modules/mocha/mocha.css">
11
+
12
+ <style type="text/css">
13
+ #main-app {
14
+ padding: 20px;
15
+ background-color: #ececec;
16
+ min-height: 500px;
17
+ }
18
+ </style>
19
+
20
+ </head>
21
+ <body>
22
+
23
+ <div id="main-app"></div>
24
+ <div id="mocha"></div>
25
+ <script src="/node_modules/mocha/mocha.js"></script>
26
+ <script src="/node_modules/chai/chai.js"></script>
27
+ <script>mocha.setup('bdd')</script>
28
+
29
+ <script type="text/javascript" src="/test/test-html/testbuild.js"></script>
30
+
31
+ <script type="text/javascript">mocha.run()</script>
32
+ </body>
33
+ </html>
@@ -0,0 +1,279 @@
1
+ 'use strict';
2
+
3
+ import _ from 'lodash';
4
+ import $ from 'jquery';
5
+ import * as THREE from 'three';
6
+ import chroma from 'chroma-js';
7
+
8
+ import chai from 'chai';
9
+ import {
10
+ Renderer
11
+ } from '../../lib/render.js';
12
+ import {
13
+ Model
14
+ } from '../../lib/model.js';
15
+ import {
16
+ CrystVis
17
+ } from '../../lib/visualizer.js';
18
+ import * as Primitives from '../../lib/primitives';
19
+ import {
20
+ RubikMedium
21
+ } from '../../lib/assets/fonts';
22
+
23
+ import {
24
+ exampleFiles
25
+ } from './examples.js';
26
+
27
+ var renderer;
28
+ var visualizer;
29
+
30
+ describe('Font tests', function() {
31
+
32
+ it('should successfully create a BitmapFont', function() {
33
+ chai.expect(RubikMedium.ready).to.equal(true);
34
+ });
35
+
36
+ it('should successfully create a geometry from said font', function() {
37
+
38
+ var geo = RubikMedium.getTextGeometry('Hello world');
39
+ });
40
+ });
41
+
42
+ describe('Renderer tests', function() {
43
+ it('should successfully load a Renderer', function() {
44
+ renderer = new Renderer('#main-app', 640, 480);
45
+ });
46
+ it('should successfully create an atom', function() {
47
+ var a = new Primitives.AtomMesh([0, 0, 0], 0.5, 0xff0000);
48
+ renderer.add(a, 'model');
49
+ chai.expect(renderer._groups.model.children).to.include(a);
50
+ renderer.remove(a, 'model');
51
+ });
52
+ it('should successfully create a unit cell', function() {
53
+ var latt = new THREE.Matrix3();
54
+ latt.set(10, 0, 0, 1, 8, 0, 0, 0, 9).transpose();
55
+
56
+ var box = new Primitives.BoxMesh(latt);
57
+ var ax = new Primitives.AxesMesh(latt);
58
+
59
+ renderer.add(box, 'model');
60
+ renderer.add(ax, 'model');
61
+
62
+ chai.expect(renderer._groups.model.children).to.include.members([box, ax]);
63
+
64
+ renderer.remove(box, 'model');
65
+ renderer.remove(ax, 'model');
66
+ });
67
+ it('should successfully create a bond', function() {
68
+ var b = new Primitives.BondMesh([0, 0, 0], [1, 0, 0]);
69
+
70
+ renderer.add(b, 'model');
71
+
72
+ chai.expect(renderer._groups.model.children).to.include(b);
73
+
74
+ renderer.remove(b, 'model');
75
+ });
76
+ it('should successfully render sprites', function() {
77
+ var ts = new Primitives.TextSprite('Hello world');
78
+ renderer.add(ts, 'primitives');
79
+
80
+ chai.expect(renderer._groups.primitives.children).to.include.members([ts]);
81
+
82
+ renderer.remove(ts);
83
+ });
84
+ it('should successfully clear a scene', function() {
85
+
86
+ var a = new Primitives.AtomMesh([0, 0, 0], 0.5, 0xff0000);
87
+ renderer.add(a);
88
+
89
+ renderer.clear();
90
+
91
+ });
92
+
93
+ after(function() {
94
+ // Destroy the renderer
95
+ renderer = null;
96
+ $('#main-app').empty();
97
+ });
98
+ });
99
+
100
+ describe('Visualizer tests', function() {
101
+ it('should successfully load a CrystVis visualizer', function() {
102
+ visualizer = new CrystVis('#main-app', 640, 480);
103
+ });
104
+
105
+ it('should load new models in the visualizer', function() {
106
+
107
+ var m1 = visualizer.loadModels(exampleFiles['H2O.xyz'], 'xyz', 'xyz', {
108
+ supercell: [3, 3, 3]
109
+ });
110
+ var m2 = visualizer.loadModels(exampleFiles['org.cif']);
111
+ var m3 = visualizer.loadModels(exampleFiles['si8.xyz'], 'xyz');
112
+ var m4 = visualizer.loadModels(exampleFiles['example_single.cif']);
113
+ var m5 = visualizer.loadModels(exampleFiles['ethanol.magres'], 'magres');
114
+
115
+ chai.expect(visualizer.modelList.sort()).to.deep.equal(['cif_1501936', 'cif_I', 'magres', 'xyz', 'xyz_1']);
116
+ });
117
+
118
+ it('should correctly visualize a model', function() {
119
+
120
+ visualizer.displayModel('cif_I');
121
+
122
+ });
123
+
124
+ it('should correctly apply changes in properties to the displayed atoms', function() {
125
+
126
+ visualizer.displayed.setProperty('color', 0xff0000);
127
+ visualizer.displayed.setProperty('color');
128
+
129
+ visualizer.displayed.setProperty('opacity', 0.4);
130
+ visualizer.displayed.setProperty('opacity');
131
+
132
+ visualizer.displayed.addLabels();
133
+ visualizer.displayed.addLabels(function(a, i) {
134
+ return a.radius;
135
+ }, 'radius', {
136
+ shift: [0.1, -0.03, 0],
137
+ color: 0xff0000
138
+ });
139
+
140
+ });
141
+
142
+ it('should correctly add/remove ellipsoids to the displayed atoms', function() {
143
+
144
+ var data = {
145
+ eigenvalues: [1, 2, 4],
146
+ eigenvectors: [
147
+ [1, 1, 0],
148
+ [1, -1, 0],
149
+ [0, 0, 1]
150
+ ]
151
+ };
152
+
153
+ visualizer.displayed.atoms[0].addEllipsoid(data, 'test');
154
+ visualizer.displayed.atoms[1].addEllipsoid(data, 'test2', {
155
+ color: 0x00ee88
156
+ });
157
+ visualizer.displayed.atoms[0].removeEllipsoid('test');
158
+
159
+ // Set their properties
160
+ visualizer.displayed.atoms[1].ellipsoidProperty('test2', 'color', 0x8800ee);
161
+
162
+ });
163
+
164
+ it('should correctly draw simple primitives', function() {
165
+
166
+ var a1 = visualizer.displayed.atoms[0];
167
+ var a2 = visualizer.displayed.atoms[1];
168
+ var a3 = visualizer.displayed.atoms[2];
169
+ var line1 = new Primitives.LineMesh(a1, a2);
170
+ var line2 = new Primitives.LineMesh(a2, a3, {
171
+ color: 0xff9900,
172
+ dashed: true,
173
+ });
174
+
175
+ visualizer.addPrimitive(line1);
176
+ visualizer.addPrimitive(line2);
177
+ visualizer.removePrimitive(line1);
178
+
179
+ });
180
+
181
+ });
182
+
183
+
184
+ // Bootstrap the whole thing!
185
+ $(document).ready(function() {
186
+
187
+
188
+ // var Atoms = require('crystcif-parse').Atoms;
189
+
190
+ // var a = new Atoms(['C'], [[0, 0, 1]], [[2, 0, 0], [0, 2, 0], [0, 1, 2]]);
191
+
192
+ // var m = new Model(a);
193
+
194
+ // console.log(m);
195
+ // r = new Renderer('.main-app-content', 640, 480);
196
+
197
+ // var O = new THREE.Vector3(0, 0, 1);
198
+ // var H1 = new THREE.Vector3(0.9, 0, -0.2);
199
+ // var H2 = new THREE.Vector3(-0.9, 0, -0.2);
200
+
201
+
202
+ // r._addAtom(O, 0.5, 0xff0000);
203
+ // r._addAtom(H1, 0.35, 0xeeeeee);
204
+ // r._addAtom(H2, 0.35, 0xeeeeee);
205
+
206
+ // r._addBond(O, H1, 0.2, 0xff0000, 0xeeeeee);
207
+ // r._addBond(O, H2, 0.2, 0xff0000, 0xeeeeee);
208
+
209
+ // var latt = new THREE.Matrix3();
210
+ // latt.set(10, 0, 0, 1, 8, 0, 0, 0, 9).transpose();
211
+
212
+ // var ba = r._addLattice(latt);
213
+ // box = ba[0];
214
+ // arrows = ba[1];
215
+
216
+ // r._addBillBoard(O.clone().add(new THREE.Vector3(0.6, 0.6, 0)), 'Hello world');
217
+
218
+ // ellipsoids = [];
219
+ // ellipsoids.push(r._addEllipsoid(O, new THREE.Vector3(1, -1, 0),
220
+ // new THREE.Vector3(2, 2, 0), new THREE.Vector3(0, 0, 3),
221
+ // 0xde3300, 0.3, Renderer.DITHERNET));
222
+ // ellipsoids.push(r._addEllipsoid(H1, new THREE.Vector3(1, 0, 0),
223
+ // new THREE.Vector3(0, 0.8, 0), new THREE.Vector3(0, 0, 1.2),
224
+ // 0x0033de, 0.3, Renderer.DITHER));
225
+
226
+ // // Vector field test
227
+ // var points = [];
228
+ // var vectors = [];
229
+
230
+ // for (var x = 0; x <= 3; x += 0.5) {
231
+ // for (var y = 0; y <= 3; y += 0.5) {
232
+ // for (var z = 0; z <= 2; z += 0.5) {
233
+ // points.push(new THREE.Vector3(x, y, z));
234
+ // vectors.push(new THREE.Vector3(Math.cos(3*x)*0.2, Math.sin(3*y)*0.2, 0));
235
+ // }
236
+ // }
237
+ // }
238
+
239
+ // var bez = chroma.bezier(['red', 'blue']);
240
+ // // r._addVectorField(points, vectors, function(p, v, i) {
241
+ // // return bez(p.length()/6.0).hex();
242
+ // // });
243
+
244
+ // // Testing the isosurface
245
+
246
+ // var N = 20;
247
+ // var sfield = [];
248
+ // for (var x = 0; x < N; x++) {
249
+ // sfield.push([]);
250
+ // for (var y = 0; y < N; y++) {
251
+ // sfield[x].push([]);
252
+ // for (var z = 0; z < N; z++) {
253
+ // var f = Math.abs(x-N/2.0)*Math.abs(y-N/2.0)*Math.abs(z-N/2.0);
254
+ // f = Math.cos(x)+Math.cos(y)+Math.cos(z);
255
+ // sfield[x][y].push(f);
256
+ // }
257
+ // }
258
+ // }
259
+
260
+ // r._addIsosurface(sfield, 0.5, latt, 0x00ffff, 0.3, Renderer.PHONG, Renderer.ISO_SURFACE_NETS);
261
+
262
+ // r._addSprite(H1, 'circle.png', 1, 0xffffff);
263
+ //
264
+
265
+ // var vs = new CrystVis('.main-app-content', {'width': 640, 'height': 480});
266
+
267
+ });
268
+
269
+ // window.hide_arrows = function() {
270
+ // arrows.visible = !arrows.visible;
271
+ // }
272
+
273
+ // window.rescale_ellipsoids = function(e) {
274
+ // var s = parseFloat(e.target.value);
275
+
276
+ // _.forEach(ellipsoids, function(el) {
277
+ // el._rescale(s);
278
+ // });
279
+ // }
@@ -0,0 +1,120 @@
1
+ colortable = """1 H [255,255,255] FFFFFF FFFFFF
2
+ 2 He [217,255,255] D9FFFF FFC0CB
3
+ 3 Li [204,128,255] CC80FF B22222 B22121
4
+ 4 Be [194,255,0] C2FF00 FF1493
5
+ 5 B [255,181,181] FFB5B5 00FF00
6
+ 6 C [144,144,144] 909090 C8C8C8 D3D3D3
7
+ 7 N [48,80,248] 3050F8 8F8FFF 87CEE6
8
+ 8 O [255,13,13] FF0D0D F00000 FF0000
9
+ 9 F [144,224,80] 90E050 DAA520
10
+ 10 Ne [179,227,245] B3E3F5 FF1493
11
+ 11 Na [171,92,242] AB5CF2 0000FF
12
+ 12 Mg [138,255,0] 8AFF00 228B22
13
+ 13 Al [191,166,166] BFA6A6 808090 696969
14
+ 14 Si [240,200,160] F0C8A0 DAA520
15
+ 15 P [255,128,0] FF8000 FFA500 FFAA00
16
+ 16 S [255,255,48] FFFF30 FFC832 FFFF00
17
+ 17 Cl [31,240,31] 1FF01F 00FF00
18
+ 18 Ar [128,209,227] 80D1E3 FF1493
19
+ 19 K [143,64,212] 8F40D4 FF1493
20
+ 20 Ca [61,255,0] 3DFF00 808090 696969
21
+ 21 Sc [230,230,230] E6E6E6 FF1493
22
+ 22 Ti [191,194,199] BFC2C7 808090 696969
23
+ 23 V [166,166,171] A6A6AB FF1493
24
+ 24 Cr [138,153,199] 8A99C7 808090 696969
25
+ 25 Mn [156,122,199] 9C7AC7 808090 696969
26
+ 26 Fe [224,102,51] E06633 FFA500 FFAA00
27
+ 27 Co [240,144,160] F090A0 FF1493
28
+ 28 Ni [80,208,80] 50D050 A52A2A 802828
29
+ 29 Cu [200,128,51] C88033 A52A2A 802828
30
+ 30 Zn [125,128,176] 7D80B0 A52A2A 802828
31
+ 31 Ga [194,143,143] C28F8F FF1493
32
+ 32 Ge [102,143,143] 668F8F FF1493
33
+ 33 As [189,128,227] BD80E3 FF1493
34
+ 34 Se [255,161,0] FFA100 FF1493
35
+ 35 Br [166,41,41] A62929 A52A2A 802828
36
+ 36 Kr [92,184,209] 5CB8D1 FF1493
37
+ 37 Rb [112,46,176] 702EB0 FF1493
38
+ 38 Sr [0,255,0] 00FF00 FF1493
39
+ 39 Y [148,255,255] 94FFFF FF1493
40
+ 40 Zr [148,224,224] 94E0E0 FF1493
41
+ 41 Nb [115,194,201] 73C2C9 FF1493
42
+ 42 Mo [84,181,181] 54B5B5 FF1493
43
+ 43 Tc [59,158,158] 3B9E9E FF1493
44
+ 44 Ru [36,143,143] 248F8F FF1493
45
+ 45 Rh [10,125,140] 0A7D8C FF1493
46
+ 46 Pd [0,105,133] 006985 FF1493
47
+ 47 Ag [192,192,192] C0C0C0 808090 696969
48
+ 48 Cd [255,217,143] FFD98F FF1493
49
+ 49 In [166,117,115] A67573 FF1493
50
+ 50 Sn [102,128,128] 668080 FF1493
51
+ 51 Sb [158,99,181] 9E63B5 FF1493
52
+ 52 Te [212,122,0] D47A00 FF1493
53
+ 53 I [148,0,148] 940094 A020F0
54
+ 54 Xe [66,158,176] 429EB0 FF1493
55
+ 55 Cs [87,23,143] 57178F FF1493
56
+ 56 Ba [0,201,0] 00C900 FFA500 FFAA00
57
+ 57 La [112,212,255] 70D4FF FF1493
58
+ 58 Ce [255,255,199] FFFFC7 FF1493
59
+ 59 Pr [217,255,199] D9FFC7 FF1493
60
+ 60 Nd [199,255,199] C7FFC7 FF1493
61
+ 61 Pm [163,255,199] A3FFC7 FF1493
62
+ 62 Sm [143,255,199] 8FFFC7 FF1493
63
+ 63 Eu [97,255,199] 61FFC7 FF1493
64
+ 64 Gd [69,255,199] 45FFC7 FF1493
65
+ 65 Tb [48,255,199] 30FFC7 FF1493
66
+ 66 Dy [31,255,199] 1FFFC7 FF1493
67
+ 67 Ho [0,255,156] 00FF9C FF1493
68
+ 68 Er [0,230,117] 00E675 FF1493
69
+ 69 Tm [0,212,82] 00D452 FF1493
70
+ 70 Yb [0,191,56] 00BF38 FF1493
71
+ 71 Lu [0,171,36] 00AB24 FF1493
72
+ 72 Hf [77,194,255] 4DC2FF FF1493
73
+ 73 Ta [77,166,255] 4DA6FF FF1493
74
+ 74 W [33,148,214] 2194D6 FF1493
75
+ 75 Re [38,125,171] 267DAB FF1493
76
+ 76 Os [38,102,150] 266696 FF1493
77
+ 77 Ir [23,84,135] 175487 FF1493
78
+ 78 Pt [208,208,224] D0D0E0 FF1493
79
+ 79 Au [255,209,35] FFD123 DAA520
80
+ 80 Hg [184,184,208] B8B8D0 FF1493
81
+ 81 Tl [166,84,77] A6544D FF1493
82
+ 82 Pb [87,89,97] 575961 FF1493
83
+ 83 Bi [158,79,181] 9E4FB5 FF1493
84
+ 84 Po [171,92,0] AB5C00 FF1493
85
+ 85 At [117,79,69] 754F45 FF1493
86
+ 86 Rn [66,130,150] 428296 FF1493
87
+ 87 Fr [66,0,102] 420066 FF1493
88
+ 88 Ra [0,125,0] 007D00 FF1493
89
+ 89 Ac [112,171,250] 70ABFA FF1493
90
+ 90 Th [0,186,255] 00BAFF FF1493
91
+ 91 Pa [0,161,255] 00A1FF FF1493
92
+ 92 U [0,143,255] 008FFF FF1493
93
+ 93 Np [0,128,255] 0080FF FF1493
94
+ 94 Pu [0,107,255] 006BFF FF1493
95
+ 95 Am [84,92,242] 545CF2 FF1493
96
+ 96 Cm [120,92,227] 785CE3 FF1493
97
+ 97 Bk [138,79,227] 8A4FE3 FF1493
98
+ 98 Cf [161,54,212] A136D4 FF1493
99
+ 99 Es [179,31,212] B31FD4 FF1493
100
+ 100 Fm [179,31,186] B31FBA FF1493
101
+ 101 Md [179,13,166] B30DA6 FF1493
102
+ 102 No [189,13,135] BD0D87 FF1493
103
+ 103 Lr [199,0,102] C70066 FF1493
104
+ 104 Rf [204,0,89] CC0059 FF1493
105
+ 105 Db [209,0,79] D1004F FF1493
106
+ 106 Sg [217,0,69] D90045 FF1493
107
+ 107 Bh [224,0,56] E00038 FF1493
108
+ 108 Hs [230,0,46] E6002E FF1493
109
+ 109 Mt [235,0,38] EB0026 FF1493 """
110
+
111
+ lines = colortable.split('\n')
112
+ colors = ['0xff1493']*110
113
+
114
+ for l in lines:
115
+ l = l.strip().split()
116
+ Z = int(l[0])
117
+ c = l[3]
118
+ colors[Z] = '0x'+c.lower()
119
+
120
+ print('[' + ', '.join(colors) + ']')
@@ -0,0 +1,96 @@
1
+ import json
2
+ from periodictable import elements
3
+ from soprano.data.nmr import _nmr_data
4
+
5
+ element_data = {};
6
+
7
+ for el in elements:
8
+ sym = el.symbol
9
+ Z = el.number
10
+
11
+ if sym == 'n':
12
+ # No use for neutrons; instead we use Muonium
13
+ sym = 'Mu'
14
+
15
+ data = {
16
+ 'symbol': sym,
17
+ 'Z': Z,
18
+ 'isotopes': {}
19
+ }
20
+
21
+ # Most abundant isotopes?
22
+ most_iso = None
23
+ most_iso_ab = 0
24
+
25
+ most_NMR_iso = None
26
+ most_NMR_iso_ab = 0
27
+
28
+ most_Q_iso = None
29
+ most_Q_iso_ab = 0
30
+
31
+ nmr = _nmr_data.get(sym, {})
32
+
33
+ for iso in el:
34
+
35
+ mass = iso.mass
36
+ if sym == 'Mu':
37
+ mass = 0.113428913072988
38
+ A = iso.isotope
39
+ ab = iso.abundance
40
+
41
+ if ab == 0: # Does not exist in nature, irrelevant
42
+ continue
43
+
44
+ iso_nmr = nmr.get(str(A), {})
45
+ spin = iso_nmr.get('I', None)
46
+ gamma = iso_nmr.get('gamma', None)
47
+ Q = iso_nmr.get('Q', None)
48
+
49
+ # We completely skip including anything that has no spin data, and
50
+ # is LESS abundant than any NMR-active isotope
51
+
52
+ if spin is None:
53
+ if ab < min(most_NMR_iso_ab, most_Q_iso_ab):
54
+ continue
55
+ else:
56
+ spin = 0 # A safe assumption
57
+
58
+ if ab > most_iso_ab:
59
+ most_iso = A
60
+ most_iso_ab = ab
61
+
62
+ if ab > most_NMR_iso_ab and spin:
63
+ most_NMR_iso = A
64
+ most_NMR_iso_ab = ab
65
+
66
+ if ab > most_Q_iso_ab and Q:
67
+ most_Q_iso = A
68
+ most_Q_iso_ab = ab
69
+
70
+ data['isotopes'][A] = {
71
+ 'A': A,
72
+ 'mass': mass,
73
+ 'abundance': ab,
74
+ 'spin': spin,
75
+ 'gamma': gamma,
76
+ 'Q': Q
77
+ }
78
+
79
+ if most_iso is None:
80
+ # No useful information...
81
+ continue
82
+
83
+ data['maxiso'] = str(most_iso) if most_iso else None
84
+ data['maxiso_NMR'] = str(most_NMR_iso) if most_NMR_iso else None
85
+ data['maxiso_Q'] = str(most_Q_iso) if most_Q_iso else None
86
+
87
+ element_data[sym] = data
88
+
89
+ jsonstr = json.dumps(element_data, indent=2)
90
+
91
+ template = """const nmrData = {0};
92
+
93
+ export default nmrData;
94
+ """
95
+
96
+ print(template.format(jsonstr))