nmr-processing 8.1.0 → 8.3.1

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 (162) hide show
  1. package/README.md +23 -3
  2. package/lib/apodization/apodization.d.ts +22 -0
  3. package/lib/apodization/apodization.js +18 -0
  4. package/lib/apodization/apodization.js.map +1 -0
  5. package/lib/apodization/applyWindow.d.ts +28 -0
  6. package/lib/apodization/applyWindow.js +20 -0
  7. package/lib/apodization/applyWindow.js.map +1 -0
  8. package/lib/apodization/compose.d.ts +23 -0
  9. package/lib/apodization/compose.js +25 -0
  10. package/lib/apodization/compose.js.map +1 -0
  11. package/lib/apodization/getFunction.d.ts +2 -0
  12. package/lib/apodization/getFunction.js +18 -0
  13. package/lib/apodization/getFunction.js.map +1 -0
  14. package/lib/apodization/shapes/WindowFunctions.d.ts +12 -0
  15. package/lib/apodization/shapes/WindowFunctions.js +3 -0
  16. package/lib/apodization/shapes/WindowFunctions.js.map +1 -0
  17. package/lib/apodization/shapes/exponential.d.ts +11 -0
  18. package/lib/apodization/shapes/exponential.js +10 -0
  19. package/lib/apodization/shapes/exponential.js.map +1 -0
  20. package/lib/apodization/shapes/lorentzToGauss.d.ts +26 -0
  21. package/lib/apodization/shapes/lorentzToGauss.js +15 -0
  22. package/lib/apodization/shapes/lorentzToGauss.js.map +1 -0
  23. package/lib/apodization/utils/getData.d.ts +4 -0
  24. package/lib/apodization/utils/getData.js +21 -0
  25. package/lib/apodization/utils/getData.js.map +1 -0
  26. package/lib/assignment/utils/buildAssignments.d.ts +2 -2
  27. package/lib/assignment/utils/exploreTreeRec.js +1 -1
  28. package/lib/assignment/utils/exploreTreeRec.js.map +1 -1
  29. package/lib/assignment/utils/getAssignment/checkIDs.d.ts +1 -1
  30. package/lib/assignment/utils/getAssignment/checkIDs.js.map +1 -1
  31. package/lib/databases/DatabaseNMREntry.d.ts +2 -0
  32. package/lib/index.d.ts +3 -0
  33. package/lib/index.js +3 -0
  34. package/lib/index.js.map +1 -1
  35. package/lib/peaks/peaksToRanges.d.ts +16 -0
  36. package/lib/peaks/peaksToRanges.js +3 -2
  37. package/lib/peaks/peaksToRanges.js.map +1 -1
  38. package/lib/peaks/solventSuppression.d.ts +4 -1
  39. package/lib/peaks/solventSuppression.js +43 -32
  40. package/lib/peaks/solventSuppression.js.map +1 -1
  41. package/lib/peaks/util/jAnalyzer.js +26 -31
  42. package/lib/peaks/util/jAnalyzer.js.map +1 -1
  43. package/lib/peaks/util/peakOptimizer.js +12 -16
  44. package/lib/peaks/util/peakOptimizer.js.map +1 -1
  45. package/lib/prediction/predictAllSpectra.js +7 -9
  46. package/lib/prediction/predictAllSpectra.js.map +1 -1
  47. package/lib/prediction/predictCarbon.js +1 -1
  48. package/lib/prediction/predictCarbon.js.map +1 -1
  49. package/lib/prediction/utils/queryByHOSE.js +1 -1
  50. package/lib/prediction/utils/queryByHOSE.js.map +1 -1
  51. package/lib/ranges/markSolventSignal.d.ts +3 -0
  52. package/lib/ranges/markSolventSignal.js +107 -0
  53. package/lib/ranges/markSolventSignal.js.map +1 -0
  54. package/lib/ranges/rangesToACS.js +8 -4
  55. package/lib/ranges/rangesToACS.js.map +1 -1
  56. package/lib/signals/signalsJoin.js +4 -3
  57. package/lib/signals/signalsJoin.js.map +1 -1
  58. package/lib/signals/simulation/getPauliMatrix.js.map +1 -1
  59. package/lib/signals/simulation/splitSpinSystem.js +11 -13
  60. package/lib/signals/simulation/splitSpinSystem.js.map +1 -1
  61. package/lib/utilities/rangeFromSignal.d.ts +9 -5
  62. package/lib/utilities/rangeFromSignal.js +7 -7
  63. package/lib/utilities/rangeFromSignal.js.map +1 -1
  64. package/lib/utilities/resurrectRange.js +4 -7
  65. package/lib/utilities/resurrectRange.js.map +1 -1
  66. package/lib/xyz/util/formatZone.d.ts +3 -0
  67. package/lib/xyz/util/formatZone.js +38 -0
  68. package/lib/xyz/util/formatZone.js.map +1 -0
  69. package/lib/xyz/xyzAutoZonesPicking.d.ts +1 -2
  70. package/lib/xyz/xyzAutoZonesPicking.js +2 -34
  71. package/lib/xyz/xyzAutoZonesPicking.js.map +1 -1
  72. package/lib/xyz/xyzJResAnalyzer.d.ts +6 -1
  73. package/lib/xyz/xyzJResAnalyzer.js +9 -8
  74. package/lib/xyz/xyzJResAnalyzer.js.map +1 -1
  75. package/lib-esm/apodization/apodization.js +14 -0
  76. package/lib-esm/apodization/apodization.js.map +1 -0
  77. package/lib-esm/apodization/applyWindow.js +16 -0
  78. package/lib-esm/apodization/applyWindow.js.map +1 -0
  79. package/lib-esm/apodization/compose.js +21 -0
  80. package/lib-esm/apodization/compose.js.map +1 -0
  81. package/lib-esm/apodization/getFunction.js +14 -0
  82. package/lib-esm/apodization/getFunction.js.map +1 -0
  83. package/lib-esm/apodization/shapes/WindowFunctions.js +2 -0
  84. package/lib-esm/apodization/shapes/WindowFunctions.js.map +1 -0
  85. package/lib-esm/apodization/shapes/exponential.js +6 -0
  86. package/lib-esm/apodization/shapes/exponential.js.map +1 -0
  87. package/lib-esm/apodization/shapes/lorentzToGauss.js +11 -0
  88. package/lib-esm/apodization/shapes/lorentzToGauss.js.map +1 -0
  89. package/lib-esm/apodization/utils/getData.js +17 -0
  90. package/lib-esm/apodization/utils/getData.js.map +1 -0
  91. package/lib-esm/assignment/utils/buildAssignments.js +3 -3
  92. package/lib-esm/assignment/utils/exploreTreeRec.js +1 -1
  93. package/lib-esm/assignment/utils/exploreTreeRec.js.map +1 -1
  94. package/lib-esm/assignment/utils/getAssignment/buildAssignments.js +3 -3
  95. package/lib-esm/assignment/utils/getAssignment/checkIDs.js.map +1 -1
  96. package/lib-esm/index.js +3 -0
  97. package/lib-esm/index.js.map +1 -1
  98. package/lib-esm/peaks/peaksToRanges.js +2 -2
  99. package/lib-esm/peaks/peaksToRanges.js.map +1 -1
  100. package/lib-esm/peaks/solventSuppression.js +41 -27
  101. package/lib-esm/peaks/solventSuppression.js.map +1 -1
  102. package/lib-esm/peaks/util/jAnalyzer.js +26 -31
  103. package/lib-esm/peaks/util/jAnalyzer.js.map +1 -1
  104. package/lib-esm/peaks/util/peakOptimizer.js +12 -16
  105. package/lib-esm/peaks/util/peakOptimizer.js.map +1 -1
  106. package/lib-esm/prediction/predictAllSpectra.js +7 -9
  107. package/lib-esm/prediction/predictAllSpectra.js.map +1 -1
  108. package/lib-esm/prediction/predictCarbon.js +1 -1
  109. package/lib-esm/prediction/predictCarbon.js.map +1 -1
  110. package/lib-esm/prediction/utils/queryByHOSE.js +1 -1
  111. package/lib-esm/prediction/utils/queryByHOSE.js.map +1 -1
  112. package/lib-esm/ranges/markSolventSignal.js +100 -0
  113. package/lib-esm/ranges/markSolventSignal.js.map +1 -0
  114. package/lib-esm/ranges/rangesToACS.js +8 -4
  115. package/lib-esm/ranges/rangesToACS.js.map +1 -1
  116. package/lib-esm/signals/signalsJoin.js +4 -3
  117. package/lib-esm/signals/signalsJoin.js.map +1 -1
  118. package/lib-esm/signals/simulation/getPauliMatrix.js.map +1 -1
  119. package/lib-esm/signals/simulation/splitSpinSystem.js +11 -13
  120. package/lib-esm/signals/simulation/splitSpinSystem.js.map +1 -1
  121. package/lib-esm/utilities/rangeFromSignal.js +7 -7
  122. package/lib-esm/utilities/rangeFromSignal.js.map +1 -1
  123. package/lib-esm/utilities/resurrectRange.js +4 -7
  124. package/lib-esm/utilities/resurrectRange.js.map +1 -1
  125. package/lib-esm/xyz/util/formatZone.js +34 -0
  126. package/lib-esm/xyz/util/formatZone.js.map +1 -0
  127. package/lib-esm/xyz/xyzAutoZonesPicking.js +1 -33
  128. package/lib-esm/xyz/xyzAutoZonesPicking.js.map +1 -1
  129. package/lib-esm/xyz/xyzJResAnalyzer.js +9 -8
  130. package/lib-esm/xyz/xyzJResAnalyzer.js.map +1 -1
  131. package/package.json +14 -14
  132. package/src/apodization/apodization.ts +34 -0
  133. package/src/apodization/applyWindow.ts +51 -0
  134. package/src/apodization/compose.ts +47 -0
  135. package/src/apodization/getFunction.ts +15 -0
  136. package/src/apodization/shapes/WindowFunctions.ts +14 -0
  137. package/src/apodization/shapes/exponential.ts +16 -0
  138. package/src/apodization/shapes/lorentzToGauss.ts +41 -0
  139. package/src/apodization/utils/getData.ts +15 -0
  140. package/src/assignment/utils/buildAssignments.ts +4 -4
  141. package/src/assignment/utils/exploreTreeRec.ts +1 -1
  142. package/src/assignment/utils/getAssignment/buildAssignments.ts +3 -3
  143. package/src/assignment/utils/getAssignment/checkIDs.ts +1 -1
  144. package/src/databases/DatabaseNMREntry.ts +3 -0
  145. package/src/index.ts +5 -0
  146. package/src/peaks/peaksToRanges.ts +2 -2
  147. package/src/peaks/solventSuppression.ts +68 -40
  148. package/src/peaks/util/jAnalyzer.ts +26 -30
  149. package/src/peaks/util/peakOptimizer.ts +11 -15
  150. package/src/prediction/predictAllSpectra.ts +6 -8
  151. package/src/prediction/predictCarbon.ts +1 -1
  152. package/src/prediction/utils/queryByHOSE.ts +1 -1
  153. package/src/ranges/markSolventSignal.ts +121 -0
  154. package/src/ranges/rangesToACS.ts +9 -10
  155. package/src/signals/signalsJoin.ts +5 -7
  156. package/src/signals/simulation/getPauliMatrix.ts +1 -1
  157. package/src/signals/simulation/splitSpinSystem.ts +10 -12
  158. package/src/utilities/rangeFromSignal.ts +19 -11
  159. package/src/utilities/resurrectRange.ts +4 -7
  160. package/src/xyz/util/formatZone.ts +36 -0
  161. package/src/xyz/xyzAutoZonesPicking.ts +1 -35
  162. package/src/xyz/xyzJResAnalyzer.ts +14 -7
