nmr-processing 9.3.7 → 9.3.8-pre.1681135907

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 (84) hide show
  1. package/lib/apodization/apodization.d.ts +9 -4
  2. package/lib/apodization/apodization.js +3 -1
  3. package/lib/apodization/apodization.js.map +1 -1
  4. package/lib/apodization/applyWindow.js.map +1 -1
  5. package/lib/apodization/compose.js.map +1 -1
  6. package/lib/apodization/getFunction.js +3 -0
  7. package/lib/apodization/getFunction.js.map +1 -1
  8. package/lib/apodization/shapes/WindowFunctions.d.ts +6 -1
  9. package/lib/apodization/shapes/sineBell.d.ts +27 -0
  10. package/lib/apodization/shapes/sineBell.js +17 -0
  11. package/lib/apodization/shapes/sineBell.js.map +1 -0
  12. package/lib/apodization/utils/getData.js.map +1 -1
  13. package/lib/signals/signalsToFID.d.ts +3 -0
  14. package/lib/utilities/checkData2DFid.d.ts +3 -0
  15. package/lib/utilities/checkData2DFid.js +10 -0
  16. package/lib/utilities/checkData2DFid.js.map +1 -0
  17. package/lib/xyz/Data2D.d.ts +21 -0
  18. package/lib/xyz/Data2D.js +3 -0
  19. package/lib/xyz/Data2D.js.map +1 -0
  20. package/lib/xyz/quadrature.d.ts +8 -0
  21. package/lib/xyz/quadrature.js +54 -0
  22. package/lib/xyz/quadrature.js.map +1 -0
  23. package/lib/xyz/util/fft2d/digitalFilter.d.ts +7 -0
  24. package/lib/xyz/util/fft2d/digitalFilter.js +20 -0
  25. package/lib/xyz/util/fft2d/digitalFilter.js.map +1 -0
  26. package/lib/xyz/util/fft2d/fftDirectDimension.d.ts +24 -0
  27. package/lib/xyz/util/fft2d/fftDirectDimension.js +57 -0
  28. package/lib/xyz/util/fft2d/fftDirectDimension.js.map +1 -0
  29. package/lib/xyz/util/fft2d/fftIndirectDimension.d.ts +23 -0
  30. package/lib/xyz/util/fft2d/fftIndirectDimension.js +72 -0
  31. package/lib/xyz/util/fft2d/fftIndirectDimension.js.map +1 -0
  32. package/lib/xyz/util/fft2d/removeDCOffset.d.ts +5 -0
  33. package/lib/xyz/util/fft2d/removeDCOffset.js +19 -0
  34. package/lib/xyz/util/fft2d/removeDCOffset.js.map +1 -0
  35. package/lib/xyz/util/fft2d/zeroFilling.d.ts +10 -0
  36. package/lib/xyz/util/fft2d/zeroFilling.js +29 -0
  37. package/lib/xyz/util/fft2d/zeroFilling.js.map +1 -0
  38. package/lib/xyz/xyzBidimensionalFFT.d.ts +41 -0
  39. package/lib/xyz/xyzBidimensionalFFT.js +79 -0
  40. package/lib/xyz/xyzBidimensionalFFT.js.map +1 -0
  41. package/lib-esm/apodization/apodization.js +3 -1
  42. package/lib-esm/apodization/apodization.js.map +1 -1
  43. package/lib-esm/apodization/applyWindow.js.map +1 -1
  44. package/lib-esm/apodization/compose.js.map +1 -1
  45. package/lib-esm/apodization/getFunction.js +3 -0
  46. package/lib-esm/apodization/getFunction.js.map +1 -1
  47. package/lib-esm/apodization/shapes/sineBell.js +13 -0
  48. package/lib-esm/apodization/shapes/sineBell.js.map +1 -0
  49. package/lib-esm/apodization/utils/getData.js.map +1 -1
  50. package/lib-esm/utilities/checkData2DFid.js +6 -0
  51. package/lib-esm/utilities/checkData2DFid.js.map +1 -0
  52. package/lib-esm/xyz/Data2D.js +2 -0
  53. package/lib-esm/xyz/Data2D.js.map +1 -0
  54. package/lib-esm/xyz/quadrature.js +50 -0
  55. package/lib-esm/xyz/quadrature.js.map +1 -0
  56. package/lib-esm/xyz/util/fft2d/digitalFilter.js +16 -0
  57. package/lib-esm/xyz/util/fft2d/digitalFilter.js.map +1 -0
  58. package/lib-esm/xyz/util/fft2d/fftDirectDimension.js +50 -0
  59. package/lib-esm/xyz/util/fft2d/fftDirectDimension.js.map +1 -0
  60. package/lib-esm/xyz/util/fft2d/fftIndirectDimension.js +65 -0
  61. package/lib-esm/xyz/util/fft2d/fftIndirectDimension.js.map +1 -0
  62. package/lib-esm/xyz/util/fft2d/removeDCOffset.js +15 -0
  63. package/lib-esm/xyz/util/fft2d/removeDCOffset.js.map +1 -0
  64. package/lib-esm/xyz/util/fft2d/zeroFilling.js +25 -0
  65. package/lib-esm/xyz/util/fft2d/zeroFilling.js.map +1 -0
  66. package/lib-esm/xyz/xyzBidimensionalFFT.js +75 -0
  67. package/lib-esm/xyz/xyzBidimensionalFFT.js.map +1 -0
  68. package/package.json +17 -17
  69. package/src/apodization/apodization.ts +6 -4
  70. package/src/apodization/applyWindow.ts +0 -1
  71. package/src/apodization/compose.ts +1 -0
  72. package/src/apodization/getFunction.ts +3 -0
  73. package/src/apodization/shapes/WindowFunctions.ts +7 -1
  74. package/src/apodization/shapes/sineBell.ts +41 -0
  75. package/src/apodization/utils/getData.ts +0 -1
  76. package/src/utilities/checkData2DFid.ts +10 -0
  77. package/src/xyz/Data2D.ts +25 -0
  78. package/src/xyz/quadrature.ts +69 -0
  79. package/src/xyz/util/fft2d/digitalFilter.ts +24 -0
  80. package/src/xyz/util/fft2d/fftDirectDimension.ts +111 -0
  81. package/src/xyz/util/fft2d/fftIndirectDimension.ts +123 -0
  82. package/src/xyz/util/fft2d/removeDCOffset.ts +19 -0
  83. package/src/xyz/util/fft2d/zeroFilling.ts +39 -0
  84. package/src/xyz/xyzBidimensionalFFT.ts +123 -0
