nmr-processing 7.4.2 → 8.1.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.
Files changed (97) hide show
  1. package/lib/assignment/getAssignments.d.ts +6 -8
  2. package/lib/assignment/getAssignments.js +1 -1
  3. package/lib/assignment/getAssignments.js.map +1 -1
  4. package/lib/assignment/utils/getAssignment/buildAssignments.js +5 -0
  5. package/lib/assignment/utils/getAssignment/buildAssignments.js.map +1 -1
  6. package/lib/assignment/utils/getAssignment/checkIDs.js +5 -9
  7. package/lib/assignment/utils/getAssignment/checkIDs.js.map +1 -1
  8. package/lib/assignment/utils/getAssignment/formatData.js +30 -3
  9. package/lib/assignment/utils/getAssignment/formatData.js.map +1 -1
  10. package/lib/assignment/utils/getAssignment/partialScore.js +1 -1
  11. package/lib/assignment/utils/getAssignment/partialScore.js.map +1 -1
  12. package/lib/databases/getDatabase.d.ts +6 -1
  13. package/lib/databases/getDatabase.js +13 -3
  14. package/lib/databases/getDatabase.js.map +1 -1
  15. package/lib/index.d.ts +2 -2
  16. package/lib/index.js +1 -1
  17. package/lib/index.js.map +1 -1
  18. package/lib/peaks/NMRPeak1D.d.ts +0 -1
  19. package/lib/peaks/solventSuppression.d.ts +3 -0
  20. package/lib/peaks/solventSuppression.js +147 -0
  21. package/lib/peaks/solventSuppression.js.map +1 -0
  22. package/lib/peaks/util/jAnalyzer.d.ts +1 -1
  23. package/lib/prediction/predictAllSpectra.d.ts +22 -4
  24. package/lib/prediction/predictAllSpectra.js +102 -16
  25. package/lib/prediction/predictAllSpectra.js.map +1 -1
  26. package/lib/ranges/rangesToXY.js +27 -3
  27. package/lib/ranges/rangesToXY.js.map +1 -1
  28. package/lib/signals/addDummySignals.d.ts +2 -0
  29. package/lib/signals/addDummySignals.js +56 -0
  30. package/lib/signals/addDummySignals.js.map +1 -0
  31. package/lib/signals/hackSignalsToXY.js +2 -48
  32. package/lib/signals/hackSignalsToXY.js.map +1 -1
  33. package/lib/signals/simulation/simulate1D.d.ts +1 -39
  34. package/lib/signals/simulation/simulate1D.js +13 -240
  35. package/lib/signals/simulation/simulate1D.js.map +1 -1
  36. package/lib/signals/simulation/simulateXYPeaks.d.ts +47 -0
  37. package/lib/signals/simulation/simulateXYPeaks.js +246 -0
  38. package/lib/signals/simulation/simulateXYPeaks.js.map +1 -0
  39. package/lib/utilities/getFrequency.d.ts +1 -1
  40. package/lib/utilities/getFrequency.js +4 -4
  41. package/lib/utilities/getFrequency.js.map +1 -1
  42. package/lib/xyz/NMRSignal2D.d.ts +3 -3
  43. package/lib-esm/assignment/getAssignments.js +1 -1
  44. package/lib-esm/assignment/getAssignments.js.map +1 -1
  45. package/lib-esm/assignment/utils/getAssignment/buildAssignments.js +5 -0
  46. package/lib-esm/assignment/utils/getAssignment/buildAssignments.js.map +1 -1
  47. package/lib-esm/assignment/utils/getAssignment/checkIDs.js +5 -9
  48. package/lib-esm/assignment/utils/getAssignment/checkIDs.js.map +1 -1
  49. package/lib-esm/assignment/utils/getAssignment/formatData.js +30 -3
  50. package/lib-esm/assignment/utils/getAssignment/formatData.js.map +1 -1
  51. package/lib-esm/assignment/utils/getAssignment/partialScore.js +1 -1
  52. package/lib-esm/assignment/utils/getAssignment/partialScore.js.map +1 -1
  53. package/lib-esm/databases/getDatabase.js +13 -3
  54. package/lib-esm/databases/getDatabase.js.map +1 -1
  55. package/lib-esm/index.js +1 -1
  56. package/lib-esm/index.js.map +1 -1
  57. package/lib-esm/peaks/solventSuppression.js +140 -0
  58. package/lib-esm/peaks/solventSuppression.js.map +1 -0
  59. package/lib-esm/prediction/predictAllSpectra.js +102 -16
  60. package/lib-esm/prediction/predictAllSpectra.js.map +1 -1
  61. package/lib-esm/ranges/rangesToXY.js +27 -3
  62. package/lib-esm/ranges/rangesToXY.js.map +1 -1
  63. package/lib-esm/signals/addDummySignals.js +52 -0
  64. package/lib-esm/signals/addDummySignals.js.map +1 -0
  65. package/lib-esm/signals/hackSignalsToXY.js +2 -48
  66. package/lib-esm/signals/hackSignalsToXY.js.map +1 -1
  67. package/lib-esm/signals/simulation/simulate1D.js +14 -238
  68. package/lib-esm/signals/simulation/simulate1D.js.map +1 -1
  69. package/lib-esm/signals/simulation/simulateXYPeaks.js +239 -0
  70. package/lib-esm/signals/simulation/simulateXYPeaks.js.map +1 -0
  71. package/lib-esm/utilities/getFrequency.js +1 -1
  72. package/lib-esm/utilities/getFrequency.js.map +1 -1
  73. package/package.json +14 -12
  74. package/src/assignment/getAssignments.ts +8 -9
  75. package/src/assignment/utils/getAssignment/buildAssignments.ts +6 -0
  76. package/src/assignment/utils/getAssignment/checkIDs.ts +8 -8
  77. package/src/assignment/utils/getAssignment/formatData.ts +39 -3
  78. package/src/assignment/utils/getAssignment/partialScore.ts +2 -2
  79. package/src/databases/getDatabase.ts +19 -2
  80. package/src/index.ts +2 -2
  81. package/src/peaks/NMRPeak1D.ts +0 -1
  82. package/src/peaks/solventSuppression.ts +186 -0
  83. package/src/peaks/util/jAnalyzer.ts +1 -1
  84. package/src/prediction/predictAllSpectra.ts +151 -14
  85. package/src/ranges/rangesToXY.ts +33 -4
  86. package/src/signals/addDummySignals.ts +77 -0
  87. package/src/signals/hackSignalsToXY.ts +2 -72
  88. package/src/signals/simulation/simulate1D.ts +14 -319
  89. package/src/signals/simulation/simulateXYPeaks.ts +332 -0
  90. package/src/utilities/getFrequency.ts +1 -1
  91. package/src/xyz/NMRSignal2D.ts +3 -3
  92. package/lib/constants/gyromagneticRatio.d.ts +0 -6
  93. package/lib/constants/gyromagneticRatio.js +0 -26
  94. package/lib/constants/gyromagneticRatio.js.map +0 -1
  95. package/lib-esm/constants/gyromagneticRatio.js +0 -23
  96. package/lib-esm/constants/gyromagneticRatio.js.map +0 -1
  97. package/src/constants/gyromagneticRatio.ts +0 -49
