nmr-processing 9.4.1 → 9.4.2-pre.1684301205
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/lib/constants/MultiplicityPatterns.d.ts +1 -0
- package/lib/constants/MultiplicityPatterns.js +3 -1
- package/lib/constants/MultiplicityPatterns.js.map +1 -1
- package/lib/constants/couplingPatterns.d.ts +1 -0
- package/lib/constants/couplingPatterns.js +5 -1
- package/lib/constants/couplingPatterns.js.map +1 -1
- package/lib/index.d.ts +6 -1
- package/lib/index.js +6 -1
- package/lib/index.js.map +1 -1
- package/lib/multiplicity/checkMultiplet.d.ts +1 -0
- package/lib/multiplicity/checkMultiplet.js +13 -0
- package/lib/multiplicity/checkMultiplet.js.map +1 -0
- package/lib/multiplicity/checkMultiplicity.d.ts +1 -0
- package/lib/multiplicity/checkMultiplicity.js +17 -0
- package/lib/multiplicity/checkMultiplicity.js.map +1 -0
- package/lib/multiplicity/findMultiplet.d.ts +1 -0
- package/lib/multiplicity/findMultiplet.js +12 -0
- package/lib/multiplicity/findMultiplet.js.map +1 -0
- package/lib/multiplicity/joinPatterns.d.ts +3 -0
- package/lib/{utilities → multiplicity}/joinPatterns.js +2 -2
- package/lib/multiplicity/joinPatterns.js.map +1 -0
- package/lib/multiplicity/splitPatterns.js.map +1 -0
- package/lib/multiplicity/translateMultiplet.d.ts +1 -0
- package/lib/multiplicity/translateMultiplet.js +14 -0
- package/lib/multiplicity/translateMultiplet.js.map +1 -0
- package/lib/ranges/rangesToACS.js +1 -0
- package/lib/ranges/rangesToACS.js.map +1 -1
- package/lib/signal/signalJoinCouplings.d.ts +5 -0
- package/lib/signal/signalJoinCouplings.js +7 -6
- package/lib/signal/signalJoinCouplings.js.map +1 -1
- package/lib/signal/signalMultiplicityPattern.d.ts +3 -1
- package/lib/signal/signalMultiplicityPattern.js +6 -2
- package/lib/signal/signalMultiplicityPattern.js.map +1 -1
- package/lib/utilities/normalizeNucleus.d.ts +1 -0
- package/lib/utilities/normalizeNucleus.js +22 -0
- package/lib/utilities/normalizeNucleus.js.map +1 -0
- package/lib/utilities/nucleusMap.d.ts +5 -0
- package/lib/utilities/nucleusMap.js +22 -0
- package/lib/utilities/nucleusMap.js.map +1 -0
- package/lib/utilities/resurrectRange.js +1 -1
- package/lib/utilities/resurrectRange.js.map +1 -1
- package/lib/utilities/selectACSPattern.d.ts +1 -0
- package/lib/utilities/selectACSPattern.js +14 -0
- package/lib/utilities/selectACSPattern.js.map +1 -0
- package/lib/xyz/Data2D.d.ts +7 -0
- package/lib/xyz/Data2D.js +3 -0
- package/lib/xyz/Data2D.js.map +1 -0
- package/lib/xyz/util/formatZone.d.ts +2 -1
- package/lib/xyz/util/formatZone.js.map +1 -1
- package/lib/xyz/util/padData.d.ts +10 -0
- package/lib/xyz/util/padData.js +38 -0
- package/lib/xyz/util/padData.js.map +1 -0
- package/lib/xyz/xyzAutoSignalsPicking.d.ts +84 -0
- package/lib/xyz/xyzAutoSignalsPicking.js +193 -0
- package/lib/xyz/xyzAutoSignalsPicking.js.map +1 -0
- package/lib/xyz/xyzAutoZonesPicking.d.ts +0 -22
- package/lib/xyz/xyzAutoZonesPicking.js +2 -214
- package/lib/xyz/xyzAutoZonesPicking.js.map +1 -1
- package/lib-esm/constants/MultiplicityPatterns.js +3 -1
- package/lib-esm/constants/MultiplicityPatterns.js.map +1 -1
- package/lib-esm/constants/couplingPatterns.js +4 -0
- package/lib-esm/constants/couplingPatterns.js.map +1 -1
- package/lib-esm/index.js +6 -1
- package/lib-esm/index.js.map +1 -1
- package/lib-esm/multiplicity/checkMultiplet.js +9 -0
- package/lib-esm/multiplicity/checkMultiplet.js.map +1 -0
- package/lib-esm/multiplicity/checkMultiplicity.js +13 -0
- package/lib-esm/multiplicity/checkMultiplicity.js.map +1 -0
- package/lib-esm/multiplicity/findMultiplet.js +8 -0
- package/lib-esm/multiplicity/findMultiplet.js.map +1 -0
- package/lib-esm/{utilities → multiplicity}/joinPatterns.js +3 -3
- package/lib-esm/multiplicity/joinPatterns.js.map +1 -0
- package/lib-esm/multiplicity/splitPatterns.js.map +1 -0
- package/lib-esm/multiplicity/translateMultiplet.js +10 -0
- package/lib-esm/multiplicity/translateMultiplet.js.map +1 -0
- package/lib-esm/ranges/rangesToACS.js +1 -0
- package/lib-esm/ranges/rangesToACS.js.map +1 -1
- package/lib-esm/signal/signalJoinCouplings.js +7 -6
- package/lib-esm/signal/signalJoinCouplings.js.map +1 -1
- package/lib-esm/signal/signalMultiplicityPattern.js +6 -2
- package/lib-esm/signal/signalMultiplicityPattern.js.map +1 -1
- package/lib-esm/utilities/normalizeNucleus.js +18 -0
- package/lib-esm/utilities/normalizeNucleus.js.map +1 -0
- package/lib-esm/utilities/nucleusMap.js +19 -0
- package/lib-esm/utilities/nucleusMap.js.map +1 -0
- package/lib-esm/utilities/resurrectRange.js +1 -1
- package/lib-esm/utilities/resurrectRange.js.map +1 -1
- package/lib-esm/utilities/selectACSPattern.js +10 -0
- package/lib-esm/utilities/selectACSPattern.js.map +1 -0
- package/lib-esm/xyz/Data2D.js +2 -0
- package/lib-esm/xyz/Data2D.js.map +1 -0
- package/lib-esm/xyz/util/formatZone.js.map +1 -1
- package/lib-esm/xyz/util/padData.js +31 -0
- package/lib-esm/xyz/util/padData.js.map +1 -0
- package/lib-esm/xyz/xyzAutoSignalsPicking.js +163 -0
- package/lib-esm/xyz/xyzAutoSignalsPicking.js.map +1 -0
- package/lib-esm/xyz/xyzAutoZonesPicking.js +2 -188
- package/lib-esm/xyz/xyzAutoZonesPicking.js.map +1 -1
- package/package.json +1 -1
- package/src/constants/MultiplicityPatterns.ts +4 -1
- package/src/constants/couplingPatterns.ts +9 -0
- package/src/index.ts +7 -1
- package/src/multiplicity/checkMultiplet.ts +11 -0
- package/src/multiplicity/checkMultiplicity.ts +21 -0
- package/src/multiplicity/findMultiplet.ts +8 -0
- package/src/{utilities → multiplicity}/joinPatterns.ts +9 -3
- package/src/multiplicity/translateMultiplet.ts +11 -0
- package/src/ranges/rangesToACS.ts +1 -0
- package/src/signal/signalJoinCouplings.ts +12 -5
- package/src/signal/signalMultiplicityPattern.ts +9 -2
- package/src/utilities/normalizeNucleus.ts +24 -0
- package/src/utilities/nucleusMap.ts +40 -0
- package/src/utilities/resurrectRange.ts +1 -1
- package/src/utilities/selectACSPattern.ts +10 -0
- package/src/xyz/Data2D.ts +7 -0
- package/src/xyz/util/formatZone.ts +2 -1
- package/src/xyz/util/padData.ts +37 -0
- package/src/xyz/xyzAutoSignalsPicking.ts +309 -0
- package/src/xyz/xyzAutoZonesPicking.ts +2 -276
- package/lib/utilities/joinPatterns.d.ts +0 -1
- package/lib/utilities/joinPatterns.js.map +0 -1
- package/lib/utilities/splitPatterns.js.map +0 -1
- package/lib-esm/utilities/joinPatterns.js.map +0 -1
- package/lib-esm/utilities/splitPatterns.js.map +0 -1
- /package/lib/{utilities → multiplicity}/splitPatterns.d.ts +0 -0
- /package/lib/{utilities → multiplicity}/splitPatterns.js +0 -0
- /package/lib-esm/{utilities → multiplicity}/splitPatterns.js +0 -0
- /package/src/{utilities → multiplicity}/splitPatterns.ts +0 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.padData = void 0;
|
|
7
|
+
const ml_matrix_1 = __importDefault(require("ml-matrix"));
|
|
8
|
+
function padData(spectraData, options) {
|
|
9
|
+
let { minX, maxX, minY, maxY } = spectraData;
|
|
10
|
+
const width = options.width;
|
|
11
|
+
let nbPoints = spectraData.z[0].length;
|
|
12
|
+
let nbSubSpectra = spectraData.z.length;
|
|
13
|
+
let yInterval = (maxY - minY) / (nbSubSpectra - 1);
|
|
14
|
+
let xInterval = (maxX - minX) / (nbPoints - 1);
|
|
15
|
+
let yDiff = width - nbSubSpectra;
|
|
16
|
+
let xDiff = Math.max(width - nbPoints, 0);
|
|
17
|
+
if (xDiff % 2)
|
|
18
|
+
xDiff++;
|
|
19
|
+
if (yDiff % 2)
|
|
20
|
+
yDiff++;
|
|
21
|
+
let xOffset = xDiff / 2;
|
|
22
|
+
let yOffset = yDiff / 2;
|
|
23
|
+
let newMatrix = ml_matrix_1.default.zeros(nbSubSpectra + yDiff, nbPoints + xDiff);
|
|
24
|
+
for (let i = 0; i < nbSubSpectra; i++) {
|
|
25
|
+
for (let j = 0; j < nbPoints; j++) {
|
|
26
|
+
newMatrix.set(i + yOffset, j + xOffset, spectraData.z[i][j]);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
z: newMatrix.to2DArray(),
|
|
31
|
+
minX: minX - xOffset * xInterval,
|
|
32
|
+
maxX: maxX + xOffset * xInterval,
|
|
33
|
+
minY: minY - yOffset * yInterval,
|
|
34
|
+
maxY: maxY + yOffset * yInterval,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
exports.padData = padData;
|
|
38
|
+
//# sourceMappingURL=padData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"padData.js","sourceRoot":"","sources":["../../../src/xyz/util/padData.ts"],"names":[],"mappings":";;;;;;AAAA,0DAA+B;AAI/B,SAAgB,OAAO,CAAC,WAAmB,EAAE,OAA0B;IACrE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC;IAE7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAE5B,IAAI,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IAExC,IAAI,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IACnD,IAAI,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAE/C,IAAI,KAAK,GAAG,KAAK,GAAG,YAAY,CAAC;IACjC,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1C,IAAI,KAAK,GAAG,CAAC;QAAE,KAAK,EAAE,CAAC;IACvB,IAAI,KAAK,GAAG,CAAC;QAAE,KAAK,EAAE,CAAC;IAEvB,IAAI,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC;IACxB,IAAI,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC;IACxB,IAAI,SAAS,GAAG,mBAAM,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAC,CAAC;IACrE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE;YACjC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC9D;KACF;IAED,OAAO;QACL,CAAC,EAAE,SAAS,CAAC,SAAS,EAAE;QACxB,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS;QAChC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS;QAChC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS;QAChC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS;KACjC,CAAC;AACJ,CAAC;AAhCD,0BAgCC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import * as matrixPeakFinders from 'ml-matrix-peaks-finder';
|
|
2
|
+
import type { Peak2D } from 'ml-matrix-peaks-finder';
|
|
3
|
+
import type { GetKernelOptions } from '../peaks/util/getKernel';
|
|
4
|
+
import { MakeMandatory } from '../utilities/MakeMandatory';
|
|
5
|
+
import { Data2D } from './Data2D';
|
|
6
|
+
import type { NMRSignal2D } from './NMRSignal2D';
|
|
7
|
+
export interface XYZAutoSignalsPickingOptions {
|
|
8
|
+
/**
|
|
9
|
+
* max number of points in any dimension to pad the input data, this is needed to avoid lost peaks when the input matrix is too small.
|
|
10
|
+
* @default 14
|
|
11
|
+
*/
|
|
12
|
+
sizeToPad?: number;
|
|
13
|
+
/**
|
|
14
|
+
* If it's true, try to find the real maximum for each bidimensional peak.
|
|
15
|
+
* @default true
|
|
16
|
+
*/
|
|
17
|
+
realTopDetection?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* positive value filter small peaks by intensity
|
|
20
|
+
* @default 0.5
|
|
21
|
+
*/
|
|
22
|
+
thresholdFactor?: number;
|
|
23
|
+
/**
|
|
24
|
+
* specify the nuclei of each dimension
|
|
25
|
+
* @default ['1H','1H']
|
|
26
|
+
*/
|
|
27
|
+
nuclei?: string[];
|
|
28
|
+
/**
|
|
29
|
+
* specify the frequency for each dimension.
|
|
30
|
+
*/
|
|
31
|
+
observedFrequencies: number[] | Float64Array;
|
|
32
|
+
/**
|
|
33
|
+
* If it's true, it try to ajust the shift and add missing cross peaks, useful only for homonuclear data.
|
|
34
|
+
* @default false
|
|
35
|
+
*/
|
|
36
|
+
enhanceSymmetry?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* If it's true, peaks with less than a specific percentage (maxPercentCutOff) of the maximum intensity will be removed.
|
|
39
|
+
* @default true;
|
|
40
|
+
*/
|
|
41
|
+
clean?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* percentage of maximum intensity as cutoff for small peaks.
|
|
44
|
+
* @default 0.03
|
|
45
|
+
*/
|
|
46
|
+
maxPercentCutOff?: number;
|
|
47
|
+
/**
|
|
48
|
+
* Specify the minimum distance in Hz for each dimension to join peaks in a signal.
|
|
49
|
+
* @default [24,24]
|
|
50
|
+
*/
|
|
51
|
+
tolerances?: number[];
|
|
52
|
+
/**
|
|
53
|
+
* If it is true, the convolution will be forced by FFT
|
|
54
|
+
* @default true
|
|
55
|
+
*/
|
|
56
|
+
convolutionByFFT?: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* kernel options to calculate a laplacianOfGaussian kernel with a specify size.
|
|
59
|
+
*/
|
|
60
|
+
kernel?: GetKernelOptions;
|
|
61
|
+
}
|
|
62
|
+
export type NMRSignal2DWithID<T extends Peak2D = Peak2D> = MakeMandatory<NMRSignal2D<T>, 'id'>;
|
|
63
|
+
export declare function xyzAutoSignalsPicking(spectraData: Data2D, options: XYZAutoSignalsPickingOptions): NMRSignal2DWithID<matrixPeakFinders.Peak2D & {
|
|
64
|
+
id: string;
|
|
65
|
+
}>[];
|
|
66
|
+
/**
|
|
67
|
+
* This function converts a set of 2D-peaks in 2D-signals. Each signal could be composed
|
|
68
|
+
* of many 2D-peaks, and it has some additional information related to the NMR spectrum.
|
|
69
|
+
* @private
|
|
70
|
+
*/
|
|
71
|
+
export interface CreateSignals2DOptions {
|
|
72
|
+
nCols: number;
|
|
73
|
+
nRows: number;
|
|
74
|
+
absoluteData: number[] | Float64Array;
|
|
75
|
+
originalData: number[] | Float64Array;
|
|
76
|
+
observedFrequencies: number[] | Float64Array;
|
|
77
|
+
tolerances: number[];
|
|
78
|
+
nuclei: string[];
|
|
79
|
+
realTopDetection: boolean;
|
|
80
|
+
minY: number;
|
|
81
|
+
maxY: number;
|
|
82
|
+
minX: number;
|
|
83
|
+
maxX: number;
|
|
84
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.xyzAutoSignalsPicking = void 0;
|
|
30
|
+
const uuid_1 = require("@lukeed/uuid");
|
|
31
|
+
const convolution = __importStar(require("ml-matrix-convolution"));
|
|
32
|
+
const matrixPeakFinders = __importStar(require("ml-matrix-peaks-finder"));
|
|
33
|
+
const ml_simple_clustering_1 = __importDefault(require("ml-simple-clustering"));
|
|
34
|
+
const addMissingIDs_1 = require("../peaks/util/addMissingIDs");
|
|
35
|
+
const determineRealTop_1 = require("../peaks/util/determineRealTop");
|
|
36
|
+
const getKernel_1 = require("../peaks/util/getKernel");
|
|
37
|
+
const PeakOptimizer = __importStar(require("../peaks/util/peakOptimizer"));
|
|
38
|
+
const padData_1 = require("./util/padData");
|
|
39
|
+
const smallFilter = [
|
|
40
|
+
[0, 0, 1, 2, 2, 2, 1, 0, 0],
|
|
41
|
+
[0, 1, 4, 7, 7, 7, 4, 1, 0],
|
|
42
|
+
[1, 4, 5, 3, 0, 3, 5, 4, 1],
|
|
43
|
+
[2, 7, 3, -12, -23, -12, 3, 7, 2],
|
|
44
|
+
[2, 7, 0, -23, -40, -23, 0, 7, 2],
|
|
45
|
+
[2, 7, 3, -12, -23, -12, 3, 7, 2],
|
|
46
|
+
[1, 4, 5, 3, 0, 3, 5, 4, 1],
|
|
47
|
+
[0, 1, 3, 7, 7, 7, 3, 1, 0],
|
|
48
|
+
[0, 0, 1, 2, 2, 2, 1, 0, 0],
|
|
49
|
+
];
|
|
50
|
+
function xyzAutoSignalsPicking(spectraData, options) {
|
|
51
|
+
let { sizeToPad = 14, realTopDetection = true, thresholdFactor = 0.5, nuclei = ['1H', '1H'], observedFrequencies, enhanceSymmetry = false, clean = true, maxPercentCutOff = 0.03, tolerances = [24, 24], convolutionByFFT = true, kernel: kernelOptions, } = options;
|
|
52
|
+
if (!Array.isArray(observedFrequencies) &&
|
|
53
|
+
!ArrayBuffer.isView(observedFrequencies)) {
|
|
54
|
+
throw new Error('observedFrequencies is mandatory');
|
|
55
|
+
}
|
|
56
|
+
thresholdFactor = thresholdFactor === 0 ? 1 : Math.abs(thresholdFactor);
|
|
57
|
+
let nbPoints = spectraData.z[0].length;
|
|
58
|
+
let nbSubSpectra = spectraData.z.length;
|
|
59
|
+
if (nbSubSpectra < sizeToPad) {
|
|
60
|
+
spectraData = (0, padData_1.padData)(spectraData, { width: sizeToPad });
|
|
61
|
+
nbPoints = spectraData.z[0].length;
|
|
62
|
+
nbSubSpectra = spectraData.z.length;
|
|
63
|
+
}
|
|
64
|
+
let absoluteData = new Float64Array(nbPoints * nbSubSpectra);
|
|
65
|
+
let originalData = new Float64Array(nbPoints * nbSubSpectra);
|
|
66
|
+
for (let iSubSpectra = 0; iSubSpectra < nbSubSpectra; iSubSpectra++) {
|
|
67
|
+
let spectrum = spectraData.z[iSubSpectra];
|
|
68
|
+
for (let iCol = 0; iCol < nbPoints; iCol++) {
|
|
69
|
+
let index = iSubSpectra * nbPoints + iCol;
|
|
70
|
+
absoluteData[index] = Math.abs(spectrum[iCol]);
|
|
71
|
+
originalData[index] = spectrum[iCol]; //@todo pensar si se puede evitar originalData
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const kernel = kernelOptions ? (0, getKernel_1.getKernel)(kernelOptions) : smallFilter;
|
|
75
|
+
let convolutedSpectrum = convolutionByFFT
|
|
76
|
+
? convolution.fft(absoluteData, kernel, {
|
|
77
|
+
rows: nbSubSpectra,
|
|
78
|
+
cols: nbPoints,
|
|
79
|
+
})
|
|
80
|
+
: convolution.direct(absoluteData, kernel, {
|
|
81
|
+
rows: nbSubSpectra,
|
|
82
|
+
cols: nbPoints,
|
|
83
|
+
});
|
|
84
|
+
let peaksMC1 = matrixPeakFinders.findPeaks2DRegion(absoluteData, {
|
|
85
|
+
originalData,
|
|
86
|
+
filteredData: convolutedSpectrum,
|
|
87
|
+
rows: nbSubSpectra,
|
|
88
|
+
cols: nbPoints,
|
|
89
|
+
nStdDev: thresholdFactor,
|
|
90
|
+
});
|
|
91
|
+
if (clean) {
|
|
92
|
+
// Remove peaks with less than x% of the intensity of the highest peak
|
|
93
|
+
peaksMC1 = PeakOptimizer.clean(peaksMC1, maxPercentCutOff);
|
|
94
|
+
}
|
|
95
|
+
let signals = createSignals2D((0, addMissingIDs_1.addMissingIDs)(peaksMC1), {
|
|
96
|
+
nRows: nbSubSpectra,
|
|
97
|
+
nCols: nbPoints,
|
|
98
|
+
minX: spectraData.minX,
|
|
99
|
+
maxX: spectraData.maxX,
|
|
100
|
+
minY: spectraData.minY,
|
|
101
|
+
maxY: spectraData.maxY,
|
|
102
|
+
absoluteData,
|
|
103
|
+
originalData,
|
|
104
|
+
tolerances,
|
|
105
|
+
nuclei,
|
|
106
|
+
observedFrequencies,
|
|
107
|
+
realTopDetection,
|
|
108
|
+
});
|
|
109
|
+
if (enhanceSymmetry) {
|
|
110
|
+
signals = PeakOptimizer.enhanceSymmetry(signals);
|
|
111
|
+
}
|
|
112
|
+
return signals;
|
|
113
|
+
}
|
|
114
|
+
exports.xyzAutoSignalsPicking = xyzAutoSignalsPicking;
|
|
115
|
+
function createSignals2D(peaks, options) {
|
|
116
|
+
let { nCols, nRows, absoluteData, originalData, observedFrequencies, tolerances, nuclei, realTopDetection, minY, maxY, minX, maxX, } = options;
|
|
117
|
+
let [nucleusX, nucleusY] = nuclei;
|
|
118
|
+
let [toleranceX, toleranceY] = tolerances;
|
|
119
|
+
let [observeFrequencyX, observeFrequencyY] = observedFrequencies;
|
|
120
|
+
let dy = (maxY - minY) / (nRows - 1);
|
|
121
|
+
let dx = (maxX - minX) / (nCols - 1);
|
|
122
|
+
if (realTopDetection) {
|
|
123
|
+
peaks = (0, determineRealTop_1.determineRealTop)(peaks, {
|
|
124
|
+
nCols,
|
|
125
|
+
absoluteData,
|
|
126
|
+
originalData,
|
|
127
|
+
minX,
|
|
128
|
+
maxX,
|
|
129
|
+
minY,
|
|
130
|
+
maxY,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
for (let i = peaks.length - 1; i >= 0; i--) {
|
|
134
|
+
let { x, y } = peaks[i];
|
|
135
|
+
peaks[i].x = minX + dx * x;
|
|
136
|
+
peaks[i].y = minY + dy * y;
|
|
137
|
+
peaks[i].minX = minX + dx * peaks[i].minX;
|
|
138
|
+
peaks[i].minY = minY + dy * peaks[i].minY;
|
|
139
|
+
peaks[i].maxX = minX + dx * peaks[i].maxX;
|
|
140
|
+
peaks[i].maxY = minY + dy * peaks[i].maxY;
|
|
141
|
+
// Still having problems to correctly detect peaks on those areas. So I'm removing everything there.
|
|
142
|
+
}
|
|
143
|
+
// The connectivity matrix is an square and symmetric matrix, so we'll only store the upper diagonal in an
|
|
144
|
+
// array like form
|
|
145
|
+
let connectivity = [];
|
|
146
|
+
for (let i = 0; i < peaks.length; i++) {
|
|
147
|
+
for (let j = i; j < peaks.length; j++) {
|
|
148
|
+
if (Math.abs(peaks[i].x - peaks[j].x) * observeFrequencyX < toleranceX &&
|
|
149
|
+
Math.abs(peaks[i].y - peaks[j].y) * observeFrequencyY < toleranceY) {
|
|
150
|
+
// 24*24Hz We cannot distinguish peaks with less than 20 Hz of separation
|
|
151
|
+
connectivity.push(1);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
connectivity.push(0);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
let clusters = (0, ml_simple_clustering_1.default)(connectivity);
|
|
159
|
+
let signals = [];
|
|
160
|
+
if (clusters) {
|
|
161
|
+
for (const cluster of clusters) {
|
|
162
|
+
let signal = {
|
|
163
|
+
id: (0, uuid_1.v4)(),
|
|
164
|
+
x: {
|
|
165
|
+
delta: 0,
|
|
166
|
+
nucleus: nucleusX,
|
|
167
|
+
resolution: dx,
|
|
168
|
+
},
|
|
169
|
+
y: {
|
|
170
|
+
delta: 0,
|
|
171
|
+
nucleus: nucleusY,
|
|
172
|
+
resolution: dy,
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
let peaks2D = [];
|
|
176
|
+
let sumZ = 0;
|
|
177
|
+
for (let jPeak = 0; jPeak < cluster.length; jPeak++) {
|
|
178
|
+
if (cluster[jPeak] === 1) {
|
|
179
|
+
peaks2D.push(peaks[jPeak]);
|
|
180
|
+
signal.x.delta += peaks[jPeak].x * peaks[jPeak].z;
|
|
181
|
+
signal.y.delta += peaks[jPeak].y * peaks[jPeak].z;
|
|
182
|
+
sumZ += peaks[jPeak].z;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
signal.x.delta /= sumZ;
|
|
186
|
+
signal.y.delta /= sumZ;
|
|
187
|
+
signal.peaks = peaks2D;
|
|
188
|
+
signals.push(signal);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return signals;
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=xyzAutoSignalsPicking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xyzAutoSignalsPicking.js","sourceRoot":"","sources":["../../src/xyz/xyzAutoSignalsPicking.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import type { Peak2D } from 'ml-matrix-peaks-finder';
|
|
2
1
|
import type { GetKernelOptions } from '../peaks/util/getKernel';
|
|
3
2
|
import { MakeMandatory } from '../utilities/MakeMandatory';
|
|
4
|
-
import type { NMRSignal2D } from './NMRSignal2D';
|
|
5
3
|
import { NMRZone } from './NMRZone';
|
|
6
4
|
export interface Data2D {
|
|
7
5
|
z: number[][] | Float64Array[];
|
|
@@ -65,25 +63,5 @@ export interface XYZAutoZonesPickingOptions {
|
|
|
65
63
|
*/
|
|
66
64
|
kernel?: GetKernelOptions;
|
|
67
65
|
}
|
|
68
|
-
export type NMRSignal2DWithID<T extends Peak2D = Peak2D> = MakeMandatory<NMRSignal2D<T>, 'id'>;
|
|
69
66
|
export type NMRZoneWithID = MakeMandatory<NMRZone, 'id'>;
|
|
70
67
|
export declare function xyzAutoZonesPicking(spectraData: Data2D, options: XYZAutoZonesPickingOptions): NMRZoneWithID[];
|
|
71
|
-
/**
|
|
72
|
-
* This function converts a set of 2D-peaks in 2D-signals. Each signal could be composed
|
|
73
|
-
* of many 2D-peaks, and it has some additional information related to the NMR spectrum.
|
|
74
|
-
* @private
|
|
75
|
-
*/
|
|
76
|
-
export interface CreateSignals2DOptions {
|
|
77
|
-
nCols: number;
|
|
78
|
-
nRows: number;
|
|
79
|
-
absoluteData: number[] | Float64Array;
|
|
80
|
-
originalData: number[] | Float64Array;
|
|
81
|
-
observedFrequencies: number[] | Float64Array;
|
|
82
|
-
tolerances: number[];
|
|
83
|
-
nuclei: string[];
|
|
84
|
-
realTopDetection: boolean;
|
|
85
|
-
minY: number;
|
|
86
|
-
maxY: number;
|
|
87
|
-
minX: number;
|
|
88
|
-
maxX: number;
|
|
89
|
-
}
|
|
@@ -1,223 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
3
|
exports.xyzAutoZonesPicking = void 0;
|
|
30
|
-
const
|
|
31
|
-
const ml_matrix_1 = require("ml-matrix");
|
|
32
|
-
const convolution = __importStar(require("ml-matrix-convolution"));
|
|
33
|
-
const matrixPeakFinders = __importStar(require("ml-matrix-peaks-finder"));
|
|
34
|
-
const ml_simple_clustering_1 = __importDefault(require("ml-simple-clustering"));
|
|
35
|
-
const addMissingIDs_1 = require("../peaks/util/addMissingIDs");
|
|
36
|
-
const determineRealTop_1 = require("../peaks/util/determineRealTop");
|
|
37
|
-
const getKernel_1 = require("../peaks/util/getKernel");
|
|
38
|
-
const PeakOptimizer = __importStar(require("../peaks/util/peakOptimizer"));
|
|
4
|
+
const __1 = require("..");
|
|
39
5
|
const formatZone_1 = require("./util/formatZone");
|
|
40
|
-
const smallFilter = [
|
|
41
|
-
[0, 0, 1, 2, 2, 2, 1, 0, 0],
|
|
42
|
-
[0, 1, 4, 7, 7, 7, 4, 1, 0],
|
|
43
|
-
[1, 4, 5, 3, 0, 3, 5, 4, 1],
|
|
44
|
-
[2, 7, 3, -12, -23, -12, 3, 7, 2],
|
|
45
|
-
[2, 7, 0, -23, -40, -23, 0, 7, 2],
|
|
46
|
-
[2, 7, 3, -12, -23, -12, 3, 7, 2],
|
|
47
|
-
[1, 4, 5, 3, 0, 3, 5, 4, 1],
|
|
48
|
-
[0, 1, 3, 7, 7, 7, 3, 1, 0],
|
|
49
|
-
[0, 0, 1, 2, 2, 2, 1, 0, 0],
|
|
50
|
-
];
|
|
51
6
|
function xyzAutoZonesPicking(spectraData, options) {
|
|
52
|
-
|
|
53
|
-
if (!Array.isArray(observedFrequencies) &&
|
|
54
|
-
!ArrayBuffer.isView(observedFrequencies)) {
|
|
55
|
-
throw new Error('observedFrequencies is mandatory');
|
|
56
|
-
}
|
|
57
|
-
thresholdFactor = thresholdFactor === 0 ? 1 : Math.abs(thresholdFactor);
|
|
58
|
-
let nbPoints = spectraData.z[0].length;
|
|
59
|
-
let nbSubSpectra = spectraData.z.length;
|
|
60
|
-
if (nbSubSpectra < sizeToPad) {
|
|
61
|
-
spectraData = padData(spectraData, { width: sizeToPad });
|
|
62
|
-
nbPoints = spectraData.z[0].length;
|
|
63
|
-
nbSubSpectra = spectraData.z.length;
|
|
64
|
-
}
|
|
65
|
-
let absoluteData = new Float64Array(nbPoints * nbSubSpectra);
|
|
66
|
-
let originalData = new Float64Array(nbPoints * nbSubSpectra);
|
|
67
|
-
for (let iSubSpectra = 0; iSubSpectra < nbSubSpectra; iSubSpectra++) {
|
|
68
|
-
let spectrum = spectraData.z[iSubSpectra];
|
|
69
|
-
for (let iCol = 0; iCol < nbPoints; iCol++) {
|
|
70
|
-
let index = iSubSpectra * nbPoints + iCol;
|
|
71
|
-
absoluteData[index] = Math.abs(spectrum[iCol]);
|
|
72
|
-
originalData[index] = spectrum[iCol]; //@todo pensar si se puede evitar originalData
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
const kernel = kernelOptions ? (0, getKernel_1.getKernel)(kernelOptions) : smallFilter;
|
|
76
|
-
let convolutedSpectrum = convolutionByFFT
|
|
77
|
-
? convolution.fft(absoluteData, kernel, {
|
|
78
|
-
rows: nbSubSpectra,
|
|
79
|
-
cols: nbPoints,
|
|
80
|
-
})
|
|
81
|
-
: convolution.direct(absoluteData, kernel, {
|
|
82
|
-
rows: nbSubSpectra,
|
|
83
|
-
cols: nbPoints,
|
|
84
|
-
});
|
|
85
|
-
let peaksMC1 = matrixPeakFinders.findPeaks2DRegion(absoluteData, {
|
|
86
|
-
originalData,
|
|
87
|
-
filteredData: convolutedSpectrum,
|
|
88
|
-
rows: nbSubSpectra,
|
|
89
|
-
cols: nbPoints,
|
|
90
|
-
nStdDev: thresholdFactor,
|
|
91
|
-
});
|
|
92
|
-
if (clean) {
|
|
93
|
-
// Remove peaks with less than x% of the intensity of the highest peak
|
|
94
|
-
peaksMC1 = PeakOptimizer.clean(peaksMC1, maxPercentCutOff);
|
|
95
|
-
}
|
|
96
|
-
let signals = createSignals2D((0, addMissingIDs_1.addMissingIDs)(peaksMC1), {
|
|
97
|
-
nRows: nbSubSpectra,
|
|
98
|
-
nCols: nbPoints,
|
|
99
|
-
minX: spectraData.minX,
|
|
100
|
-
maxX: spectraData.maxX,
|
|
101
|
-
minY: spectraData.minY,
|
|
102
|
-
maxY: spectraData.maxY,
|
|
103
|
-
absoluteData,
|
|
104
|
-
originalData,
|
|
105
|
-
tolerances,
|
|
106
|
-
nuclei,
|
|
107
|
-
observedFrequencies,
|
|
108
|
-
realTopDetection,
|
|
109
|
-
});
|
|
110
|
-
if (enhanceSymmetry) {
|
|
111
|
-
signals = PeakOptimizer.enhanceSymmetry(signals);
|
|
112
|
-
}
|
|
7
|
+
const signals = (0, __1.xyzAutoSignalsPicking)(spectraData, options);
|
|
113
8
|
return (0, formatZone_1.formatZones)(signals);
|
|
114
9
|
}
|
|
115
10
|
exports.xyzAutoZonesPicking = xyzAutoZonesPicking;
|
|
116
|
-
function createSignals2D(peaks, options) {
|
|
117
|
-
let { nCols, nRows, absoluteData, originalData, observedFrequencies, tolerances, nuclei, realTopDetection, minY, maxY, minX, maxX, } = options;
|
|
118
|
-
let [nucleusX, nucleusY] = nuclei;
|
|
119
|
-
let [toleranceX, toleranceY] = tolerances;
|
|
120
|
-
let [observeFrequencyX, observeFrequencyY] = observedFrequencies;
|
|
121
|
-
let dy = (maxY - minY) / (nRows - 1);
|
|
122
|
-
let dx = (maxX - minX) / (nCols - 1);
|
|
123
|
-
if (realTopDetection) {
|
|
124
|
-
peaks = (0, determineRealTop_1.determineRealTop)(peaks, {
|
|
125
|
-
nCols,
|
|
126
|
-
absoluteData,
|
|
127
|
-
originalData,
|
|
128
|
-
minX,
|
|
129
|
-
maxX,
|
|
130
|
-
minY,
|
|
131
|
-
maxY,
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
for (let i = peaks.length - 1; i >= 0; i--) {
|
|
135
|
-
let { x, y } = peaks[i];
|
|
136
|
-
peaks[i].x = minX + dx * x;
|
|
137
|
-
peaks[i].y = minY + dy * y;
|
|
138
|
-
peaks[i].minX = minX + dx * peaks[i].minX;
|
|
139
|
-
peaks[i].minY = minY + dy * peaks[i].minY;
|
|
140
|
-
peaks[i].maxX = minX + dx * peaks[i].maxX;
|
|
141
|
-
peaks[i].maxY = minY + dy * peaks[i].maxY;
|
|
142
|
-
// Still having problems to correctly detect peaks on those areas. So I'm removing everything there.
|
|
143
|
-
}
|
|
144
|
-
// The connectivity matrix is an square and symmetric matrix, so we'll only store the upper diagonal in an
|
|
145
|
-
// array like form
|
|
146
|
-
let connectivity = [];
|
|
147
|
-
for (let i = 0; i < peaks.length; i++) {
|
|
148
|
-
for (let j = i; j < peaks.length; j++) {
|
|
149
|
-
if (Math.abs(peaks[i].x - peaks[j].x) * observeFrequencyX < toleranceX &&
|
|
150
|
-
Math.abs(peaks[i].y - peaks[j].y) * observeFrequencyY < toleranceY) {
|
|
151
|
-
// 24*24Hz We cannot distinguish peaks with less than 20 Hz of separation
|
|
152
|
-
connectivity.push(1);
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
connectivity.push(0);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
let clusters = (0, ml_simple_clustering_1.default)(connectivity);
|
|
160
|
-
let signals = [];
|
|
161
|
-
if (clusters) {
|
|
162
|
-
for (const cluster of clusters) {
|
|
163
|
-
let signal = {
|
|
164
|
-
id: (0, uuid_1.v4)(),
|
|
165
|
-
x: {
|
|
166
|
-
delta: 0,
|
|
167
|
-
nucleus: nucleusX,
|
|
168
|
-
resolution: dx,
|
|
169
|
-
},
|
|
170
|
-
y: {
|
|
171
|
-
delta: 0,
|
|
172
|
-
nucleus: nucleusY,
|
|
173
|
-
resolution: dy,
|
|
174
|
-
},
|
|
175
|
-
};
|
|
176
|
-
let peaks2D = [];
|
|
177
|
-
let sumZ = 0;
|
|
178
|
-
for (let jPeak = 0; jPeak < cluster.length; jPeak++) {
|
|
179
|
-
if (cluster[jPeak] === 1) {
|
|
180
|
-
peaks2D.push(peaks[jPeak]);
|
|
181
|
-
signal.x.delta += peaks[jPeak].x * peaks[jPeak].z;
|
|
182
|
-
signal.y.delta += peaks[jPeak].y * peaks[jPeak].z;
|
|
183
|
-
sumZ += peaks[jPeak].z;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
signal.x.delta /= sumZ;
|
|
187
|
-
signal.y.delta /= sumZ;
|
|
188
|
-
signal.peaks = peaks2D;
|
|
189
|
-
signals.push(signal);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return signals;
|
|
193
|
-
}
|
|
194
|
-
function padData(spectraData, options) {
|
|
195
|
-
let { minX, maxX, minY, maxY } = spectraData;
|
|
196
|
-
const width = options.width;
|
|
197
|
-
let nbPoints = spectraData.z[0].length;
|
|
198
|
-
let nbSubSpectra = spectraData.z.length;
|
|
199
|
-
let yInterval = (maxY - minY) / (nbSubSpectra - 1);
|
|
200
|
-
let xInterval = (maxX - minX) / (nbPoints - 1);
|
|
201
|
-
let yDiff = width - nbSubSpectra;
|
|
202
|
-
let xDiff = Math.max(width - nbPoints, 0);
|
|
203
|
-
if (xDiff % 2)
|
|
204
|
-
xDiff++;
|
|
205
|
-
if (yDiff % 2)
|
|
206
|
-
yDiff++;
|
|
207
|
-
let xOffset = xDiff / 2;
|
|
208
|
-
let yOffset = yDiff / 2;
|
|
209
|
-
let newMatrix = ml_matrix_1.Matrix.zeros(nbSubSpectra + yDiff, nbPoints + xDiff);
|
|
210
|
-
for (let i = 0; i < nbSubSpectra; i++) {
|
|
211
|
-
for (let j = 0; j < nbPoints; j++) {
|
|
212
|
-
newMatrix.set(i + yOffset, j + xOffset, spectraData.z[i][j]);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
return {
|
|
216
|
-
z: newMatrix.to2DArray(),
|
|
217
|
-
minX: minX - xOffset * xInterval,
|
|
218
|
-
maxX: maxX + xOffset * xInterval,
|
|
219
|
-
minY: minY - yOffset * yInterval,
|
|
220
|
-
maxY: maxY + yOffset * yInterval,
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
11
|
//# sourceMappingURL=xyzAutoZonesPicking.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xyzAutoZonesPicking.js","sourceRoot":"","sources":["../../src/xyz/xyzAutoZonesPicking.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"xyzAutoZonesPicking.js","sourceRoot":"","sources":["../../src/xyz/xyzAutoZonesPicking.ts"],"names":[],"mappings":";;;AAAA,0BAA2C;AAK3C,kDAAgD;AAmEhD,SAAgB,mBAAmB,CACjC,WAAmB,EACnB,OAAmC;IAEnC,MAAM,OAAO,GAAG,IAAA,yBAAqB,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5D,OAAO,IAAA,wBAAW,EAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAND,kDAMC"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
export const MultiplicityPatterns = [
|
|
2
2
|
{ label: 'singlet', value: 's', multiplicity: 1, names: ['br s'] },
|
|
3
|
-
{ label: 'doublet', value: 'd', multiplicity: 2, names: [] },
|
|
4
3
|
{ label: 'triplet', value: 't', multiplicity: 3, names: [] },
|
|
4
|
+
{ label: 'doublet', value: 'd', multiplicity: 2, names: [] },
|
|
5
5
|
{ label: 'quartet', value: 'q', multiplicity: 4, names: [] },
|
|
6
6
|
{
|
|
7
7
|
label: 'quintet',
|
|
8
8
|
value: 'i',
|
|
9
|
+
acs: 'quint',
|
|
9
10
|
multiplicity: 5,
|
|
10
11
|
names: ['quint', 'qui', 'qnt', 'pentet', 'pnt', 'pent'],
|
|
11
12
|
},
|
|
@@ -18,6 +19,7 @@ export const MultiplicityPatterns = [
|
|
|
18
19
|
{
|
|
19
20
|
label: 'septet',
|
|
20
21
|
value: 'p',
|
|
22
|
+
acs: 'sept',
|
|
21
23
|
multiplicity: 7,
|
|
22
24
|
names: ['sept', 'spt', 'heptet', 'hpt', 'hept'],
|
|
23
25
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiplicityPatterns.js","sourceRoot":"","sources":["../../src/constants/MultiplicityPatterns.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MultiplicityPatterns.js","sourceRoot":"","sources":["../../src/constants/MultiplicityPatterns.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,oBAAoB,GAA0B;IACzD,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE;IAClE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IAC5D,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IAC5D,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IAC5D;QACE,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,GAAG;QACV,GAAG,EAAE,OAAO;QACZ,YAAY,EAAE,CAAC;QACf,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC;KACxD;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,GAAG;QACV,YAAY,EAAE,CAAC;QACf,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC;KACxC;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,GAAG;QACV,GAAG,EAAE,MAAM;QACX,YAAY,EAAE,CAAC;QACf,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC;KAChD;IACD,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE;IAC/D,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE;IAC/D,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;CAChE,CAAC"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import { MultiplicityPatterns } from './MultiplicityPatterns';
|
|
2
|
+
MultiplicityPatterns.sort((a, b) => a.multiplicity !== null && b.multiplicity !== null
|
|
3
|
+
? a.multiplicity - b.multiplicity
|
|
4
|
+
: Number.MAX_SAFE_INTEGER);
|
|
2
5
|
export const couplingPatterns = MultiplicityPatterns.map((m) => m.value);
|
|
6
|
+
export const couplingACSPatterns = MultiplicityPatterns.map((m) => m.acs || m.value);
|
|
3
7
|
//# sourceMappingURL=couplingPatterns.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"couplingPatterns.js","sourceRoot":"","sources":["../../src/constants/couplingPatterns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"couplingPatterns.js","sourceRoot":"","sources":["../../src/constants/couplingPatterns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACjC,CAAC,CAAC,YAAY,KAAK,IAAI,IAAI,CAAC,CAAC,YAAY,KAAK,IAAI;IAChD,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY;IACjC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAC5B,CAAC;AACF,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAEzE,MAAM,CAAC,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,GAAG,CACzD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CACxB,CAAC"}
|