nmr-processing 3.3.3 → 4.0.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 (104) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/lib/assignment/get13CAssignments.d.ts +35 -0
  3. package/lib/assignment/get13CAssignments.js +54 -0
  4. package/lib/assignment/get13CAssignments.js.map +1 -0
  5. package/lib/assignment/get1HAssignments.d.ts +42 -0
  6. package/lib/assignment/get1HAssignments.js +55 -0
  7. package/lib/assignment/get1HAssignments.js.map +1 -0
  8. package/lib/assignment/utils/buildAssignments.d.ts +33 -0
  9. package/lib/assignment/utils/buildAssignments.js +93 -0
  10. package/lib/assignment/utils/buildAssignments.js.map +1 -0
  11. package/lib/assignment/utils/createMapPossibleAssignments.d.ts +15 -0
  12. package/lib/assignment/utils/createMapPossibleAssignments.js +51 -0
  13. package/lib/assignment/utils/createMapPossibleAssignments.js.map +1 -0
  14. package/lib/assignment/utils/exploreTreeRec.d.ts +22 -0
  15. package/lib/assignment/utils/exploreTreeRec.js +77 -0
  16. package/lib/assignment/utils/exploreTreeRec.js.map +1 -0
  17. package/lib/assignment/utils/generateID.d.ts +1 -0
  18. package/lib/assignment/utils/generateID.js +13 -0
  19. package/lib/assignment/utils/generateID.js.map +1 -0
  20. package/lib/assignment/utils/partialScore.d.ts +16 -0
  21. package/lib/assignment/utils/partialScore.js +91 -0
  22. package/lib/assignment/utils/partialScore.js.map +1 -0
  23. package/lib/index.d.ts +2 -5
  24. package/lib/index.js +2 -5
  25. package/lib/index.js.map +1 -1
  26. package/lib/peaks/peaksFilterImpurities.js +1 -1
  27. package/lib/peaks/peaksFilterImpurities.js.map +1 -1
  28. package/lib/peaks/peaksToRanges.js +11 -17
  29. package/lib/peaks/peaksToRanges.js.map +1 -1
  30. package/lib/peaks/util/determineRealTop.js +3 -2
  31. package/lib/peaks/util/determineRealTop.js.map +1 -1
  32. package/lib/peaks/util/jAnalyzer.js +33 -35
  33. package/lib/peaks/util/jAnalyzer.js.map +1 -1
  34. package/lib/ranges/rangesToXY.d.ts +2 -2
  35. package/lib/ranges/rangesToXY.js +10 -2
  36. package/lib/ranges/rangesToXY.js.map +1 -1
  37. package/lib/signals/signals2DToZ.d.ts +2 -2
  38. package/lib/signals/signalsToXY.d.ts +2 -2
  39. package/lib/signals/simulation/simulate1D.d.ts +4 -3
  40. package/lib/signals/simulation/simulate1D.js.map +1 -1
  41. package/lib/types/NMRPeak1D.d.ts +2 -9
  42. package/lib/types/NMRRange.d.ts +1 -0
  43. package/lib/types/NMRSignal1D.d.ts +3 -2
  44. package/lib/types/NMRSignal2D.d.ts +1 -0
  45. package/lib/types/NMRZone.d.ts +4 -3
  46. package/lib/xy/xyAutoPeaksPicking.d.ts +4 -60
  47. package/lib/xy/xyAutoPeaksPicking.js +3 -3
  48. package/lib/xy/xyAutoPeaksPicking.js.map +1 -1
  49. package/lib-esm/assignment/get13CAssignments.js +47 -0
  50. package/lib-esm/assignment/get13CAssignments.js.map +1 -0
  51. package/lib-esm/assignment/get1HAssignments.js +48 -0
  52. package/lib-esm/assignment/get1HAssignments.js.map +1 -0
  53. package/lib-esm/assignment/utils/buildAssignments.js +86 -0
  54. package/lib-esm/assignment/utils/buildAssignments.js.map +1 -0
  55. package/lib-esm/assignment/utils/createMapPossibleAssignments.js +47 -0
  56. package/lib-esm/assignment/utils/createMapPossibleAssignments.js.map +1 -0
  57. package/lib-esm/assignment/utils/exploreTreeRec.js +73 -0
  58. package/lib-esm/assignment/utils/exploreTreeRec.js.map +1 -0
  59. package/lib-esm/assignment/utils/generateID.js +10 -0
  60. package/lib-esm/assignment/utils/generateID.js.map +1 -0
  61. package/lib-esm/assignment/utils/partialScore.js +87 -0
  62. package/lib-esm/assignment/utils/partialScore.js.map +1 -0
  63. package/lib-esm/index.js +2 -5
  64. package/lib-esm/index.js.map +1 -1
  65. package/lib-esm/peaks/peaksFilterImpurities.js +1 -1
  66. package/lib-esm/peaks/peaksFilterImpurities.js.map +1 -1
  67. package/lib-esm/peaks/peaksToRanges.js +11 -17
  68. package/lib-esm/peaks/peaksToRanges.js.map +1 -1
  69. package/lib-esm/peaks/util/determineRealTop.js +4 -3
  70. package/lib-esm/peaks/util/determineRealTop.js.map +1 -1
  71. package/lib-esm/peaks/util/jAnalyzer.js +33 -35
  72. package/lib-esm/peaks/util/jAnalyzer.js.map +1 -1
  73. package/lib-esm/ranges/rangesToXY.js +10 -2
  74. package/lib-esm/ranges/rangesToXY.js.map +1 -1
  75. package/lib-esm/signals/simulation/simulate1D.js.map +1 -1
  76. package/lib-esm/xy/xyAutoPeaksPicking.js +3 -3
  77. package/lib-esm/xy/xyAutoPeaksPicking.js.map +1 -1
  78. package/package.json +4 -4
  79. package/src/assignment/get13CAssignments.ts +100 -0
  80. package/src/assignment/get1HAssignments.ts +116 -0
  81. package/src/assignment/utils/buildAssignments.ts +155 -0
  82. package/src/assignment/utils/createMapPossibleAssignments.ts +76 -0
  83. package/src/assignment/utils/exploreTreeRec.ts +138 -0
  84. package/src/assignment/utils/generateID.ts +11 -0
  85. package/src/assignment/utils/partialScore.ts +128 -0
  86. package/src/index.ts +3 -6
  87. package/src/peaks/peaksFilterImpurities.ts +1 -1
  88. package/src/peaks/peaksToRanges.ts +12 -19
  89. package/src/peaks/util/determineRealTop.ts +4 -6
  90. package/src/peaks/util/jAnalyzer.ts +34 -36
  91. package/src/ranges/rangesToXY.ts +14 -7
  92. package/src/signals/signals2DToZ.ts +2 -2
  93. package/src/signals/signalsToXY.ts +2 -2
  94. package/src/signals/simulation/simulate1D.ts +4 -3
  95. package/src/types/NMRPeak1D.ts +3 -9
  96. package/src/types/NMRRange.ts +1 -0
  97. package/src/types/NMRSignal1D.ts +3 -3
  98. package/src/types/NMRSignal2D.ts +2 -0
  99. package/src/types/NMRZone.ts +4 -3
  100. package/src/types/ml-spectra-processing/index.d.ts +8 -8
  101. package/src/types/ml-tree-set/index.d.ts +18 -0
  102. package/src/types/openchemlib-utils/index..d.ts +2 -2
  103. package/src/xy/xyAutoPeaksPicking.ts +19 -58
  104. package/src/types/ml-gsd/index.d.ts +0 -164