@@ -0,0 +1,123 @@
1
+ import { DoubleArray } from 'cheminfo-types';
2
+ import Matrix from 'ml-matrix';
3
+
4
+ import { ApodizationOptions } from '../apodization/apodization';
5
+ import { Data2D, Data2DFid } from './Data2D';
6
+
7
+ import { quadrature } from './quadrature';
8
+ import {
9
+ DirectDimensionOptions,
10
+ fftDirectDimension,
11
+ } from './util/fft2d/fftDirectDimension';
12
+ import {
13
+ fftIndirectDimension,
14
+ IndirectDimensionOptions,
15
+ } from './util/fft2d/fftIndirectDimension';
16
+ import { ZeroFillingOptions } from './util/fft2d/zeroFilling';
17
+
18
+ type Info2D = any;
19
+
20
+ interface BidimensionalFFTOptions {
21
+ fnMode: string;
22
+ info: Info2D;
23
+ zeroFilling?: ZeroFillingOptions;
24
+ phaseCorrection?: { ph0: number; ph1: number };
25
+ digitalFilterValue?: number;
26
+ apodization?: ApodizationOptions;
27
+ indirect?: IndirectDimensionOptions;
28
+ direct?: DirectDimensionOptions;
29
+ }
30
+
31
+ export function xyzBidimensionalFFT(
32
+ data: Data2D,
33
+ options: BidimensionalFFTOptions,
34
+ ) {
35
+ ensureData2DFid(data);
36
+
37
+ const {
38
+ info,
39
+ fnMode,
40
+ digitalFilterValue = 0,
41
+ zeroFilling: zeroFillingGeneral,
42
+ } = options;
43
+
44
+ const orderedData = quadrature(data, { fnMode });
45
+
46
+ const { re: reData } = orderedData;
47
+ const nbRows = reData.length;
48
+ const nbColumns = reData[0].length;
49
+ const { direct = {}, indirect = {} } = options;
50
+
51
+ const { zeroFilling: zeroFillingF2 = zeroFillingGeneral } = direct;
52
+
53
+ const { factor: f2Factor = 2 } = zeroFillingF2 || {};
54
+ const nbPointsF2 =
55
+ zeroFillingF2?.nbPoints || 2 ** Math.round(Math.log2(nbColumns * f2Factor));
56
+
57
+ const transformed = fftDirectDimension(orderedData, {
58
+ ...direct,
59
+ fnMode,
60
+ digitalFilterValue,
61
+ zeroFilling: { nbPoints: nbPointsF2 },
62
+ });
63
+
64
+ const { zeroFilling: zeroFillingF1 } = options;
65
+ const { factor: f1Factor = 2 } = zeroFillingF1 || {};
66
+ const nbPointsF1 =
67
+ zeroFillingF1?.nbPoints || 2 ** Math.round(Math.log2(nbRows * f1Factor));
68
+ const { re: reResult, im: imResult } = fftIndirectDimension(transformed, {
69
+ ...indirect,
70
+ fnMode,
71
+ zeroFilling: { nbPoints: nbPointsF1 },
72
+ });
73
+
74
+ const minMaxXY = getMinMaxXY(info);
75
+ return {
76
+ re: {
77
+ z: convertToDoubleArray(reResult),
78
+ maxZ: reResult.max(),
79
+ minZ: reResult.min(),
80
+ ...minMaxXY,
81
+ },
82
+ im: {
83
+ z: convertToDoubleArray(imResult),
84
+ maxZ: imResult.max(),
85
+ minZ: imResult.min(),
86
+ ...minMaxXY,
87
+ },
88
+ };
89
+ }
90
+
91
+ function ensureData2DFid(data: Data2D): asserts data is Data2DFid {
92
+ if (!('re' in data)) {
93
+ throw new Error('bidimensional FFT only can be applied to raw data');
94
+ }
95
+ }
96
+
97
+ function convertToDoubleArray(data: Matrix) {
98
+ const result: DoubleArray[] = new Array(data.rows);
99
+ for (let i = 0; i < data.rows; i++) {
100
+ result[i] = new Float64Array(data.getRow(i));
101
+ }
102
+ return result;
103
+ }
104
+
105
+ function getMinMaxXY(info: Info2D) {
106
+ const min: number[] = [];
107
+ const max: number[] = [];
108
+ for (let i = 0; i < info.baseFrequency.length; i++) {
109
+ const baseFrequency = Number.parseFloat(info.baseFrequency[i]);
110
+ const frequencyOffset = Number.parseFloat(info.frequencyOffset[i]);
111
+ const spectralWidth = Number.parseFloat(info.spectralWidth[i]);
112
+ const offset = frequencyOffset / baseFrequency;
113
+ min.push(offset - spectralWidth * 0.5);
114
+ max.push(offset + spectralWidth * 0.5);
115
+ }
116
+
117
+ return {
118
+ minX: min[0],
119
+ maxX: max[0],
120
+ minY: min[1],
121
+ maxY: max[1],
122
+ };
123
+ }