@complat/react-spectra-editor 0.11.3 → 0.11.4-beta.0
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/dist/components/d3_line/line_focus_bk.js +860 -0
- package/dist/components/d3_multi/index_bk.js +240 -0
- package/dist/components/d3_multi/multi_focus_bk.js +550 -0
- package/dist/components/panel/compare_bk.js +370 -0
- package/dist/components/panel/info_bk.js +341 -0
- package/dist/components/panel/multiplicity_bk.js +405 -0
- package/dist/helpers/chem_bk.js +779 -0
- package/dist/helpers/converter_bk.js +106 -0
- package/dist/helpers/format_bk.js +462 -0
- package/dist/index_bk.js +760 -0
- package/dist/layer_content_bk.js +128 -0
- package/dist/layer_prism_bk.js +186 -0
- package/dist/reducers/reducer_edit_peak_bk.js +111 -0
- package/dist/reducers/reducer_integration_bk.js +137 -0
- package/dist/reducers/reducer_jcamp_bk.js +74 -0
- package/dist/reducers/reducer_multiplicity_bk.js +131 -0
- package/dist/reducers/reducer_shift_bk.js +99 -0
- package/dist/sagas/saga_edit_peak_bk.js +84 -0
- package/dist/sagas/saga_multiplicity_bk.js +387 -0
- package/dist/sagas/saga_ui_bk.js +488 -0
- package/package.json +3 -2
|
@@ -0,0 +1,779 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Convert2MaxMinPeak = exports.convertTopic = exports.Feature2MaxMinPeak = exports.GetCyclicVoltaPeakSeparate = exports.GetCyclicVoltaRatio = exports.Convert2DValue = exports.GetComparisons = exports.Convert2Thres = exports.Convert2Scan = exports.Convert2Peak = exports.ToFrequency = exports.ToShiftPeaks = exports.ToThresEndPts = exports.Feature2Peak = exports.Topic2Seed = exports.ExtractJcamp = undefined;
|
|
7
|
+
|
|
8
|
+
var _jcampconverter = require('jcampconverter');
|
|
9
|
+
|
|
10
|
+
var _jcampconverter2 = _interopRequireDefault(_jcampconverter);
|
|
11
|
+
|
|
12
|
+
var _reselect = require('reselect');
|
|
13
|
+
|
|
14
|
+
var _shift = require('./shift');
|
|
15
|
+
|
|
16
|
+
var _cfg = require('./cfg');
|
|
17
|
+
|
|
18
|
+
var _cfg2 = _interopRequireDefault(_cfg);
|
|
19
|
+
|
|
20
|
+
var _format = require('./format');
|
|
21
|
+
|
|
22
|
+
var _format2 = _interopRequireDefault(_format);
|
|
23
|
+
|
|
24
|
+
var _list_layout = require('../constants/list_layout');
|
|
25
|
+
|
|
26
|
+
var _integration = require('./integration');
|
|
27
|
+
|
|
28
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
29
|
+
|
|
30
|
+
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
31
|
+
|
|
32
|
+
var getTopic = function getTopic(_, props) {
|
|
33
|
+
return props.topic;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
var getFeature = function getFeature(_, props) {
|
|
37
|
+
return props.feature;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
var getLayout = function getLayout(state, _) {
|
|
41
|
+
return state.layout;
|
|
42
|
+
}; // eslint-disable-line
|
|
43
|
+
|
|
44
|
+
var getShiftOffset = function getShiftOffset(state, _) {
|
|
45
|
+
// eslint-disable-line
|
|
46
|
+
var shift = state.shift;
|
|
47
|
+
var ref = shift.ref,
|
|
48
|
+
peak = shift.peak;
|
|
49
|
+
|
|
50
|
+
return (0, _shift.FromManualToOffset)(ref, peak);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
var calcXYK = function calcXYK(xs, ys, maxY, offset) {
|
|
54
|
+
var sp = [];
|
|
55
|
+
var k = 0;
|
|
56
|
+
for (var i = 0; i < ys.length; i += 1) {
|
|
57
|
+
// no-downsample
|
|
58
|
+
var x = xs[i] - offset;
|
|
59
|
+
var y = ys[i];
|
|
60
|
+
var cy = y / maxY;
|
|
61
|
+
if (cy > 0.0) {
|
|
62
|
+
k += cy;
|
|
63
|
+
}
|
|
64
|
+
sp.push({ x: x, y: y, k: k });
|
|
65
|
+
}
|
|
66
|
+
return sp;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
var calcXY = function calcXY(xs, ys, maxY, offset) {
|
|
70
|
+
var sp = [];
|
|
71
|
+
for (var i = 0; i < ys.length; i += 1) {
|
|
72
|
+
// no-downsample
|
|
73
|
+
var x = xs[i] - offset;
|
|
74
|
+
var y = ys[i];
|
|
75
|
+
sp.push({ x: x, y: y });
|
|
76
|
+
}
|
|
77
|
+
return sp;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
var convertTopic = function convertTopic(topic, layout, feature, offset) {
|
|
81
|
+
var maxY = feature.maxY;
|
|
82
|
+
|
|
83
|
+
var xs = topic.x;
|
|
84
|
+
var ys = topic.y;
|
|
85
|
+
|
|
86
|
+
var isItgDisable = _cfg2.default.btnCmdIntg(layout);
|
|
87
|
+
if (!isItgDisable) return calcXYK(xs, ys, maxY, offset);
|
|
88
|
+
return calcXY(xs, ys, maxY, offset);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
var Topic2Seed = (0, _reselect.createSelector)(getTopic, getLayout, getFeature, getShiftOffset, convertTopic);
|
|
92
|
+
|
|
93
|
+
var getOthers = function getOthers(_, props) {
|
|
94
|
+
return props.comparisons;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
var calcRescaleXY = function calcRescaleXY(xs, ys, minY, maxY, show) {
|
|
98
|
+
var sp = [];
|
|
99
|
+
if (xs.length < 1) return sp;
|
|
100
|
+
var _ref = [Math.min.apply(Math, _toConsumableArray(ys)), Math.max.apply(Math, _toConsumableArray(ys))],
|
|
101
|
+
lowerY = _ref[0],
|
|
102
|
+
upperY = _ref[1];
|
|
103
|
+
|
|
104
|
+
var faktor = (maxY - minY) / (upperY - lowerY);
|
|
105
|
+
for (var i = 0; i < ys.length; i += 2) {
|
|
106
|
+
// downsample
|
|
107
|
+
var x = xs[i];
|
|
108
|
+
var y = (ys[i] - lowerY) * faktor + minY;
|
|
109
|
+
sp.push({ x: x, y: y });
|
|
110
|
+
}
|
|
111
|
+
return { data: sp, show: show };
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
var convertComparisons = function convertComparisons(layout, comparisons, feature) {
|
|
115
|
+
var minY = feature.minY,
|
|
116
|
+
maxY = feature.maxY;
|
|
117
|
+
|
|
118
|
+
if (!comparisons || !(_format2.default.isIrLayout(layout) || _format2.default.isHplcUvVisLayout(layout) || _format2.default.isXRDLayout(layout))) return [];
|
|
119
|
+
return comparisons.map(function (c) {
|
|
120
|
+
var spectra = c.spectra,
|
|
121
|
+
show = c.show;
|
|
122
|
+
|
|
123
|
+
var topic = spectra[0].data[0];
|
|
124
|
+
var xs = topic.x;
|
|
125
|
+
var ys = topic.y;
|
|
126
|
+
return calcRescaleXY(xs, ys, minY, maxY, show);
|
|
127
|
+
});
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
var GetComparisons = (0, _reselect.createSelector)(getLayout, getOthers, getFeature, convertComparisons);
|
|
131
|
+
|
|
132
|
+
var convertFrequency = function convertFrequency(layout, feature) {
|
|
133
|
+
if (['1H', '13C', '19F', '31P', '15N', '29Si'].indexOf(layout) < 0) return false;
|
|
134
|
+
var observeFrequency = feature.observeFrequency;
|
|
135
|
+
|
|
136
|
+
var freq = Array.isArray(observeFrequency) ? observeFrequency[0] : observeFrequency;
|
|
137
|
+
return parseFloat(freq) || false;
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
var ToFrequency = (0, _reselect.createSelector)(getLayout, getFeature, convertFrequency);
|
|
141
|
+
|
|
142
|
+
var getThreshold = function getThreshold(state) {
|
|
143
|
+
return state.threshold ? state.threshold.value * 1.0 : false;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
var Convert2Peak = function Convert2Peak(feature, threshold, offset) {
|
|
147
|
+
var upThreshold = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
148
|
+
var lowThreshold = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
|
|
149
|
+
|
|
150
|
+
var peak = [];
|
|
151
|
+
if (!feature || !feature.data) return peak;
|
|
152
|
+
var data = feature.data[0];
|
|
153
|
+
var maxY = feature.maxY,
|
|
154
|
+
peakUp = feature.peakUp,
|
|
155
|
+
thresRef = feature.thresRef,
|
|
156
|
+
minY = feature.minY,
|
|
157
|
+
upperThres = feature.upperThres,
|
|
158
|
+
lowerThres = feature.lowerThres;
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
if (upperThres || lowerThres) {
|
|
162
|
+
var upperThresVal = upThreshold || upperThres;
|
|
163
|
+
if (!upperThresVal) {
|
|
164
|
+
upperThresVal = 1.0;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
var lowerThresVal = lowThreshold || lowerThres;
|
|
168
|
+
if (!lowerThresVal) {
|
|
169
|
+
lowerThresVal = 1.0;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
var yUpperThres = parseFloat(upperThresVal) / 100.0 * maxY;
|
|
173
|
+
var yLowerThres = parseFloat(lowerThresVal) / 100.0 * minY;
|
|
174
|
+
|
|
175
|
+
var corrOffset = offset || 0.0;
|
|
176
|
+
for (var i = 0; i < data.y.length; i += 1) {
|
|
177
|
+
var y = data.y[i];
|
|
178
|
+
var overUpperThres = y >= yUpperThres;
|
|
179
|
+
var belowThres = y <= yLowerThres;
|
|
180
|
+
if (overUpperThres || belowThres) {
|
|
181
|
+
var x = data.x[i] - corrOffset;
|
|
182
|
+
peak.push({ x: x, y: y });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return peak;
|
|
186
|
+
} else {
|
|
187
|
+
var thresVal = threshold || thresRef;
|
|
188
|
+
var yThres = thresVal * maxY / 100.0;
|
|
189
|
+
var _corrOffset = offset || 0.0;
|
|
190
|
+
for (var _i = 0; _i < data.y.length; _i += 1) {
|
|
191
|
+
var _y = data.y[_i];
|
|
192
|
+
var overThres = peakUp && Math.abs(_y) >= yThres || !peakUp && Math.abs(_y) <= yThres;
|
|
193
|
+
if (overThres) {
|
|
194
|
+
var _x3 = data.x[_i] - _corrOffset;
|
|
195
|
+
peak.push({ x: _x3, y: _y });
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return peak;
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
var Feature2Peak = (0, _reselect.createSelector)(getFeature, getThreshold, getShiftOffset, Convert2Peak);
|
|
203
|
+
|
|
204
|
+
var Convert2MaxMinPeak = function Convert2MaxMinPeak(layout, feature, offset) {
|
|
205
|
+
var peaks = { max: [], min: [], pecker: [] };
|
|
206
|
+
if (!_format2.default.isCyclicVoltaLayout(layout) || !feature || !feature.data) return null;
|
|
207
|
+
var data = feature.data[0];
|
|
208
|
+
var maxY = feature.maxY,
|
|
209
|
+
minY = feature.minY,
|
|
210
|
+
upperThres = feature.upperThres,
|
|
211
|
+
lowerThres = feature.lowerThres,
|
|
212
|
+
volammetryData = feature.volammetryData;
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
if (volammetryData && volammetryData.length > 0) {
|
|
216
|
+
var maxArr = volammetryData.map(function (peakData) {
|
|
217
|
+
if (peakData.max.x === '') return null;
|
|
218
|
+
return { x: Number(peakData.max.x), y: Number(peakData.max.y) };
|
|
219
|
+
});
|
|
220
|
+
var minArr = volammetryData.map(function (peakData) {
|
|
221
|
+
if (peakData.min.x === '') return null;
|
|
222
|
+
return { x: Number(peakData.min.x), y: Number(peakData.min.y) };
|
|
223
|
+
});
|
|
224
|
+
var peckerArr = volammetryData.map(function (peakData) {
|
|
225
|
+
if (peakData.pecker.x === '') return null;
|
|
226
|
+
return { x: Number(peakData.pecker.x), y: Number(peakData.pecker.y) };
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
peaks.max = maxArr;
|
|
230
|
+
peaks.min = minArr;
|
|
231
|
+
peaks.pecker = peckerArr;
|
|
232
|
+
return peaks;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
var upperThresVal = upperThres;
|
|
236
|
+
if (!upperThresVal) {
|
|
237
|
+
upperThresVal = 1.0;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
var lowerThresVal = lowerThres;
|
|
241
|
+
if (!lowerThresVal) {
|
|
242
|
+
lowerThresVal = 1.0;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
var yUpperThres = parseFloat(upperThresVal) / 100.0 * maxY;
|
|
246
|
+
var yLowerThres = parseFloat(lowerThresVal) / 100.0 * minY;
|
|
247
|
+
|
|
248
|
+
var corrOffset = offset || 0.0;
|
|
249
|
+
for (var i = 0; i < data.y.length; i += 1) {
|
|
250
|
+
var y = data.y[i];
|
|
251
|
+
var overUpperThres = y >= yUpperThres;
|
|
252
|
+
var belowThres = y <= yLowerThres;
|
|
253
|
+
var x = data.x[i] - corrOffset;
|
|
254
|
+
if (overUpperThres) {
|
|
255
|
+
peaks.max.push({ x: x, y: y });
|
|
256
|
+
} else if (belowThres) {
|
|
257
|
+
peaks.min.push({ x: x, y: y });
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return peaks;
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
var Feature2MaxMinPeak = (0, _reselect.createSelector)(getLayout, getFeature, getShiftOffset, Convert2MaxMinPeak);
|
|
264
|
+
|
|
265
|
+
var convertThresEndPts = function convertThresEndPts(feature, threshold) {
|
|
266
|
+
var maxY = feature.maxY,
|
|
267
|
+
maxX = feature.maxX,
|
|
268
|
+
minX = feature.minX,
|
|
269
|
+
thresRef = feature.thresRef;
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
var thresVal = threshold || thresRef || 0;
|
|
273
|
+
if (!thresVal || !feature.data) return [];
|
|
274
|
+
var yThres = thresVal * maxY / 100.0;
|
|
275
|
+
var endPts = [{ x: minX - 200, y: yThres }, { x: maxX + 200, y: yThres }];
|
|
276
|
+
return endPts;
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
var ToThresEndPts = (0, _reselect.createSelector)(getFeature, getThreshold, convertThresEndPts);
|
|
280
|
+
|
|
281
|
+
var getShiftPeak = function getShiftPeak(state) {
|
|
282
|
+
return state.shift.peak;
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
var convertSfPeaks = function convertSfPeaks(peak, offset) {
|
|
286
|
+
if (!peak || !peak.x) return [];
|
|
287
|
+
return [{ x: peak.x - offset, y: peak.y }];
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
var ToShiftPeaks = (0, _reselect.createSelector)(getShiftPeak, getShiftOffset, convertSfPeaks);
|
|
291
|
+
|
|
292
|
+
// - - - - - - - - - - - - - - - - - - - - - -
|
|
293
|
+
// ExtractJcamp
|
|
294
|
+
// - - - - - - - - - - - - - - - - - - - - - -
|
|
295
|
+
var readLayout = function readLayout(jcamp) {
|
|
296
|
+
var xType = jcamp.xType,
|
|
297
|
+
spectra = jcamp.spectra;
|
|
298
|
+
|
|
299
|
+
if (xType && _format2.default.isNmrLayout(xType)) return xType;
|
|
300
|
+
var dataType = spectra[0].dataType;
|
|
301
|
+
|
|
302
|
+
if (dataType) {
|
|
303
|
+
if (dataType.includes('INFRARED SPECTRUM')) {
|
|
304
|
+
return _list_layout.LIST_LAYOUT.IR;
|
|
305
|
+
}
|
|
306
|
+
if (dataType.includes('RAMAN SPECTRUM')) {
|
|
307
|
+
return _list_layout.LIST_LAYOUT.RAMAN;
|
|
308
|
+
}
|
|
309
|
+
if (dataType.includes('UV/VIS SPECTRUM')) {
|
|
310
|
+
if (dataType.includes('HPLC')) {
|
|
311
|
+
return _list_layout.LIST_LAYOUT.HPLC_UVVIS;
|
|
312
|
+
}
|
|
313
|
+
return _list_layout.LIST_LAYOUT.UVVIS;
|
|
314
|
+
}
|
|
315
|
+
if (dataType.includes('THERMOGRAVIMETRIC ANALYSIS')) {
|
|
316
|
+
return _list_layout.LIST_LAYOUT.TGA;
|
|
317
|
+
}
|
|
318
|
+
if (dataType.includes('X-RAY DIFFRACTION')) {
|
|
319
|
+
return _list_layout.LIST_LAYOUT.XRD;
|
|
320
|
+
}
|
|
321
|
+
if (dataType.includes('MASS SPECTRUM')) {
|
|
322
|
+
return _list_layout.LIST_LAYOUT.MS;
|
|
323
|
+
}
|
|
324
|
+
if (dataType.includes('CYCLIC VOLTAMMETRY')) {
|
|
325
|
+
return _list_layout.LIST_LAYOUT.CYCLIC_VOLTAMMETRY;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return false;
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
var extrSpectraShare = function extrSpectraShare(spectra, layout) {
|
|
332
|
+
return spectra.map(function (s) {
|
|
333
|
+
return Object.assign({ layout: layout }, s);
|
|
334
|
+
}).filter(function (r) {
|
|
335
|
+
return r != null;
|
|
336
|
+
});
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
var extrSpectraMs = function extrSpectraMs(jcamp, layout) {
|
|
340
|
+
var scanCount = jcamp.info.$CSSCANCOUNT || 1;
|
|
341
|
+
var spc = extrSpectraShare(jcamp.spectra.slice(0, scanCount), layout);
|
|
342
|
+
return spc || [];
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
var extrSpectraNi = function extrSpectraNi(jcamp, layout) {
|
|
346
|
+
var categorys = jcamp.info.$CSCATEGORY || ['SPECTRUM'];
|
|
347
|
+
var targetIdx = categorys.indexOf('SPECTRUM');
|
|
348
|
+
var spectrum = extrSpectraShare(jcamp.spectra, layout)[targetIdx];
|
|
349
|
+
return [spectrum] || [jcamp.spectra[0]];
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
var calcThresRef = function calcThresRef(s, peakUp) {
|
|
353
|
+
var ys = s && s.data[0].y;
|
|
354
|
+
if (!ys) return null;
|
|
355
|
+
var ref = peakUp ? Math.min.apply(Math, _toConsumableArray(ys.map(function (a) {
|
|
356
|
+
return Math.abs(a);
|
|
357
|
+
}))) : Math.max.apply(Math, _toConsumableArray(ys));
|
|
358
|
+
return peakUp ? Math.floor(ref * 100 * 100 / s.maxY) / 100 : Math.ceil(ref * 100 * 100 / s.maxY) / 100;
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
var calcUpperThres = function calcUpperThres(s) {
|
|
362
|
+
var ys = s && s.data[0].y;
|
|
363
|
+
if (!ys) return null;
|
|
364
|
+
var ref = Math.max.apply(Math, _toConsumableArray(ys));
|
|
365
|
+
return Math.floor(ref * 100 * 100 / s.maxY) / 100;
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
var calcLowerThres = function calcLowerThres(s) {
|
|
369
|
+
var ys = s && s.data[0].y;
|
|
370
|
+
if (!ys) return null;
|
|
371
|
+
var ref = Math.min.apply(Math, _toConsumableArray(ys));
|
|
372
|
+
return Math.ceil(ref * 100 * 100 / s.minY) / 100;
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
var extractShift = function extractShift(s, jcamp) {
|
|
376
|
+
var shift = {
|
|
377
|
+
selectX: false,
|
|
378
|
+
solventName: false,
|
|
379
|
+
solventValue: false
|
|
380
|
+
};
|
|
381
|
+
if (!s) return shift;
|
|
382
|
+
if (s && s.sampleDescription) {
|
|
383
|
+
var desc = s.sampleDescription;
|
|
384
|
+
var info = desc.split(/;|=/);
|
|
385
|
+
|
|
386
|
+
return {
|
|
387
|
+
selectX: parseFloat(info[1]),
|
|
388
|
+
solventName: info[3],
|
|
389
|
+
solventValue: parseFloat(info[5])
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
return {
|
|
393
|
+
selectX: parseFloat(jcamp.info.$CSSOLVENTX) || false,
|
|
394
|
+
solventName: jcamp.info.$CSSOLVENTNAME || false,
|
|
395
|
+
solventValue: parseFloat(jcamp.info.$CSSOLVENTVALUE) || false
|
|
396
|
+
};
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
var extractVoltammetryData = function extractVoltammetryData(jcamp) {
|
|
400
|
+
var info = jcamp.info;
|
|
401
|
+
|
|
402
|
+
if (!info.$CSCYCLICVOLTAMMETRYDATA) return null;
|
|
403
|
+
var regx = /[^0-9.,E,e,-]/g;
|
|
404
|
+
var rawData = info.$CSCYCLICVOLTAMMETRYDATA.split('\n');
|
|
405
|
+
var peakStack = rawData.map(function (line) {
|
|
406
|
+
var splittedLine = line.replace(regx, '').split(',');
|
|
407
|
+
return {
|
|
408
|
+
max: { x: splittedLine[0], y: splittedLine[1] },
|
|
409
|
+
min: { x: splittedLine[2], y: splittedLine[3] },
|
|
410
|
+
ratio: splittedLine[4],
|
|
411
|
+
delta: splittedLine[5],
|
|
412
|
+
pecker: { x: splittedLine[6], y: splittedLine[7] }
|
|
413
|
+
};
|
|
414
|
+
});
|
|
415
|
+
return peakStack;
|
|
416
|
+
};
|
|
417
|
+
|
|
418
|
+
var buildPeakFeature = function buildPeakFeature(jcamp, layout, peakUp, s, thresRef) {
|
|
419
|
+
var upperThres = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
|
|
420
|
+
var lowerThres = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false;
|
|
421
|
+
var xType = jcamp.xType,
|
|
422
|
+
info = jcamp.info;
|
|
423
|
+
|
|
424
|
+
var subTyp = xType ? ' - ' + xType : '';
|
|
425
|
+
|
|
426
|
+
return Object.assign({
|
|
427
|
+
typ: s.dataType + subTyp,
|
|
428
|
+
peakUp: peakUp,
|
|
429
|
+
thresRef: thresRef,
|
|
430
|
+
scanCount: +info.$CSSCANCOUNT,
|
|
431
|
+
scanAutoTarget: +info.$CSSCANAUTOTARGET,
|
|
432
|
+
scanEditTarget: +info.$CSSCANEDITTARGET,
|
|
433
|
+
shift: extractShift(s, jcamp),
|
|
434
|
+
operation: {
|
|
435
|
+
layout: layout,
|
|
436
|
+
nucleus: xType || ''
|
|
437
|
+
},
|
|
438
|
+
observeFrequency: info['.OBSERVEFREQUENCY'],
|
|
439
|
+
solventName: info['.SOLVENTNAME'],
|
|
440
|
+
upperThres: upperThres,
|
|
441
|
+
lowerThres: lowerThres,
|
|
442
|
+
volammetryData: extractVoltammetryData(jcamp)
|
|
443
|
+
}, s);
|
|
444
|
+
};
|
|
445
|
+
|
|
446
|
+
var calcIntgRefArea = function calcIntgRefArea(spectra, stack) {
|
|
447
|
+
if (stack.length === 0) return 1;
|
|
448
|
+
var data = spectra[0].data[0];
|
|
449
|
+
|
|
450
|
+
var xs = data.x;
|
|
451
|
+
var ys = data.y;
|
|
452
|
+
var maxY = maxArray(ys);
|
|
453
|
+
|
|
454
|
+
var xyk = calcXYK(xs, ys, maxY, 0);
|
|
455
|
+
var _stack$ = stack[0],
|
|
456
|
+
xL = _stack$.xL,
|
|
457
|
+
xU = _stack$.xU,
|
|
458
|
+
area = _stack$.area;
|
|
459
|
+
|
|
460
|
+
var rawArea = (0, _integration.getArea)(xL, xU, xyk);
|
|
461
|
+
var raw2realRatio = rawArea / area;
|
|
462
|
+
return { raw2realRatio: raw2realRatio };
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
var maxArray = function maxArray(arr) {
|
|
466
|
+
var len = arr.length;
|
|
467
|
+
var max = -Infinity;
|
|
468
|
+
|
|
469
|
+
while (len--) {
|
|
470
|
+
max = arr[len] > max ? arr[len] : max;
|
|
471
|
+
}
|
|
472
|
+
return max;
|
|
473
|
+
};
|
|
474
|
+
|
|
475
|
+
var buildIntegFeature = function buildIntegFeature(jcamp, spectra) {
|
|
476
|
+
var _jcamp$info = jcamp.info,
|
|
477
|
+
$OBSERVEDINTEGRALS = _jcamp$info.$OBSERVEDINTEGRALS,
|
|
478
|
+
$OBSERVEDMULTIPLETS = _jcamp$info.$OBSERVEDMULTIPLETS;
|
|
479
|
+
|
|
480
|
+
var regx = /[^0-9.,-]/g;
|
|
481
|
+
var stack = [];
|
|
482
|
+
if ($OBSERVEDINTEGRALS) {
|
|
483
|
+
var its = $OBSERVEDINTEGRALS.split('\n').slice(1);
|
|
484
|
+
var itStack = its.map(function (t) {
|
|
485
|
+
var ts = t.replace(regx, '').split(',');
|
|
486
|
+
return {
|
|
487
|
+
xL: parseFloat(ts[0]),
|
|
488
|
+
xU: parseFloat(ts[1]),
|
|
489
|
+
area: parseFloat(ts[2]),
|
|
490
|
+
absoluteArea: parseFloat(ts[3])
|
|
491
|
+
};
|
|
492
|
+
});
|
|
493
|
+
stack = [].concat(_toConsumableArray(stack), _toConsumableArray(itStack));
|
|
494
|
+
}
|
|
495
|
+
if ($OBSERVEDMULTIPLETS) {
|
|
496
|
+
var mps = $OBSERVEDMULTIPLETS.split('\n');
|
|
497
|
+
var mpStack = mps.map(function (m) {
|
|
498
|
+
var ms = m.replace(regx, '').split(',');
|
|
499
|
+
return {
|
|
500
|
+
xL: parseFloat(ms[1]),
|
|
501
|
+
xU: parseFloat(ms[2]),
|
|
502
|
+
area: parseFloat(ms[4])
|
|
503
|
+
};
|
|
504
|
+
});
|
|
505
|
+
stack = [].concat(_toConsumableArray(stack), _toConsumableArray(mpStack));
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
var _calcIntgRefArea = calcIntgRefArea(spectra, stack),
|
|
509
|
+
raw2realRatio = _calcIntgRefArea.raw2realRatio;
|
|
510
|
+
|
|
511
|
+
var mStack = stack.map(function (st) {
|
|
512
|
+
return Object.assign({}, st, { area: st.area * raw2realRatio });
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
return {
|
|
516
|
+
refArea: raw2realRatio,
|
|
517
|
+
refFactor: 1,
|
|
518
|
+
shift: 0,
|
|
519
|
+
stack: mStack,
|
|
520
|
+
originStack: stack
|
|
521
|
+
};
|
|
522
|
+
};
|
|
523
|
+
|
|
524
|
+
/*
|
|
525
|
+
const range = (head, tail, length) => {
|
|
526
|
+
const actTail = tail || length - 1;
|
|
527
|
+
return (
|
|
528
|
+
Array(actTail - head + 1).fill().map((_, idx) => head + idx)
|
|
529
|
+
);
|
|
530
|
+
};
|
|
531
|
+
*/
|
|
532
|
+
|
|
533
|
+
var buildSimFeature = function buildSimFeature(jcamp) {
|
|
534
|
+
var $CSSIMULATIONPEAKS = jcamp.info.$CSSIMULATIONPEAKS;
|
|
535
|
+
|
|
536
|
+
var nmrSimPeaks = $CSSIMULATIONPEAKS ? $CSSIMULATIONPEAKS.split('\n') : [];
|
|
537
|
+
nmrSimPeaks = nmrSimPeaks.map(function (x) {
|
|
538
|
+
return parseFloat(x).toFixed(2);
|
|
539
|
+
});
|
|
540
|
+
return {
|
|
541
|
+
nmrSimPeaks: nmrSimPeaks
|
|
542
|
+
};
|
|
543
|
+
};
|
|
544
|
+
|
|
545
|
+
var buildMpyFeature = function buildMpyFeature(jcamp) {
|
|
546
|
+
var _jcamp$info2 = jcamp.info,
|
|
547
|
+
$OBSERVEDMULTIPLETS = _jcamp$info2.$OBSERVEDMULTIPLETS,
|
|
548
|
+
$OBSERVEDMULTIPLETSPEAKS = _jcamp$info2.$OBSERVEDMULTIPLETSPEAKS;
|
|
549
|
+
|
|
550
|
+
var regx = /[^A-Za-z0-9.,-]/g;
|
|
551
|
+
var regxNum = /[^0-9.]/g;
|
|
552
|
+
var stack = [];
|
|
553
|
+
if (!$OBSERVEDMULTIPLETSPEAKS) return { stack: [] };
|
|
554
|
+
var allPeaks = $OBSERVEDMULTIPLETSPEAKS.split('\n').map(function (p) {
|
|
555
|
+
return p.replace(regx, '').split(',');
|
|
556
|
+
});
|
|
557
|
+
|
|
558
|
+
if ($OBSERVEDMULTIPLETS) {
|
|
559
|
+
var mp = $OBSERVEDMULTIPLETS.split('\n');
|
|
560
|
+
var mpStack = mp.map(function (m) {
|
|
561
|
+
var ms = m.replace(regx, '').split(',');
|
|
562
|
+
var idx = ms[0];
|
|
563
|
+
var ys = [];
|
|
564
|
+
var peaks = allPeaks.map(function (p) {
|
|
565
|
+
if (p[0] === idx) {
|
|
566
|
+
ys = [].concat(_toConsumableArray(ys), [parseFloat(p[2])]);
|
|
567
|
+
return { x: parseFloat(p[1]), y: parseFloat(p[2]) };
|
|
568
|
+
}
|
|
569
|
+
return null;
|
|
570
|
+
}).filter(function (r) {
|
|
571
|
+
return r != null;
|
|
572
|
+
});
|
|
573
|
+
var js = m.split(',');
|
|
574
|
+
js = js[js.length - 1].split(' ').map(function (j) {
|
|
575
|
+
return parseFloat(j.replace(regxNum, ''));
|
|
576
|
+
}).filter(Boolean);
|
|
577
|
+
|
|
578
|
+
return {
|
|
579
|
+
js: js,
|
|
580
|
+
mpyType: ms[6],
|
|
581
|
+
xExtent: {
|
|
582
|
+
xL: parseFloat(ms[1]),
|
|
583
|
+
xU: parseFloat(ms[2])
|
|
584
|
+
},
|
|
585
|
+
yExtent: {
|
|
586
|
+
yL: Math.min.apply(Math, _toConsumableArray(ys)),
|
|
587
|
+
yU: Math.max.apply(Math, _toConsumableArray(ys))
|
|
588
|
+
},
|
|
589
|
+
peaks: peaks
|
|
590
|
+
};
|
|
591
|
+
});
|
|
592
|
+
stack = [].concat(_toConsumableArray(stack), _toConsumableArray(mpStack));
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
return {
|
|
596
|
+
stack: stack,
|
|
597
|
+
shift: 0,
|
|
598
|
+
smExtext: false
|
|
599
|
+
};
|
|
600
|
+
};
|
|
601
|
+
|
|
602
|
+
var isPeakTable = function isPeakTable(s) {
|
|
603
|
+
return s.dataType && (s.dataType.includes('PEAKTABLE') || s.dataType.includes('PEAK ASSIGNMENTS'));
|
|
604
|
+
};
|
|
605
|
+
|
|
606
|
+
var extrFeaturesNi = function extrFeaturesNi(jcamp, layout, peakUp, spectra) {
|
|
607
|
+
var nfs = {};
|
|
608
|
+
var category = jcamp.info.$CSCATEGORY;
|
|
609
|
+
if (category) {
|
|
610
|
+
var idxEditPeak = category.indexOf('EDIT_PEAK');
|
|
611
|
+
if (idxEditPeak >= 0) {
|
|
612
|
+
var sEP = jcamp.spectra[idxEditPeak];
|
|
613
|
+
var thresRef = calcThresRef(sEP, peakUp);
|
|
614
|
+
nfs.editPeak = buildPeakFeature(jcamp, layout, peakUp, sEP, thresRef);
|
|
615
|
+
}
|
|
616
|
+
var idxAutoPeak = category.indexOf('AUTO_PEAK');
|
|
617
|
+
if (idxAutoPeak >= 0) {
|
|
618
|
+
var sAP = jcamp.spectra[idxAutoPeak];
|
|
619
|
+
var _thresRef = calcThresRef(sAP, peakUp);
|
|
620
|
+
nfs.autoPeak = buildPeakFeature(jcamp, layout, peakUp, sAP, _thresRef);
|
|
621
|
+
}
|
|
622
|
+
nfs.integration = buildIntegFeature(jcamp, spectra);
|
|
623
|
+
nfs.multiplicity = buildMpyFeature(jcamp);
|
|
624
|
+
nfs.simulation = buildSimFeature(jcamp);
|
|
625
|
+
return nfs;
|
|
626
|
+
}
|
|
627
|
+
// workaround for legacy design
|
|
628
|
+
var features = jcamp.spectra.map(function (s) {
|
|
629
|
+
var thresRef = calcThresRef(s, peakUp);
|
|
630
|
+
return isPeakTable(s) ? buildPeakFeature(jcamp, layout, peakUp, s, thresRef) : null;
|
|
631
|
+
}).filter(function (r) {
|
|
632
|
+
return r != null;
|
|
633
|
+
});
|
|
634
|
+
|
|
635
|
+
var integration = buildIntegFeature(jcamp, spectra);
|
|
636
|
+
var multiplicity = buildMpyFeature(jcamp);
|
|
637
|
+
var simulation = buildSimFeature(jcamp);
|
|
638
|
+
|
|
639
|
+
return { editPeak: features[0], autoPeak: features[1], integration: integration, multiplicity: multiplicity, simulation: simulation };
|
|
640
|
+
};
|
|
641
|
+
|
|
642
|
+
var extrFeaturesXrd = function extrFeaturesXrd(jcamp, layout, peakUp) {
|
|
643
|
+
var base = jcamp.spectra[0];
|
|
644
|
+
|
|
645
|
+
var features = jcamp.spectra.map(function (s) {
|
|
646
|
+
var upperThres = _format2.default.isXRDLayout(layout) ? 100 : calcUpperThres(s);
|
|
647
|
+
var lowerThres = _format2.default.isXRDLayout(layout) ? 100 : calcLowerThres(s);
|
|
648
|
+
var cpo = buildPeakFeature(jcamp, layout, peakUp, s, 100, upperThres, lowerThres);
|
|
649
|
+
var bnd = getBoundary(s);
|
|
650
|
+
return Object.assign({}, base, cpo, bnd);
|
|
651
|
+
}).filter(function (r) {
|
|
652
|
+
return r != null;
|
|
653
|
+
});
|
|
654
|
+
|
|
655
|
+
return features;
|
|
656
|
+
};
|
|
657
|
+
|
|
658
|
+
var getBoundary = function getBoundary(s) {
|
|
659
|
+
var _s$data$ = s.data[0],
|
|
660
|
+
x = _s$data$.x,
|
|
661
|
+
y = _s$data$.y;
|
|
662
|
+
|
|
663
|
+
var maxX = Math.max.apply(Math, _toConsumableArray(x));
|
|
664
|
+
var minX = Math.min.apply(Math, _toConsumableArray(x));
|
|
665
|
+
var maxY = Math.max.apply(Math, _toConsumableArray(y));
|
|
666
|
+
var minY = Math.min.apply(Math, _toConsumableArray(y));
|
|
667
|
+
return {
|
|
668
|
+
maxX: maxX, minX: minX, maxY: maxY, minY: minY
|
|
669
|
+
};
|
|
670
|
+
};
|
|
671
|
+
|
|
672
|
+
var extrFeaturesMs = function extrFeaturesMs(jcamp, layout, peakUp) {
|
|
673
|
+
// const nfs = {};
|
|
674
|
+
// const category = jcamp.info.$CSCATEGORY;
|
|
675
|
+
// const scanCount = parseInt(jcamp.info.$CSSCANCOUNT, 10) - 1;
|
|
676
|
+
// if (category) {
|
|
677
|
+
// const idxEditPeak = category.indexOf('EDIT_PEAK');
|
|
678
|
+
// if (idxEditPeak >= 0) {
|
|
679
|
+
// const sEP = jcamp.spectra[idxEditPeak + scanCount];
|
|
680
|
+
// const thresRef = calcThresRef(sEP, peakUp);
|
|
681
|
+
// nfs.editPeak = buildPeakFeature(jcamp, layout, peakUp, sEP, thresRef);
|
|
682
|
+
// }
|
|
683
|
+
// const idxAutoPeak = category.indexOf('AUTO_PEAK');
|
|
684
|
+
// if (idxAutoPeak >= 0) {
|
|
685
|
+
// const sAP = jcamp.spectra[idxAutoPeak + scanCount];
|
|
686
|
+
// const thresRef = calcThresRef(sAP, peakUp);
|
|
687
|
+
// nfs.autoPeak = buildPeakFeature(jcamp, layout, peakUp, sAP, thresRef);
|
|
688
|
+
// }
|
|
689
|
+
// return nfs;
|
|
690
|
+
// }
|
|
691
|
+
// // workaround for legacy design
|
|
692
|
+
var thresRef = jcamp.info && jcamp.info.$CSTHRESHOLD * 100 || 5;
|
|
693
|
+
var base = jcamp.spectra[0];
|
|
694
|
+
|
|
695
|
+
var features = jcamp.spectra.map(function (s) {
|
|
696
|
+
var cpo = buildPeakFeature(jcamp, layout, peakUp, s, +thresRef.toFixed(4));
|
|
697
|
+
var bnd = getBoundary(s);
|
|
698
|
+
return Object.assign({}, base, cpo, bnd);
|
|
699
|
+
}).filter(function (r) {
|
|
700
|
+
return r != null;
|
|
701
|
+
});
|
|
702
|
+
|
|
703
|
+
return features;
|
|
704
|
+
};
|
|
705
|
+
|
|
706
|
+
var ExtractJcamp = function ExtractJcamp(source) {
|
|
707
|
+
var jcamp = _jcampconverter2.default.convert(source, {
|
|
708
|
+
xy: true,
|
|
709
|
+
keepRecordsRegExp: /(\$CSTHRESHOLD|\$CSSCANAUTOTARGET|\$CSSCANEDITTARGET|\$CSSCANCOUNT|\$CSSOLVENTNAME|\$CSSOLVENTVALUE|\$CSSOLVENTX|\$CSCATEGORY|\$CSITAREA|\$CSITFACTOR|\$OBSERVEDINTEGRALS|\$OBSERVEDMULTIPLETS|\$OBSERVEDMULTIPLETSPEAKS|\.SOLVENTNAME|\.OBSERVEFREQUENCY|\$CSSIMULATIONPEAKS|\$CSUPPERTHRESHOLD|\$CSLOWERTHRESHOLD|\$CSCYCLICVOLTAMMETRYDATA)/ // eslint-disable-line
|
|
710
|
+
});
|
|
711
|
+
var layout = readLayout(jcamp);
|
|
712
|
+
var peakUp = !_format2.default.isIrLayout(layout);
|
|
713
|
+
|
|
714
|
+
var spectra = _format2.default.isMsLayout(layout) ? extrSpectraMs(jcamp, layout) : extrSpectraNi(jcamp, layout);
|
|
715
|
+
// const features = Format.isMsLayout(layout)
|
|
716
|
+
// ? extrFeaturesMs(jcamp, layout, peakUp)
|
|
717
|
+
// : extrFeaturesNi(jcamp, layout, peakUp, spectra);
|
|
718
|
+
var features = _format2.default.isMsLayout(layout) ? extrFeaturesMs(jcamp, layout, peakUp) : _format2.default.isXRDLayout(layout) || _format2.default.isCyclicVoltaLayout(layout) ? extrFeaturesXrd(jcamp, layout, peakUp) : extrFeaturesNi(jcamp, layout, peakUp, spectra);
|
|
719
|
+
|
|
720
|
+
return { spectra: spectra, features: features, layout: layout };
|
|
721
|
+
};
|
|
722
|
+
|
|
723
|
+
var Convert2Scan = function Convert2Scan(feature, scanSt) {
|
|
724
|
+
var scanAutoTarget = feature.scanAutoTarget,
|
|
725
|
+
scanEditTarget = feature.scanEditTarget;
|
|
726
|
+
var target = scanSt.target,
|
|
727
|
+
isAuto = scanSt.isAuto;
|
|
728
|
+
|
|
729
|
+
var hasEdit = !!scanEditTarget;
|
|
730
|
+
var defaultIdx = isAuto || !hasEdit ? scanAutoTarget : scanEditTarget;
|
|
731
|
+
return target || defaultIdx;
|
|
732
|
+
};
|
|
733
|
+
|
|
734
|
+
var Convert2Thres = function Convert2Thres(feature, thresSt) {
|
|
735
|
+
var value = thresSt.value || feature.thresRef;
|
|
736
|
+
return value;
|
|
737
|
+
};
|
|
738
|
+
|
|
739
|
+
var Convert2DValue = function Convert2DValue(doubleTheta) {
|
|
740
|
+
var lambda = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.15406;
|
|
741
|
+
var isRadian = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
742
|
+
|
|
743
|
+
var theta = doubleTheta / 2;
|
|
744
|
+
if (isRadian) {
|
|
745
|
+
theta = theta / 180 * Math.PI;
|
|
746
|
+
}
|
|
747
|
+
var sinTheta = Math.sin(theta);
|
|
748
|
+
var dValue = lambda / (2 * sinTheta);
|
|
749
|
+
return dValue;
|
|
750
|
+
};
|
|
751
|
+
|
|
752
|
+
var GetCyclicVoltaRatio = function GetCyclicVoltaRatio(y_max_peak, y_min_peak, y_pecker) {
|
|
753
|
+
var firstExpr = Math.abs(y_min_peak) / Math.abs(y_max_peak);
|
|
754
|
+
var secondExpr = 0.485 * Math.abs(y_pecker) / Math.abs(y_max_peak);
|
|
755
|
+
var ratio = firstExpr + secondExpr + 0.086;
|
|
756
|
+
return ratio;
|
|
757
|
+
};
|
|
758
|
+
|
|
759
|
+
var GetCyclicVoltaPeakSeparate = function GetCyclicVoltaPeakSeparate(x_max_peak, x_min_peak) {
|
|
760
|
+
var delta = Math.abs(x_max_peak - x_min_peak);
|
|
761
|
+
return delta;
|
|
762
|
+
};
|
|
763
|
+
|
|
764
|
+
exports.ExtractJcamp = ExtractJcamp;
|
|
765
|
+
exports.Topic2Seed = Topic2Seed;
|
|
766
|
+
exports.Feature2Peak = Feature2Peak;
|
|
767
|
+
exports.ToThresEndPts = ToThresEndPts;
|
|
768
|
+
exports.ToShiftPeaks = ToShiftPeaks;
|
|
769
|
+
exports.ToFrequency = ToFrequency;
|
|
770
|
+
exports.Convert2Peak = Convert2Peak;
|
|
771
|
+
exports.Convert2Scan = Convert2Scan;
|
|
772
|
+
exports.Convert2Thres = Convert2Thres;
|
|
773
|
+
exports.GetComparisons = GetComparisons;
|
|
774
|
+
exports.Convert2DValue = Convert2DValue;
|
|
775
|
+
exports.GetCyclicVoltaRatio = GetCyclicVoltaRatio;
|
|
776
|
+
exports.GetCyclicVoltaPeakSeparate = GetCyclicVoltaPeakSeparate;
|
|
777
|
+
exports.Feature2MaxMinPeak = Feature2MaxMinPeak;
|
|
778
|
+
exports.convertTopic = convertTopic;
|
|
779
|
+
exports.Convert2MaxMinPeak = Convert2MaxMinPeak;
|