@@ -0,0 +1,76 @@
1
+ import { MakeMandatory } from '../../types/MakeMandatory';
2
+ import type { Targets } from '../get1HAssignments';
3
+
4
+ import type { RestrictionByCS, Predictions1Dassignments } from './buildAssignments';
5
+
6
+ type RestrictionByCSMandatory = MakeMandatory<
7
+ RestrictionByCS,
8
+ 'chemicalShiftRestriction' | 'tolerance' | 'useChemicalShiftScore'
9
+ >;
10
+
11
+ interface CreateMapPossibleAssignments {
12
+ predictions: Predictions1Dassignments;
13
+ restrictionByCS: RestrictionByCSMandatory;
14
+ targets: Targets;
15
+ useIntegrationRestriction: boolean;
16
+ }
17
+
18
+ export interface PossibleAssignmentMap {
19
+ [key: string]: string[];
20
+ }
21
+ export function createMapPossibleAssignments(
22
+ props: CreateMapPossibleAssignments,
23
+ ) {
24
+ const { restrictionByCS, predictions, targets, useIntegrationRestriction } =
25
+ props;
26
+
27
+ const { tolerance: toleranceCS, chemicalShiftRestriction } = restrictionByCS;
28
+
29
+ let errorAbs = Math.abs(toleranceCS);
30
+ const expandMap: PossibleAssignmentMap = {};
31
+ for (const diaID in predictions) {
32
+ let prediction = predictions[diaID];
33
+ if (prediction.error) prediction.error = Math.abs(prediction.error);
34
+ expandMap[diaID] = [];
35
+
36
+ if (targets) {
37
+ for (const targetID in targets) {
38
+ let target = targets[targetID];
39
+ const { nbAtoms } = prediction;
40
+ const { integration } = target;
41
+
42
+ const couldBeAssigned = useIntegrationRestriction
43
+ ? integration > 0
44
+ ? nbAtoms - integration < 1
45
+ : true
46
+ : true;
47
+
48
+ if (couldBeAssigned) {
49
+ if (
50
+ !chemicalShiftRestriction ||
51
+ typeof prediction.delta === 'undefined'
52
+ ) {
53
+ // Chemical shift is not a restriction
54
+ expandMap[diaID].push(targetID);
55
+ } else {
56
+ let error = errorAbs;
57
+ if (prediction.error) {
58
+ error = Math.max(error, prediction.error);
59
+ }
60
+ const delta =
61
+ target.signals && target.signals.length > 0
62
+ ? target.signals[0].delta
63
+ : (target.to + target.from) / 2;
64
+
65
+ let distAfterLimit = Math.abs(prediction.delta - delta - errorAbs);
66
+ if (distAfterLimit < 4 * errorAbs) {
67
+ expandMap[diaID].push(targetID);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+ expandMap[diaID].push('*');
74
+ }
75
+ return expandMap;
76
+ }
@@ -0,0 +1,138 @@
1
+ import type { Targets } from '../get1HAssignments';
2
+
3
+ import type {
4
+ RestrictionByCS,
5
+ StoreAssignments1D,
6
+ Predictions1Dassignments,
7
+ } from './buildAssignments';
8
+ import type { PossibleAssignmentMap } from './createMapPossibleAssignments';
9
+ import { partialScore } from './partialScore';
10
+
11
+ export interface ExploreTreeRecProps {
12
+ nSources: number;
13
+ restrictionByCS: RestrictionByCS;
14
+ timeout: number;
15
+ timeStart: number;
16
+ maxSolutions: number;
17
+ targets: Targets;
18
+ useIntegrationRestriction: boolean;
19
+ predictions: Predictions1Dassignments;
20
+ lowerBoundScore: number;
21
+ nbAllowedUnAssigned: number;
22
+ possibleAssignmentMap: PossibleAssignmentMap;
23
+ diaIDPeerPossibleAssignment: string[];
24
+ }
25
+ export function exploreTreeRec(
26
+ props: ExploreTreeRecProps,
27
+ currentIndex: number,
28
+ partial: Array<string | null>,
29
+ store: StoreAssignments1D,
30
+ ) {
31
+ const {
32
+ nSources,
33
+ restrictionByCS,
34
+ timeout,
35
+ timeStart,
36
+ maxSolutions,
37
+ targets,
38
+ predictions,
39
+ lowerBoundScore,
40
+ nbAllowedUnAssigned,
41
+ possibleAssignmentMap,
42
+ useIntegrationRestriction,
43
+ diaIDPeerPossibleAssignment,
44
+ } = props;
45
+
46
+ const currentDate = new Date();
47
+ if (currentDate.getTime() - timeStart > timeout) {
48
+ new Error('timeout expired');
49
+ return store;
50
+ }
51
+
52
+ const diaID = diaIDPeerPossibleAssignment[currentIndex];
53
+ const possibleAssignments = possibleAssignmentMap[diaID];
54
+ for (let targetID of possibleAssignments) {
55
+ partial[currentIndex] = targetID;
56
+ let score = partialScore(partial, {
57
+ useIntegrationRestriction,
58
+ diaIDPeerPossibleAssignment,
59
+ nbAllowedUnAssigned,
60
+ restrictionByCS,
61
+ predictions,
62
+ targets,
63
+ });
64
+
65
+ if (score === 0) {
66
+ if (targetID === '*') {
67
+ partial[currentIndex] = null;
68
+ }
69
+ continue;
70
+ }
71
+
72
+ if (currentIndex === nSources - 1 && score >= lowerBoundScore) {
73
+ addSolution(store, { predictions, partial, score, maxSolutions });
74
+ } else if (currentIndex < nSources - 1) {
75
+ exploreTreeRec(
76
+ {
77
+ nSources,
78
+ restrictionByCS,
79
+ timeout,
80
+ timeStart,
81
+ maxSolutions,
82
+ targets,
83
+ predictions,
84
+ lowerBoundScore,
85
+ nbAllowedUnAssigned,
86
+ possibleAssignmentMap,
87
+ useIntegrationRestriction,
88
+ diaIDPeerPossibleAssignment,
89
+ },
90
+ currentIndex + 1,
91
+ JSON.parse(JSON.stringify(partial)),
92
+ store,
93
+ );
94
+ }
95
+ }
96
+ }
97
+
98
+ export interface SolutionAssignment {
99
+ assignment: string[];
100
+ score: number;
101
+ }
102
+
103
+ interface AddSolutionProps {
104
+ score: number;
105
+ maxSolutions: number;
106
+ partial: Array<string | null>;
107
+ predictions: Predictions1Dassignments;
108
+ }
109
+
110
+ function addSolution(store: StoreAssignments1D, props: AddSolutionProps) {
111
+ let { score, maxSolutions, partial, predictions } = props;
112
+ score /= doubleAssignmentPenalty(partial, predictions);
113
+ store.nSolutions++;
114
+ let solution: SolutionAssignment = {
115
+ assignment: JSON.parse(JSON.stringify(partial)),
116
+ score: score,
117
+ };
118
+
119
+ if (store.nSolutions >= maxSolutions) {
120
+ if (solution.score > store.solutions.last().score) {
121
+ store.solutions.pollLast();
122
+ store.solutions.add(solution);
123
+ }
124
+ } else {
125
+ store.solutions.add(solution);
126
+ store.nSolutions++;
127
+ }
128
+ }
129
+
130
+ function doubleAssignmentPenalty(
131
+ partial: Array<string | null>,
132
+ predictions: Predictions1Dassignments,
133
+ ) {
134
+ const nbSources = Object.keys(predictions).length;
135
+ let assignments = new Set(partial);
136
+ let nbDoubleAssignment = nbSources - assignments.size;
137
+ return nbDoubleAssignment > 0 ? 2 * nbDoubleAssignment : 1;
138
+ }
@@ -0,0 +1,11 @@
1
+ const BASE62 = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
2
+
3
+ const LENGTH = 8;
4
+
5
+ export default function generateID() {
6
+ let id = '';
7
+ for (let i = 0; i < LENGTH; i++) {
8
+ id += BASE62.charAt(Math.floor(Math.random() * 62));
9
+ }
10
+ return id;
11
+ }
@@ -0,0 +1,128 @@
1
+ import { Targets } from '../get1HAssignments';
2
+
3
+ import type {
4
+ Predictions1Dassignments,
5
+ RestrictionByCS,
6
+ } from './buildAssignments';
7
+
8
+ interface PartialScoreOptions {
9
+ restrictionByCS: RestrictionByCS;
10
+ /**
11
+ * number of allowed unassignment signals
12
+ * @default 0
13
+ */
14
+ useIntegrationRestriction: boolean;
15
+ nbAllowedUnAssigned: number;
16
+ diaIDPeerPossibleAssignment: string[];
17
+ predictions: Predictions1Dassignments;
18
+ targets: Targets;
19
+ }
20
+
21
+ export function partialScore(
22
+ partial: Array<string | null>,
23
+ options: PartialScoreOptions,
24
+ ) {
25
+ const {
26
+ useIntegrationRestriction,
27
+ diaIDPeerPossibleAssignment,
28
+ nbAllowedUnAssigned,
29
+ restrictionByCS,
30
+ predictions,
31
+ targets,
32
+ } = options;
33
+ const { useChemicalShiftScore } = restrictionByCS;
34
+ let countStars = 0;
35
+ let totalPartial = partial.length;
36
+ let partialInverse: {
37
+ [key: string]: string[];
38
+ } = {};
39
+ let activeDomainOnPrediction: number[] = [];
40
+
41
+ for (let i = 0; i < partial.length; i++) {
42
+ const targetID = partial[i];
43
+ if (targetID && targetID !== '*') {
44
+ activeDomainOnPrediction.push(i);
45
+ if (!partialInverse[targetID]) {
46
+ partialInverse[targetID] = [];
47
+ }
48
+ partialInverse[targetID].push(diaIDPeerPossibleAssignment[i]);
49
+ }
50
+ if (targetID === '*') countStars++;
51
+ }
52
+ if (countStars > nbAllowedUnAssigned) return 0;
53
+
54
+ const activeDomainOnTarget = Object.keys(partialInverse);
55
+
56
+ if (activeDomainOnTarget.length === 0) {
57
+ return 0;
58
+ }
59
+
60
+ if (useIntegrationRestriction) {
61
+ for (let targetID of activeDomainOnTarget) {
62
+ let targetToSource = partialInverse[targetID];
63
+ let total = 0;
64
+ for (const diaID of targetToSource) {
65
+ const prediction = predictions[diaID];
66
+ total += prediction.allHydrogens;
67
+ }
68
+
69
+ const { integration } = targets[targetID];
70
+ if (total - integration >= 0.5) {
71
+ return 0;
72
+ }
73
+ }
74
+ }
75
+
76
+ //chemical shift score
77
+ let chemicalShiftScore = useChemicalShiftScore
78
+ ? chemicalShiftScoring(partial, options)
79
+ : 1;
80
+
81
+ const penaltyByStarts = countStars / totalPartial;
82
+
83
+ return chemicalShiftScore - penaltyByStarts;
84
+ }
85
+
86
+ function chemicalShiftScoring(
87
+ partial: Array<string | null>,
88
+ options: PartialScoreOptions,
89
+ ) {
90
+ const { tolerance } = options.restrictionByCS;
91
+ const { diaIDPeerPossibleAssignment, predictions, targets } = options;
92
+
93
+ let chemicalShiftScore = 0;
94
+ let count = 0;
95
+ for (let index = 0; index < partial.length; index++) {
96
+ const targetID = partial[index];
97
+ if (targetID && targetID !== '*') {
98
+ count++;
99
+ let diaID = diaIDPeerPossibleAssignment[index];
100
+ let source = predictions[diaID];
101
+ let target = targets[targetID];
102
+ let error = tolerance;
103
+ if (source.error) {
104
+ error = Math.max(source.error, tolerance);
105
+ }
106
+ if (typeof source.delta === 'undefined') {
107
+ // Chemical shift is not a restriction
108
+ chemicalShiftScore += 1;
109
+ } else {
110
+ const delta =
111
+ target.signals && target.signals.length > 0
112
+ ? target.signals[0].delta
113
+ : (target.to + target.from) / 2;
114
+ let diff = Math.abs(source.delta - delta);
115
+ if (diff < error) {
116
+ chemicalShiftScore += 1;
117
+ } else {
118
+ diff = Math.abs(diff - error);
119
+ chemicalShiftScore += (-0.25 / error) * diff + 1;
120
+ }
121
+ }
122
+ }
123
+ }
124
+ if (count > 0) {
125
+ chemicalShiftScore /= count;
126
+ }
127
+ return chemicalShiftScore;
128
+ }
package/src/index.ts CHANGED
@@ -1,9 +1,3 @@
1
- /**
2
- * @typedef {Object} DataXY
3
- * @property {Array<Number>} x Array of x values
4
- * @property {Array<Number>} y Array of y values
5
- */
6
-
7
1
  export * from './constants/gyromagneticRatio';
8
2
  export * from './constants/impurities';
9
3
  export * from './constants/couplingPatterns';
@@ -17,6 +11,9 @@ export * from './prediction/predictHSQC';
17
11
  export * from './prediction/predictHMBC';
18
12
  export * from './prediction/predictAll';
19
13
 
14
+ export * from './assignment/get1HAssignments';
15
+ export * from './assignment/get13CAssignments';
16
+
20
17
  export * from './ranges/rangesToACS';
21
18
  export * from './ranges/rangesToXY';
22
19
 
@@ -66,7 +66,7 @@ function checkImpurity(
66
66
  while (i--) {
67
67
  j = peakList.length;
68
68
  while (j--) {
69
- tolerance = error + peakList[j].shape.width;
69
+ tolerance = error + peakList[j].width;
70
70
  difference = Math.abs(impurity[i].shift - peakList[j].x);
71
71
  if (difference < tolerance) {
72
72
  // && (impurity[i].multiplicity === '' || (impurity[i].multiplicity.indexOf(peakList[j].multiplicity)) { // some impurities has multiplicities like 'bs' but at presents it is unsupported
@@ -1,5 +1,4 @@
1
1
  import type { DataXY } from 'cheminfo-types';
2
- import type { GSDPeak } from 'ml-gsd';
3
2
  import { xyIntegration } from 'ml-spectra-processing';
4
3
 
5
4
  import type { MakeMandatory } from '../types/MakeMandatory';
@@ -92,22 +91,20 @@ const assignSignal = (
92
91
  delta: NaN,
93
92
  nbPeaks: 1,
94
93
  kind: 'signal',
95
- startX: peak.x - peak.shape.width,
96
- stopX: peak.x + peak.shape.width,
94
+ startX: peak.x - peak.width,
95
+ stopX: peak.x + peak.width,
97
96
  observe: frequency,
98
97
  nucleus,
99
98
  integralData: {
100
- from: peak.x - peak.shape.width * 3,
101
- to: peak.x + peak.shape.width * 3,
99
+ from: peak.x - peak.width * 3,
100
+ to: peak.x + peak.width * 3,
102
101
  value: 0,
103
102
  },
104
103
  peaks: [
105
104
  {
106
105
  x: peak.x,
107
106
  intensity: peak.y,
108
- shape: {
109
- width: peak.shape.width,
110
- },
107
+ width: peak.width,
111
108
  },
112
109
  ],
113
110
  };
@@ -178,9 +175,7 @@ export function peaksToRanges(
178
175
  peaksO.push({
179
176
  x: peakR.x,
180
177
  y: peakR.intensity,
181
- shape: {
182
- width: peakR.shape.width,
183
- },
178
+ width: peakR.width,
184
179
  });
185
180
  signal.mask.splice(j, 1);
186
181
  signal.mask2.splice(j, 1);
@@ -251,7 +246,7 @@ export function peaksToRanges(
251
246
  ...peak,
252
247
  };
253
248
  delete newResult.intensity;
254
- return newResult as GSDPeak;
249
+ return newResult as NMRPeak1D;
255
250
  });
256
251
  }
257
252
  if (signal.nmrJs) {
@@ -307,24 +302,22 @@ function detectSignals(
307
302
  if (peak.kind) signal1D.kind = peak.kind;
308
303
  signals.push(signal1D);
309
304
  } else {
310
- let tmp = peak.x + peak.shape.width;
305
+ let tmp = peak.x + peak.width;
311
306
  signal1D.stopX = Math.max(signal1D.stopX, tmp);
312
307
  signal1D.startX = Math.min(signal1D.startX, tmp);
313
308
  signal1D.nbPeaks++;
314
309
  signal1D.peaks.push({
315
310
  x: peak.x,
316
311
  intensity: peak.y,
317
- shape: {
318
- width: peak.shape.width,
319
- },
312
+ width: peak.width,
320
313
  });
321
314
  signal1D.integralData.from = Math.min(
322
315
  signal1D.integralData.from,
323
- peak.x - peak.shape.width * 3,
316
+ peak.x - peak.width * 3,
324
317
  );
325
318
  signal1D.integralData.to = Math.max(
326
319
  signal1D.integralData.to,
327
- peak.x + peak.shape.width * 3,
320
+ peak.x + peak.width * 3,
328
321
  );
329
322
  if (peak.kind) signal1D.kind = peak.kind;
330
323
  }
@@ -372,5 +365,5 @@ function detectSignals(
372
365
  * @private
373
366
  */
374
367
  function computeArea(peak: Peak1DIntern) {
375
- return Math.abs(peak.intensity * peak.shape.width * 1.57); // todo add an option with this value: 1.772453851
368
+ return Math.abs(peak.intensity * peak.width * 1.57); // todo add an option with this value: 1.772453851
376
369
  }
@@ -1,10 +1,8 @@
1
1
  import LM from 'ml-levenberg-marquardt';
2
- import { gaussian2D } from 'ml-peak-shape-generator';
2
+ import { Gaussian2D } from 'ml-peak-shape-generator';
3
3
 
4
4
  import type { MPFPeak } from '../../types/MPFPeak';
5
5
 
6
- const { fct: gaussian2DFct } = gaussian2D;
7
-
8
6
  const direction8X = [-1, -1, -1, 0, 0, 1, 1, 1];
9
7
  const direction8Y = [-1, 0, 1, -1, 1, -1, 0, 1];
10
8
  const direction16X = [-2, -2, -2, -2, -2, -1, -1, 0, 0, 1, 1, 2, 2, 2, 2, 2];
@@ -142,6 +140,7 @@ function fitGaussian(
142
140
  }
143
141
 
144
142
  function paramGaussian2D(intervalX: number, intervalY: number, nCols: number) {
143
+ const gaussian2D = new Gaussian2D();
145
144
  return (p: number[]) => {
146
145
  return (t: number) => {
147
146
  let nL = p.length / 5;
@@ -149,13 +148,12 @@ function paramGaussian2D(intervalX: number, intervalY: number, nCols: number) {
149
148
  let xIndex = t % nCols;
150
149
  let yIndex = (t - xIndex) / nCols;
151
150
  for (let i = 0; i < nL; i++) {
151
+ gaussian2D.fwhm = {x: p[i + 3 * nL], y: p[i + 4 * nL]};
152
152
  result +=
153
153
  p[i + 2 * nL] *
154
- gaussian2DFct(
154
+ gaussian2D.fct(
155
155
  (xIndex - p[i]) * intervalX,
156
156
  (yIndex - p[i + nL]) * intervalY,
157
- p[i + 3 * nL],
158
- p[i + 4 * nL],
159
157
  );
160
158
  }
161
159
  return result;