@@ -0,0 +1,121 @@
1
+ import { NMRRangeWithIds, NMRSignal1DWithId } from '../assignment/nmrAssigment';
2
+ import generateID from '../assignment/utils/generateID';
3
+ import { addIDs } from '../assignment/utils/getAssignment/checkIDs';
4
+ import { NMRPeak1D } from '../peaks/NMRPeak1D';
5
+ import { detectSignals } from '../peaks/peaksToRanges';
6
+ import { solventSuppression } from '../peaks/solventSuppression';
7
+ import { SignalIntern } from '../peaks/util/jAnalyzer';
8
+ import { NMRSignal1D } from '../signals/NMRSignal1D';
9
+ import { NMRRange } from '../xy/NMRRange';
10
+
11
+ interface NMRPeak1DWithSignalID extends NMRPeak1D {
12
+ signalID: string;
13
+ rangeID: string;
14
+ }
15
+
16
+ export function markSolventPeaks<T extends NMRRange>(
17
+ input: T[],
18
+ solventSignals: NMRSignal1D[],
19
+ options: any = {},
20
+ ) {
21
+ const { frequency = 400 } = options;
22
+ const ranges = addIDs([...input]) as NMRRangeWithIds[];
23
+
24
+ let peakList: NMRPeak1DWithSignalID[] = [];
25
+ for (const range of ranges) {
26
+ const rangeID = range.id;
27
+ for (const signal of range.signals || []) {
28
+ const signalID = signal.id;
29
+ for (let peak of signal.peaks || []) {
30
+ peakList.push({
31
+ ...peak,
32
+ rangeID,
33
+ signalID,
34
+ });
35
+ }
36
+ }
37
+ }
38
+
39
+ const peaks = solventSuppression(peakList, solventSignals, {
40
+ markSolventPeaks: true,
41
+ });
42
+
43
+ const signalsWithSolvent = getSignalIDsWithSolvent(peaks);
44
+ for (let range of ranges) {
45
+ if (!range.signals) continue;
46
+ for (let signal of range.signals) {
47
+ if (!signalsWithSolvent.includes(signal.id)) continue;
48
+ const signalPeaks = [];
49
+ const solventSignalPeaks = [];
50
+ for (let peak of peaks) {
51
+ if (peak.signalID === signal.id) {
52
+ const { signalID, rangeID, ...newPeak } = peak;
53
+ if (peak.kind === 'solvent') {
54
+ solventSignalPeaks.push(newPeak);
55
+ } else {
56
+ signalPeaks.push(newPeak);
57
+ }
58
+ }
59
+ }
60
+ const newSignals =
61
+ signalPeaks.length > 0
62
+ ? detectSignals({ x: [], y: [] }, signalPeaks, {
63
+ integralType: 'peak',
64
+ frequency,
65
+ })
66
+ : [];
67
+ solventSignalPeaks.sort((a, b) => a.x - b.x);
68
+ const lowPPMValue = solventSignalPeaks[0].x;
69
+ const highPPMValue = solventSignalPeaks[solventSignalPeaks.length - 1].x;
70
+ const newSolventSignals = detectSignals(
71
+ { x: [], y: [] },
72
+ solventSignalPeaks,
73
+ {
74
+ integralType: 'peak',
75
+ frequencyCluster: (highPPMValue - lowPPMValue) * frequency,
76
+ frequency,
77
+ },
78
+ );
79
+
80
+ range.signals = [
81
+ ...adaptSignals(newSignals),
82
+ ...adaptSignals(newSolventSignals),
83
+ ...range.signals.filter((currSignal) => currSignal.id !== signal.id),
84
+ ];
85
+ }
86
+ }
87
+ return ranges as T[];
88
+ }
89
+
90
+ function getSignalIDsWithSolvent(solventPeaks: NMRPeak1DWithSignalID[]) {
91
+ const uniqueSignalID = new Set();
92
+ for (let peak of solventPeaks) {
93
+ if (peak.kind !== 'solvent') continue;
94
+ uniqueSignalID.add(peak.signalID);
95
+ }
96
+ return Array.from(uniqueSignalID);
97
+ }
98
+
99
+ function adaptSignals(signals: SignalIntern[]) {
100
+ const newSignals = [];
101
+ for (let signal of signals) {
102
+ const signalResult: NMRSignal1DWithId = {
103
+ id: generateID(),
104
+ delta: signal.delta,
105
+ kind: signal.kind || 'signal',
106
+ multiplicity: signal.multiplicity,
107
+ integration: signal.integralData.value,
108
+ };
109
+ signalResult.peaks = signal.peaks.map((peak) => {
110
+ const newResult: any = {
111
+ y: peak.intensity,
112
+ ...peak,
113
+ };
114
+ delete newResult.intensity;
115
+ return newResult as NMRPeak1D;
116
+ });
117
+ signalResult.js = signal.nmrJs || [];
118
+ newSignals.push(signalResult);
119
+ }
120
+ return newSignals;
121
+ }
@@ -72,12 +72,12 @@ export function rangesToACS(
72
72
  if (!options.nucleus) options.nucleus = '1H';
73
73
  const nucleus = options.nucleus.toLowerCase().replace(/[0-9]/g, '');
74
74
  const defaultOptions = globalOptions[nucleus];
75
- options = Object.assign(
76
- {},
77
- defaultOptions,
78
- { ascending: false, format: 'IMJA' },
79
- options,
80
- );
75
+ options = {
76
+ ...defaultOptions,
77
+ ascending: false,
78
+ format: 'IMJA',
79
+ ...options,
80
+ };
81
81
 
82
82
  ranges = JSON.parse(JSON.stringify(ranges));
83
83
  if (options.ascending === true) {
@@ -188,14 +188,13 @@ function pushDelta(range: NMRRange, acsRanges: string[], options: any) {
188
188
  acsRanges.push(strings);
189
189
  }
190
190
 
191
- function getIntegral(range: NMRRange, options: any) {
191
+ function getIntegral(range: NMRRange, options: { nucleus: string[] }) {
192
192
  let integration = '';
193
193
  if (range.pubIntegral) {
194
194
  integration = String(range.pubIntegral);
195
195
  } else if (range.integration) {
196
- integration =
197
- range.integration.toFixed(0) +
198
- options.nucleus[options.nucleus.length - 1];
196
+ const { nucleus } = options;
197
+ integration = range.integration.toFixed(0) + nucleus[nucleus.length - 1];
199
198
  }
200
199
  return integration;
201
200
  }
@@ -62,7 +62,7 @@ export function signalsJoin(
62
62
  JSON.stringify(signals),
63
63
  );
64
64
 
65
- const groupedSignals: { [index: string]: Signal1DWidthJsAndDiaID[] } = {};
65
+ const groupedSignals: Record<string, Signal1DWidthJsAndDiaID[]> = {};
66
66
 
67
67
  for (let signal of copySignals) {
68
68
  signal.js = signal.js.sort(localeCompareJcouplingKeys);
@@ -117,12 +117,10 @@ export function signalsJoin(
117
117
  ignoreDiaIDs,
118
118
  }) as Signal1DWidthJsAndDiaID;
119
119
  if (newSignal.js) {
120
- newSignal.multiplicity = newSignal.js.reduce(
121
- (multiplicity, jCoupling) => {
122
- return `${multiplicity}${jCoupling.multiplicity}`;
123
- },
124
- '',
125
- );
120
+ newSignal.multiplicity =
121
+ newSignal.js.length > 0
122
+ ? newSignal.js.map((j) => j.multiplicity).join('')
123
+ : 's';
126
124
  }
127
125
  return newSignal;
128
126
  })
@@ -2,7 +2,7 @@ import { SparseMatrix } from 'ml-sparse-matrix';
2
2
 
3
3
  function createPauli(mult: number) {
4
4
  const spin = (mult - 1) / 2;
5
- const prjs = new Array(mult);
5
+ const prjs: number[] = new Array(mult);
6
6
  const temp = new Array(mult);
7
7
  for (let i = 0; i < mult; i++) {
8
8
  prjs[i] = mult - 1 - i - spin;
@@ -80,19 +80,17 @@ function splitCluster(
80
80
  }
81
81
  if (count <= maxClusterSize) {
82
82
  clusterList.push(members);
83
+ } else if (child.index < 0) {
84
+ splitCluster(child, clusterList, {
85
+ maxClusterSize,
86
+ force: true,
87
+ nSpins,
88
+ connectivity,
89
+ });
83
90
  } else {
84
- if (child.index < 0) {
85
- splitCluster(child, clusterList, {
86
- maxClusterSize,
87
- force: true,
88
- nSpins,
89
- connectivity,
90
- });
91
- } else {
92
- // We have to threat this spin alone and use the resurrection algorithm instead of the simulation
93
- members[child.index] = 2;
94
- clusterList.push(members);
95
- }
91
+ // We have to threat this spin alone and use the resurrection algorithm instead of the simulation
92
+ members[child.index] = 2;
93
+ clusterList.push(members);
96
94
  }
97
95
  } else {
98
96
  splitCluster(child, clusterList, {
@@ -6,24 +6,32 @@ export interface RangeFromSignalOptions {
6
6
  * nucleus
7
7
  * @default '1h'
8
8
  */
9
- nucleus: string;
9
+ nucleus?: string;
10
10
  /**
11
- * frequency observed
11
+ * frequency observedhttps://www.wiley.com/en-us/NMR+Data+Processing-p-9780471039006#content-section
12
12
  * @default 400
13
13
  */
14
- frequency: number;
14
+ frequency?: number;
15
+ /**
16
+ * tolerance to the halfWidth, default depends of the nucleus
17
+ */
18
+ tolerance?: number;
15
19
  }
16
20
 
17
- export function rangeFromSignal(signal: NMRSignal1D, options: any = {}) {
21
+ export function rangeFromSignal(
22
+ signal: NMRSignal1D,
23
+ options: RangeFromSignalOptions,
24
+ ) {
18
25
  const { nucleus = '1h', frequency = 400 } = options;
19
26
  const { tolerance = getTolerance(nucleus) / frequency } = options;
20
- let halfWidth =
21
- (signal.js || []).reduce((total, j) => {
22
- const { coupling, multiplicity = 'd' } = j;
23
- return total + (couplingValues[multiplicity] * coupling) / frequency;
24
- }, 0) /
25
- 2 +
26
- tolerance;
27
+
28
+ let halfWidth = 0;
29
+ for (const js of signal.js || []) {
30
+ const { coupling, multiplicity = 'd' } = js;
31
+ halfWidth += (couplingValues[multiplicity] * coupling) / frequency;
32
+ }
33
+
34
+ halfWidth = tolerance + halfWidth / 2;
27
35
  return {
28
36
  from: signal.delta - halfWidth,
29
37
  to: signal.delta + halfWidth,
@@ -46,13 +46,10 @@ export function resurrectRange(part: string, options: any = {}) {
46
46
  signal.delta = from;
47
47
  signal.multiplicity = multiplicity;
48
48
  }
49
- } else {
50
- // looks like a real multiplicity, s, d, dd, etc..
51
- if (!isARange) {
52
- // a complex signal
53
- signal.delta = from;
54
- signal.multiplicity = multiplicity;
55
- }
49
+ } else if (!isARange) {
50
+ // a complex signal
51
+ signal.delta = from;
52
+ signal.multiplicity = multiplicity;
56
53
  }
57
54
  }
58
55
 
@@ -0,0 +1,36 @@
1
+ import { NMRSignal2D } from '../NMRSignal2D';
2
+ import { NMRZone } from '../NMRZone';
3
+
4
+ export function formatZones(signals: NMRSignal2D[]) {
5
+ let zones: NMRZone[] = [];
6
+ for (const signal of signals) {
7
+ let minMax1 = [Number.MAX_VALUE, 0];
8
+ let minMax2 = [Number.MAX_VALUE, 0];
9
+ for (const peak of signal.peaks || []) {
10
+ if (peak.minX < minMax1[0]) {
11
+ minMax1[0] = peak.minX;
12
+ }
13
+ if (peak.maxX > minMax1[1]) {
14
+ minMax1[1] = peak.maxX;
15
+ }
16
+ if (peak.minY < minMax2[0]) {
17
+ minMax2[0] = peak.minY;
18
+ }
19
+ if (peak.maxY > minMax2[1]) {
20
+ minMax2[1] = peak.maxY;
21
+ }
22
+ }
23
+ zones.push({
24
+ x: {
25
+ from: minMax1[0],
26
+ to: minMax1[1],
27
+ },
28
+ y: {
29
+ from: minMax2[0],
30
+ to: minMax2[1],
31
+ },
32
+ signals: [signal],
33
+ });
34
+ }
35
+ return zones;
36
+ }
@@ -4,13 +4,13 @@ import * as matrixPeakFinders from 'ml-matrix-peaks-finder';
4
4
  import type { Peak2D } from 'ml-matrix-peaks-finder';
5
5
  import simpleClustering from 'ml-simple-clustering';
6
6
 
7
- import { NMRZone } from '..';
8
7
  import { determineRealTop } from '../peaks/util/determineRealTop';
9
8
  import { getKernel } from '../peaks/util/getKernel';
10
9
  import type { GetKernelOptions } from '../peaks/util/getKernel';
11
10
  import * as PeakOptimizer from '../peaks/util/peakOptimizer';
12
11
 
13
12
  import type { NMRSignal2D } from './NMRSignal2D';
13
+ import { formatZones } from './util/formatZone';
14
14
 
15
15
  const smallFilter = [
16
16
  [0, 0, 1, 2, 2, 2, 1, 0, 0],
@@ -183,40 +183,6 @@ export function xyzAutoZonesPicking(
183
183
  return formatZones(signals);
184
184
  }
185
185
 
186
- function formatZones(signals: NMRSignal2D[]) {
187
- let zones: NMRZone[] = [];
188
- for (const signal of signals) {
189
- let minMax1 = [Number.MAX_VALUE, 0];
190
- let minMax2 = [Number.MAX_VALUE, 0];
191
- for (const peak of signal.peaks || []) {
192
- if (peak.minX < minMax1[0]) {
193
- minMax1[0] = peak.minX;
194
- }
195
- if (peak.maxX > minMax1[1]) {
196
- minMax1[1] = peak.maxX;
197
- }
198
- if (peak.minY < minMax2[0]) {
199
- minMax2[0] = peak.minY;
200
- }
201
- if (peak.maxY > minMax2[1]) {
202
- minMax2[1] = peak.maxY;
203
- }
204
- }
205
- zones.push({
206
- x: {
207
- from: minMax1[0],
208
- to: minMax1[1],
209
- },
210
- y: {
211
- from: minMax2[0],
212
- to: minMax2[1],
213
- },
214
- signals: [signal],
215
- });
216
- }
217
- return zones;
218
- }
219
-
220
186
  /**
221
187
  * This function converts a set of 2D-peaks in 2D-signals. Each signal could be composed
222
188
  * of many 2D-peaks, and it has some additional information related to the NMR spectrum.
@@ -6,6 +6,7 @@ import jAnalyzer from '../peaks/util/jAnalyzer';
6
6
  import type { MakeMandatory } from '../utilities/MakeMandatory';
7
7
 
8
8
  import type { NMRSignal2D } from './NMRSignal2D';
9
+ import { formatZones } from './util/formatZone';
9
10
 
10
11
  interface CompilePatternOptions {
11
12
  observedFrequencies?: number[] | Float64Array;
@@ -25,6 +26,11 @@ interface XYZJResAnalyzerOptions extends CompilePatternOptions {
25
26
  * @default 0
26
27
  */
27
28
  reference?: number;
29
+ /**
30
+ * if it is true returns zones instead of signals 2D
31
+ * @default false
32
+ */
33
+ getZones?: boolean;
28
34
  }
29
35
 
30
36
  type CompilePatternOptionsMandatory = MakeMandatory<
@@ -38,6 +44,7 @@ export function xyzJResAnalyzer(
38
44
  ) {
39
45
  let {
40
46
  reference = 0,
47
+ getZones = false,
41
48
  referenceMaxShiftError = 0.08,
42
49
  tolerances = [10, 100],
43
50
  nuclei = ['1H', '1H'],
@@ -46,20 +53,20 @@ export function xyzJResAnalyzer(
46
53
  jAxisKey: { jAxis: 'y', intensity: 'z' },
47
54
  },
48
55
  } = options;
49
- let temporalSignals = compilePattern(signals, {
56
+ let temporalSignals = compilePattern([...signals], {
50
57
  observedFrequencies,
51
58
  tolerances,
52
59
  nuclei,
53
60
  jAnalyzer,
54
61
  });
55
62
  //check if the signal are symmetric around the reference
56
- let result = [];
63
+ let signals2D = [];
57
64
  for (const tempSignal of temporalSignals) {
58
65
  let delta = tempSignal.y.delta;
59
66
  if (Math.abs(delta - reference) > referenceMaxShiftError) continue;
60
- result.push(tempSignal);
67
+ signals2D.push(tempSignal);
61
68
  }
62
- return result;
69
+ return getZones ? formatZones(signals2D) : signals2D;
63
70
  }
64
71
 
65
72
  function compilePattern(
@@ -122,10 +129,10 @@ function compilePattern(
122
129
  }
123
130
  if (peaksO.length > 0) {
124
131
  peaksO.reverse();
125
- let ranges = createSignals2D(peaksO, signalOptions);
132
+ let signals2D = createSignals2D(peaksO, signalOptions);
126
133
 
127
- for (const range of ranges) {
128
- newSignals.push(range);
134
+ for (const signal of signals2D) {
135
+ newSignals.push(signal);
129
136
  }
130
137
  }
131
138
  }