@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.
- package/.eslintrc.json +16 -0
- package/.github/workflows/test-mocha.yml +30 -0
- package/.vscode/settings.json +4 -0
- package/LICENSE +21 -0
- package/README.html +1127 -0
- package/README.md +76 -0
- package/demo/demo.css +30 -0
- package/demo/index.html +76 -0
- package/demo/main.js +143 -0
- package/docs/.nojekyll +0 -0
- package/docs-tutorials/Events.md +57 -0
- package/docs-tutorials/Queries.md +50 -0
- package/fonts/Rubik/OFL.txt +93 -0
- package/fonts/Rubik/README.txt +77 -0
- package/fonts/Rubik/Rubik-Italic-VariableFont_wght.ttf +0 -0
- package/fonts/Rubik/Rubik-VariableFont_wght.ttf +0 -0
- package/fonts/Rubik/static/Rubik-Black.ttf +0 -0
- package/fonts/Rubik/static/Rubik-BlackItalic.ttf +0 -0
- package/fonts/Rubik/static/Rubik-Bold.ttf +0 -0
- package/fonts/Rubik/static/Rubik-BoldItalic.ttf +0 -0
- package/fonts/Rubik/static/Rubik-ExtraBold.ttf +0 -0
- package/fonts/Rubik/static/Rubik-ExtraBoldItalic.ttf +0 -0
- package/fonts/Rubik/static/Rubik-Italic.ttf +0 -0
- package/fonts/Rubik/static/Rubik-Light.ttf +0 -0
- package/fonts/Rubik/static/Rubik-LightItalic.ttf +0 -0
- package/fonts/Rubik/static/Rubik-Medium.ttf +0 -0
- package/fonts/Rubik/static/Rubik-MediumItalic.ttf +0 -0
- package/fonts/Rubik/static/Rubik-Regular.ttf +0 -0
- package/fonts/Rubik/static/Rubik-SemiBold.ttf +0 -0
- package/fonts/Rubik/static/Rubik-SemiBoldItalic.ttf +0 -0
- package/index.html +25 -0
- package/index.js +11 -0
- package/jsconf.json +14 -0
- package/lib/assets/fonts/Rubik-Medium.fnt +297 -0
- package/lib/assets/fonts/Rubik-Medium.png +0 -0
- package/lib/assets/fonts/bmpfonts.in.js +16 -0
- package/lib/assets/fonts/bmpfonts.js +9 -0
- package/lib/assets/fonts/font.js +82 -0
- package/lib/assets/fonts/index.js +14 -0
- package/lib/assets/fonts/threebmfont.js +28 -0
- package/lib/data.js +125 -0
- package/lib/formats/cell.js +114 -0
- package/lib/formats/cif.js +22 -0
- package/lib/formats/magres.js +337 -0
- package/lib/formats/xyz.js +124 -0
- package/lib/loader.js +87 -0
- package/lib/model.js +2076 -0
- package/lib/modelview.js +382 -0
- package/lib/nmrdata.js +2898 -0
- package/lib/orbit.js +1233 -0
- package/lib/primitives/atoms.js +261 -0
- package/lib/primitives/cell.js +160 -0
- package/lib/primitives/dither.js +156 -0
- package/lib/primitives/ellipsoid.js +183 -0
- package/lib/primitives/geometries.js +20 -0
- package/lib/primitives/index.js +48 -0
- package/lib/primitives/isosurface.js +171 -0
- package/lib/primitives/shapes.js +100 -0
- package/lib/primitives/sprites.js +172 -0
- package/lib/query.js +158 -0
- package/lib/render.js +440 -0
- package/lib/selbox.js +361 -0
- package/lib/shaders/aura.frag +26 -0
- package/lib/shaders/aura.vert +37 -0
- package/lib/shaders/dither.frag +42 -0
- package/lib/shaders/dither.vert +8 -0
- package/lib/shaders/index.in.js +17 -0
- package/lib/shaders/index.js +25 -0
- package/lib/shaders/msdf300.frag +25 -0
- package/lib/shaders/msdf300.vert +45 -0
- package/lib/tensor.js +227 -0
- package/lib/utils.js +168 -0
- package/lib/visualizer.js +480 -0
- package/package.json +106 -0
- package/scripts/build-bundle.js +17 -0
- package/scripts/build-fonts.js +43 -0
- package/scripts/build-resources.js +46 -0
- package/scripts/plugins-shim.js +10 -0
- package/test/chemdata.js +69 -0
- package/test/data/CHA.cif +74 -0
- package/test/data/H2O.xyz +8 -0
- package/test/data/H2_bound.xyz +4 -0
- package/test/data/ethanol.cell +25 -0
- package/test/data/ethanol.magres +238 -0
- package/test/data/example_single.cif +789 -0
- package/test/data/frac.cell +8 -0
- package/test/data/org.cif +427 -0
- package/test/data/pyridine.xyz +13 -0
- package/test/data/si8.xyz +10 -0
- package/test/loader.js +107 -0
- package/test/model.js +368 -0
- package/test/query.js +135 -0
- package/test/tensor.js +133 -0
- package/test/test-html/examples.js +1485 -0
- package/test/test-html/index.html +33 -0
- package/test/test-html/index.js +279 -0
- package/tools/compile_colors.py +120 -0
- package/tools/compile_periodic.py +96 -0
- package/tools/ptable.json +497 -0
- 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))
|