@@ -0,0 +1,239 @@
1
+ import binarySearch from 'binary-search';
2
+ import { Matrix, EVD } from 'ml-matrix';
3
+ import { SparseMatrix } from 'ml-sparse-matrix';
4
+ import getPauliMatrix from './getPauliMatrix';
5
+ const smallValue = 1e-2;
6
+ export function simulateXYPeaks(
7
+ /**
8
+ * The SpinSystem object to be simulated
9
+ */
10
+ spinSystem, options = {}) {
11
+ let { lineWidth = 1, maxClusterSize = 8, frequency: frequencyMHz = 400, } = options;
12
+ const chemicalShifts = spinSystem.chemicalShifts.slice();
13
+ for (let i = 0; i < chemicalShifts.length; i++) {
14
+ chemicalShifts[i] = chemicalShifts[i] * frequencyMHz;
15
+ }
16
+ const multiplicity = spinSystem.multiplicity;
17
+ const xyPeaks = [];
18
+ for (const cluster of spinSystem.clusters) {
19
+ let clusterFake = cluster.map((cluster) => cluster < 0 ? -cluster - 1 : cluster);
20
+ let weight = 1;
21
+ let sumI = 0;
22
+ let frequencies = [];
23
+ let intensities = [];
24
+ if (cluster.length > maxClusterSize) {
25
+ // This is a single spin, but the cluster exceeds the maxClusterSize criteria
26
+ // we use the simple multiplicity algorithm
27
+ // Add the central peak. It will be split with every single J coupling.
28
+ let index = 0;
29
+ while (cluster[index++] < 0)
30
+ ;
31
+ index = cluster[index - 1];
32
+ frequencies.push(-chemicalShifts[index]);
33
+ for (let i = 0; i < cluster.length; i++) {
34
+ if (cluster[i] < 0) {
35
+ let jc = spinSystem.couplingConstants.get(index, clusterFake[i]) / 2;
36
+ let currentSize = frequencies.length;
37
+ for (let j = 0; j < currentSize; j++) {
38
+ frequencies.push(frequencies[j] + jc);
39
+ frequencies[j] -= jc;
40
+ }
41
+ }
42
+ }
43
+ frequencies.sort((a, b) => a - b);
44
+ sumI = frequencies.length;
45
+ weight = 1;
46
+ for (let i = 0; i < sumI; i++) {
47
+ intensities.push(1);
48
+ }
49
+ }
50
+ else {
51
+ const hamiltonian = getHamiltonian(chemicalShifts, spinSystem.couplingConstants, multiplicity, spinSystem.connectivity, clusterFake);
52
+ const hamSize = hamiltonian.rows;
53
+ // TODO: add support for sparse matrix in matrix types.
54
+ // @ts-expect-error sparse matrix not supported
55
+ const evd = new EVD(hamiltonian);
56
+ const V = evd.eigenvectorMatrix;
57
+ const diagB = evd.realEigenvalues;
58
+ const assignmentMatrix = new SparseMatrix(hamSize, hamSize);
59
+ const multLen = cluster.length;
60
+ weight = 0;
61
+ for (let n = 0; n < multLen; n++) {
62
+ const L = getPauliMatrix(multiplicity[clusterFake[n]]);
63
+ let temp = 1;
64
+ for (let j = 0; j < n; j++) {
65
+ temp *= multiplicity[clusterFake[j]];
66
+ }
67
+ const A = SparseMatrix.eye(temp);
68
+ temp = 1;
69
+ for (let j = n + 1; j < multLen; j++) {
70
+ temp *= multiplicity[clusterFake[j]];
71
+ }
72
+ const B = SparseMatrix.eye(temp);
73
+ const tempMat = A.kroneckerProduct(L.m).kroneckerProduct(B);
74
+ if (cluster[n] >= 0) {
75
+ assignmentMatrix.add(tempMat.mul(cluster[n] + 1));
76
+ weight++;
77
+ }
78
+ else {
79
+ assignmentMatrix.add(tempMat.mul(cluster[n]));
80
+ }
81
+ }
82
+ let rhoip = Matrix.zeros(hamSize, hamSize);
83
+ assignmentMatrix.forEachNonZero((i, j, v) => {
84
+ if (v > 0) {
85
+ for (let k = 0; k < V.columns; k++) {
86
+ let element = V.get(j, k);
87
+ if (element !== 0) {
88
+ rhoip.set(i, k, rhoip.get(i, k) + element);
89
+ }
90
+ }
91
+ }
92
+ return v;
93
+ });
94
+ let rhoip2 = rhoip.clone();
95
+ assignmentMatrix.forEachNonZero((i, j, v) => {
96
+ if (v < 0) {
97
+ for (let k = 0; k < V.columns; k++) {
98
+ let element = V.get(j, k);
99
+ if (element !== 0) {
100
+ rhoip2.set(i, k, rhoip2.get(i, k) + element);
101
+ }
102
+ }
103
+ }
104
+ return v;
105
+ });
106
+ const tV = V.transpose();
107
+ rhoip = tV.mmul(rhoip);
108
+ const sparseRhoip = new SparseMatrix(rhoip.to2DArray(), {
109
+ threshold: smallValue,
110
+ });
111
+ triuTimesAbs(sparseRhoip, smallValue);
112
+ rhoip2 = tV.mmul(rhoip2);
113
+ const sparseRhoip2 = new SparseMatrix(rhoip2.to2DArray(), {
114
+ threshold: smallValue,
115
+ });
116
+ sparseRhoip2.forEachNonZero((i, j, v) => {
117
+ return v;
118
+ });
119
+ triuTimesAbs(sparseRhoip2, smallValue);
120
+ sparseRhoip2.forEachNonZero((i, j, v) => {
121
+ let val = rhoip.get(i, j);
122
+ val = Math.min(Math.abs(val), Math.abs(v));
123
+ val *= val;
124
+ sumI += val;
125
+ let valFreq = diagB[i] - diagB[j];
126
+ let insertIn = binarySearch(frequencies, valFreq, (a, b) => a - b);
127
+ if (insertIn < 0) {
128
+ frequencies.splice(-1 - insertIn, 0, valFreq);
129
+ intensities.splice(-1 - insertIn, 0, val);
130
+ }
131
+ else {
132
+ intensities[insertIn] += val;
133
+ }
134
+ });
135
+ }
136
+ const numFreq = frequencies.length;
137
+ if (numFreq > 0) {
138
+ weight /= sumI;
139
+ const diff = lineWidth / 64;
140
+ let valFreq = frequencies[0];
141
+ let inte = intensities[0];
142
+ let count = 1;
143
+ for (let i = 1; i < numFreq; i++) {
144
+ if (Math.abs(frequencies[i] - valFreq / count) < diff) {
145
+ inte += intensities[i];
146
+ valFreq += frequencies[i];
147
+ count++;
148
+ }
149
+ else {
150
+ xyPeaks.push({
151
+ x: -valFreq / count / frequencyMHz,
152
+ y: inte * weight,
153
+ });
154
+ valFreq = frequencies[i];
155
+ inte = intensities[i];
156
+ count = 1;
157
+ }
158
+ }
159
+ xyPeaks.push({
160
+ x: -valFreq / count / frequencyMHz,
161
+ y: inte * weight,
162
+ });
163
+ }
164
+ }
165
+ return xyPeaks;
166
+ }
167
+ function triuTimesAbs(A, val) {
168
+ A.forEachNonZero((i, j, v) => {
169
+ if (i > j)
170
+ return 0;
171
+ if (Math.abs(v) <= val)
172
+ return 0;
173
+ return v;
174
+ });
175
+ }
176
+ /**
177
+ * Create a hamiltonian matrix for the given spinsystem
178
+ * @param {Array} chemicalShifts - An array containing the chemical shift in Hz
179
+ * @param {Array} couplingConstants - An array containing the coupling constants in Hz
180
+ * @param {Array} multiplicity - An array specifiying the multiplicities of each scalar coupling
181
+ * @param {Array} conMatrix - A one step connectivity matrix for the given spin system
182
+ * @param {Array} cluster - An binary array specifiying the spins to be considered for this hamiltonial
183
+ * @return {object}
184
+ */
185
+ function getHamiltonian(chemicalShifts, couplingConstants, multiplicity, conMatrix, cluster) {
186
+ let hamSize = 1;
187
+ for (const element of cluster) {
188
+ hamSize *= multiplicity[element];
189
+ }
190
+ const clusterHam = new SparseMatrix(hamSize, hamSize);
191
+ for (let pos = 0; pos < cluster.length; pos++) {
192
+ let n = cluster[pos];
193
+ const L = getPauliMatrix(multiplicity[n]);
194
+ let A1, B1;
195
+ let temp = 1;
196
+ for (let i = 0; i < pos; i++) {
197
+ temp *= multiplicity[cluster[i]];
198
+ }
199
+ A1 = SparseMatrix.eye(temp);
200
+ temp = 1;
201
+ for (let i = pos + 1; i < cluster.length; i++) {
202
+ temp *= multiplicity[cluster[i]];
203
+ }
204
+ B1 = SparseMatrix.eye(temp);
205
+ const alpha = chemicalShifts[n];
206
+ const kronProd = A1.kroneckerProduct(L.z).kroneckerProduct(B1);
207
+ clusterHam.add(kronProd.mul(alpha));
208
+ for (let pos2 = 0; pos2 < cluster.length; pos2++) {
209
+ const k = cluster[pos2];
210
+ if (conMatrix.get(n, k) === 1) {
211
+ const S = getPauliMatrix(multiplicity[k]);
212
+ let A2, B2;
213
+ let temp = 1;
214
+ for (let i = 0; i < pos2; i++) {
215
+ temp *= multiplicity[cluster[i]];
216
+ }
217
+ A2 = SparseMatrix.eye(temp);
218
+ temp = 1;
219
+ for (let i = pos2 + 1; i < cluster.length; i++) {
220
+ temp *= multiplicity[cluster[i]];
221
+ }
222
+ B2 = SparseMatrix.eye(temp);
223
+ const kron1 = A1.kroneckerProduct(L.x)
224
+ .kroneckerProduct(B1)
225
+ .mmul(A2.kroneckerProduct(S.x).kroneckerProduct(B2));
226
+ kron1.add(A1.kroneckerProduct(L.y)
227
+ .kroneckerProduct(B1)
228
+ .mul(-1)
229
+ .mmul(A2.kroneckerProduct(S.y).kroneckerProduct(B2)));
230
+ kron1.add(A1.kroneckerProduct(L.z)
231
+ .kroneckerProduct(B1)
232
+ .mmul(A2.kroneckerProduct(S.z).kroneckerProduct(B2)));
233
+ clusterHam.add(kron1.mul(couplingConstants.get(n, k) / 2));
234
+ }
235
+ }
236
+ }
237
+ return clusterHam;
238
+ }
239
+ //# sourceMappingURL=simulateXYPeaks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulateXYPeaks.js","sourceRoot":"","sources":["../../../src/signals/simulation/simulateXYPeaks.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { gyromagneticRatio } from '../constants/gyromagneticRatio';
1
+ import { gyromagneticRatio } from 'gyromagnetic-ratio';
2
2
  /**
3
3
  * calculate the frequency of a nucleus with respect to a reference nucleus
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"getFrequency.js","sourceRoot":"","sources":["../../src/utilities/getFrequency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAU,MAAM,gCAAgC,CAAC;AAgB3E;;GAEG;AACH,MAAM,UAAU,YAAY;AAC1B;;GAEG;AACH,OAAgB,EAChB,mBAAwC;IAExC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC;IAE/D,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAEpC,OAAO,CACL,CAAC,SAAS,GAAG,iBAAiB,CAAC,OAAiB,CAAC,CAAC;QAClD,iBAAiB,CAAC,UAAoB,CAAC,CACxC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAG,OAAkB;IAC3C,IAAI,MAAM,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;QACvB,IAAI,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,EAAE;YAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAChB;KACF;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;KAC3D;AACH,CAAC"}
1
+ {"version":3,"file":"getFrequency.js","sourceRoot":"","sources":["../../src/utilities/getFrequency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAU,MAAM,oBAAoB,CAAC;AAgB/D;;GAEG;AACH,MAAM,UAAU,YAAY;AAC1B;;GAEG;AACH,OAAgB,EAChB,mBAAwC;IAExC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,mBAAmB,CAAC;IAE/D,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAEpC,OAAO,CACL,CAAC,SAAS,GAAG,iBAAiB,CAAC,OAAiB,CAAC,CAAC;QAClD,iBAAiB,CAAC,UAAoB,CAAC,CACxC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAG,OAAkB;IAC3C,IAAI,MAAM,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;QACvB,IAAI,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,EAAE;YAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAChB;KACF;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;KAC3D;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nmr-processing",
3
- "version": "7.4.2",
3
+ "version": "8.1.0",
4
4
  "description": "Pure functions allowing to process NMR spectra.",
5
5
  "main": "./lib/index.js",
6
6
  "module": "./lib-esm/index.js",
@@ -38,44 +38,46 @@
38
38
  },
39
39
  "homepage": "https://github.com/cheminfo/nmr-processing#readme",
40
40
  "devDependencies": {
41
- "@types/jest": "^27.4.1",
41
+ "@types/jest": "^27.5.0",
42
42
  "cheminfo-build": "^1.1.11",
43
43
  "cheminfo-types": "^1.1.0",
44
- "eslint": "^8.11.0",
44
+ "eslint": "^8.14.0",
45
45
  "eslint-config-cheminfo-typescript": "^10.4.0",
46
- "jest": "^27.5.1",
46
+ "jest": "^28.0.3",
47
47
  "jest-matcher-deep-close-to": "^3.0.2",
48
48
  "md5": "^2.3.0",
49
49
  "ml-array-median": "^1.1.6",
50
50
  "nmr-xy-testdata": "^0.5.1",
51
51
  "openchemlib": "^7.4.3",
52
- "prettier": "^2.6.1",
52
+ "prettier": "^2.6.2",
53
53
  "rimraf": "^3.0.2",
54
- "ts-jest": "^27.1.4",
55
- "typescript": "^4.6.3"
54
+ "ts-jest": "^28.0.1",
55
+ "typescript": "^4.6.4"
56
56
  },
57
57
  "dependencies": {
58
58
  "binary-search": "^1.3.6",
59
59
  "cross-fetch": "^3.1.5",
60
60
  "form-data": "^4.0.0",
61
+ "gyromagnetic-ratio": "^1.0.0",
61
62
  "is-any-array": "^2.0.0",
63
+ "linear-sum-assignment": "^1.0.3",
62
64
  "ml-array-mean": "^1.1.6",
63
65
  "ml-array-rescale": "^1.3.7",
64
66
  "ml-array-sequential-fill": "^1.1.8",
65
67
  "ml-array-sum": "^1.1.6",
66
- "ml-gsd": "^10.2.0",
68
+ "ml-gsd": "^11.2.0",
67
69
  "ml-hclust": "^3.1.0",
68
70
  "ml-levenberg-marquardt": "^4.1.0",
69
- "ml-matrix": "^6.9.0",
71
+ "ml-matrix": "^6.10.0",
70
72
  "ml-matrix-convolution": "^1.0.0",
71
73
  "ml-matrix-peaks-finder": "^1.0.0",
72
74
  "ml-peak-shape-generator": "^4.1.1",
73
75
  "ml-simple-clustering": "^0.1.0",
74
76
  "ml-sparse-matrix": "^2.1.0",
75
- "ml-spectra-processing": "^11.1.0",
77
+ "ml-spectra-processing": "^11.5.0",
76
78
  "ml-tree-set": "^0.1.1",
77
79
  "nmr-correlation": "^2.2.5",
78
- "openchemlib-utils": "^1.10.0",
79
- "spectrum-generator": "^8.0.0"
80
+ "openchemlib-utils": "^1.11.0",
81
+ "spectrum-generator": "^8.0.2"
80
82
  }
81
83
  }
@@ -19,23 +19,22 @@ import getWorkFlow from './utils/getAssignment/getWorkFlow';
19
19
  export interface SpectraData1D {
20
20
  id?: string;
21
21
  ranges: NMRRange[];
22
- info?: any;
22
+ info: any;
23
23
  }
24
24
 
25
25
  export interface SpectraData2D {
26
26
  id?: string;
27
27
  zones: NMRZone[];
28
- info?: any;
28
+ /**
29
+ * object with information about the spectrum, it is mandatory at the moment
30
+ * to generate correlations.
31
+ */
32
+ info: any;
29
33
  }
30
34
 
31
35
  export type SpectraData = SpectraData1D | SpectraData2D;
32
36
 
33
37
  export interface GetAutoAssignmentInput {
34
- /**
35
- * It has the number of each atoms in the chemical structure. e.g. { C: 6, H: 6 }
36
- */
37
- atoms?: { [key: string]: number };
38
-
39
38
  spectra: SpectraData[];
40
39
  /**
41
40
  * Instance of Molecule
@@ -96,7 +95,7 @@ export async function getAssignments(
96
95
  let {
97
96
  restrictionByCS = {},
98
97
  justAssign,
99
- minScore = 1,
98
+ minScore = 0.01,
100
99
  maxSolutions = 10,
101
100
  nbAllowedUnAssigned,
102
101
  timeout = 6000,
@@ -119,11 +118,11 @@ export async function getAssignments(
119
118
  addDiastereotopicMissingChirality(molecule);
120
119
 
121
120
  const spectra = checkIDs(input.spectra);
122
-
123
121
  const { targets, correlations } = getTargetsAndCorrelations(
124
122
  spectra,
125
123
  correlationOptions,
126
124
  );
125
+
127
126
  const { assignmentOrder } = getWorkFlow(correlations, justAssign);
128
127
 
129
128
  const solutions = await buildAssignments({
@@ -159,10 +159,13 @@ export async function buildAssignments(props: BuildAssignmentInput) {
159
159
  checkNMRSignal1D(joinedSignals);
160
160
 
161
161
  if (!predictions[atomType]) predictions[atomType] = {};
162
+
163
+ let totalHydrogens = 0;
162
164
  for (let prediction of joinedSignals) {
163
165
  const diaID = prediction.diaIDs[0];
164
166
  const index = prediction.atoms[0];
165
167
  const allHydrogens = getAllHydrogens[atomType](molecule, index);
168
+ totalHydrogens += prediction.nbAtoms * allHydrogens;
166
169
  predictions[atomType][diaID] = {
167
170
  ...prediction,
168
171
  diaIDIndex: index,
@@ -171,6 +174,9 @@ export async function buildAssignments(props: BuildAssignmentInput) {
171
174
  pathLength: pathLengthMatrix[index] as number[],
172
175
  };
173
176
  }
177
+ for (let diaID in predictions[atomType]) {
178
+ predictions[atomType][diaID].allHydrogens *= 100 / totalHydrogens;
179
+ }
174
180
  infoByAtomType[atomType] = {
175
181
  nSources: joinedSignals.length,
176
182
  currentIndex: 0,
@@ -13,16 +13,16 @@ export function checkIDs(input: SpectraData[] = []): SpectraDataWithIds[] {
13
13
  let inputClone = JSON.parse(JSON.stringify(input)) as SpectraData[];
14
14
  let spectra: SpectraDataWithIds[] = [];
15
15
  for (const spectraData of inputClone) {
16
+ if (!('info' in spectraData)) {
17
+ throw new Error(
18
+ 'each spectrum should contain info properties with nucleus information',
19
+ );
20
+ }
21
+
16
22
  const { info, id } = spectraData;
17
23
  if (isSpectraData1D(spectraData)) {
18
- let data = addIDs(spectraData.ranges) as NMRRangeWithIds[];
19
- for (const element of data) {
20
- const { integration } = element;
21
- for (let signal of element.signals || []) {
22
- if (!signal.integration) signal.integration = integration;
23
- }
24
- }
25
- spectra.push({ id, info, ranges: data });
24
+ let ranges = addIDs(spectraData.ranges) as NMRRangeWithIds[];
25
+ spectra.push({ id, info, ranges });
26
26
  } else {
27
27
  let data = addIDs(spectraData.zones) as NMRZoneWithIds[];
28
28
  spectra.push({ id, info, zones: data });
@@ -25,12 +25,48 @@ export function formatData(
25
25
  let inputClone = JSON.parse(JSON.stringify(input)) as SpectraDataWithIds[];
26
26
  let spectra: SpectraDataFormatted[] = [];
27
27
  for (const spectraData of inputClone) {
28
- const { info } = spectraData;
28
+ const { id, info } = spectraData;
29
29
  if (isSpectraData1D(spectraData)) {
30
- spectra.push({ info, ranges: { values: spectraData.ranges } });
30
+ const ranges = rescaleIntegration({
31
+ id,
32
+ info,
33
+ ranges: spectraData.ranges,
34
+ });
35
+ spectra.push({ id, info, ranges: { values: ranges } });
31
36
  } else {
32
- spectra.push({ info, zones: { values: spectraData.zones } });
37
+ spectra.push({ id, info, zones: { values: spectraData.zones } });
33
38
  }
34
39
  }
35
40
  return spectra;
36
41
  }
42
+
43
+ function rescaleIntegration(spectrum: SpectraData1DWithIds): NMRRangeWithIds[] {
44
+ if (spectrum.info.nucleus !== '1H') return spectrum.ranges;
45
+
46
+ let totalIntegration = spectrum.ranges.reduce(
47
+ (total, range) => (range.integration ? total + range.integration : total),
48
+ 0,
49
+ );
50
+
51
+ for (let range of spectrum.ranges) {
52
+ if (range.integration) {
53
+ range.integration *= 100 / totalIntegration;
54
+ if (range.signals) {
55
+ const totalSignalIntegration = range.signals.reduce(
56
+ (total, signal) =>
57
+ signal.integration ? total + signal.integration : total,
58
+ 0,
59
+ );
60
+ for (let signal of range.signals) {
61
+ if (signal.integration) {
62
+ signal.integration *= range.integration / totalSignalIntegration;
63
+ } else {
64
+ signal.integration = range.integration;
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+
71
+ return spectrum.ranges;
72
+ }
@@ -114,9 +114,9 @@ export function partialScore(partial: Partial, props: PartialScoreOptions) {
114
114
  }
115
115
  }
116
116
  }
117
+
117
118
  for (const group of targetByIntegral) {
118
119
  const { integration, atomType } = group;
119
-
120
120
  if (integration === undefined || isNaN(integration)) continue;
121
121
 
122
122
  let total = 0;
@@ -128,7 +128,7 @@ export function partialScore(partial: Partial, props: PartialScoreOptions) {
128
128
  if (atomType === atomOfPrediction) total += prediction.allHydrogens;
129
129
  }
130
130
  }
131
- if (total - integration >= 0.5) {
131
+ if (total - integration >= 5) {
132
132
  return 0;
133
133
  }
134
134
  }
@@ -6,16 +6,33 @@ import { DatabaseNMREntry } from './DatabaseNMREntry';
6
6
 
7
7
  export async function getDatabase(
8
8
  url = 'https://docs.google.com/spreadsheets/d/1uwyq_L38PMRWCcT4If_EhPbHKyY3q_2tpjV8vr5_zh0/edit?usp=sharing',
9
+ options: {
10
+ /**
11
+ * @default 'tsv'
12
+ */
13
+ format?: 'tsv' | 'json';
14
+ } = {},
9
15
  ) {
16
+ const { format = 'tsv' } = options;
17
+
10
18
  if (url.includes('google.com')) {
11
19
  url = `https://googledocs.cheminfo.org/spreadsheets/d/${extractGoogleUUID(
12
20
  url,
13
21
  )}/export?format=tsv`;
14
22
  }
15
23
 
24
+ let parsed;
16
25
  const response = await fetch(url);
17
- const result = await response.text();
18
- const parsed = parseData(result);
26
+ switch (format) {
27
+ case 'tsv':
28
+ parsed = parseData(await response.text());
29
+ break;
30
+ case 'json':
31
+ parsed = await response.json();
32
+ break;
33
+ default:
34
+ throw new Error('unknown database format');
35
+ }
19
36
 
20
37
  const results = [];
21
38
 
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from './constants/gyromagneticRatio';
1
+ export * from 'gyromagnetic-ratio';
2
2
  export * from './constants/impurities';
3
3
  export * from './constants/couplingPatterns';
4
4
 
@@ -38,7 +38,7 @@ export * from './databases/carbonImpurities';
38
38
  export * from './databases/protonImpurities';
39
39
 
40
40
  export type { NMRSignal1D } from './signals/NMRSignal1D';
41
- export type { NMRSignal2D, Signal2DAxisData } from './xyz/NMRSignal2D';
41
+ export type { NMRSignal2D, Signal2DProjection } from './xyz/NMRSignal2D';
42
42
  export type { NMRRange } from './xy/NMRRange';
43
43
  export type { NMRZone } from './xyz/NMRZone';
44
44
  export type { NMRPeak1D } from './peaks/NMRPeak1D';
@@ -3,6 +3,5 @@ import type { Shape1D } from 'ml-peak-shape-generator';
3
3
 
4
4
  export interface NMRPeak1D extends PeakXYWidth {
5
5
  kind?: string;
6
- fwhm?: number;
7
6
  shape?: Shape1D;
8
7
  }