nmr-processing 7.3.0 → 7.4.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.
@@ -1,20 +1,6 @@
1
- export declare const gyromagneticRatio: {
2
- '1H': number;
3
- '2H': number;
4
- '3H': number;
5
- '3He': number;
6
- '7Li': number;
7
- '13C': number;
8
- '14N': number;
9
- '15N': number;
10
- '17O': number;
11
- '19F': number;
12
- '23Na': number;
13
- '27Al': number;
14
- '29Si': number;
15
- '31P': number;
16
- '57Fe': number;
17
- '63Cu': number;
18
- '67Zn': number;
19
- '129Xe': number;
1
+ export declare type Nuclei = '1H' | '2H' | '3H' | '3He' | '7Li' | '13C' | '14N' | '15N' | '17O' | '19F' | '23Na' | '27Al' | '29Si' | '31P' | '57Fe' | '63Cu' | '67Zn' | '129Xe';
2
+ declare type GyromagneticRatio = {
3
+ [key in Nuclei]: number;
20
4
  };
5
+ export declare const GYROMAGNETIC_RATIO: GyromagneticRatio;
6
+ export {};
@@ -2,9 +2,8 @@
2
2
  // sources:
3
3
  // https://en.wikipedia.org/wiki/Gyromagnetic_ratio
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.gyromagneticRatio = void 0;
6
- // TODO: #13 can we have a better source and more digits ? @jwist
7
- exports.gyromagneticRatio = {
5
+ exports.GYROMAGNETIC_RATIO = void 0;
6
+ exports.GYROMAGNETIC_RATIO = {
8
7
  '1H': 267.52218744e6,
9
8
  '2H': 41.065e6,
10
9
  '3H': 285.3508e6,
@@ -1 +1 @@
1
- {"version":3,"file":"gyromagneticRatio.js","sourceRoot":"","sources":["../../src/constants/gyromagneticRatio.ts"],"names":[],"mappings":";AAAA,WAAW;AACX,mDAAmD;;;AAEnD,iEAAiE;AAEpD,QAAA,iBAAiB,GAAG;IAC/B,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,CAAC,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC,QAAQ;IAChB,KAAK,EAAE,CAAC,QAAQ;IAChB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,CAAC,OAAO;IAChB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,CAAC,QAAQ;CACnB,CAAC"}
1
+ {"version":3,"file":"gyromagneticRatio.js","sourceRoot":"","sources":["../../src/constants/gyromagneticRatio.ts"],"names":[],"mappings":";AAAA,WAAW;AACX,mDAAmD;;;AA4BtC,QAAA,kBAAkB,GAAsB;IACnD,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,CAAC,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC,QAAQ;IAChB,KAAK,EAAE,CAAC,QAAQ;IAChB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,CAAC,OAAO;IAChB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,CAAC,QAAQ;CACnB,CAAC"}
package/lib/index.d.ts CHANGED
@@ -19,6 +19,7 @@ export * from './signals/signalsToXY';
19
19
  export * from './signals/signals2DToZ';
20
20
  export * from './utilities/resurrect';
21
21
  export * from './utilities/rangeFromSignal';
22
+ export * from './utilities/getFrequency';
22
23
  export * from './xy/xyAutoPeaksPicking';
23
24
  export * from './xy/xyAutoRangesPicking';
24
25
  export * from './xyz/xyzAutoZonesPicking';
package/lib/index.js CHANGED
@@ -35,6 +35,7 @@ __exportStar(require("./signals/signalsToXY"), exports);
35
35
  __exportStar(require("./signals/signals2DToZ"), exports);
36
36
  __exportStar(require("./utilities/resurrect"), exports);
37
37
  __exportStar(require("./utilities/rangeFromSignal"), exports);
38
+ __exportStar(require("./utilities/getFrequency"), exports);
38
39
  __exportStar(require("./xy/xyAutoPeaksPicking"), exports);
39
40
  __exportStar(require("./xy/xyAutoRangesPicking"), exports);
40
41
  __exportStar(require("./xyz/xyzAutoZonesPicking"), exports);
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gEAA8C;AAC9C,yDAAuC;AACvC,+DAA6C;AAE7C,gEAA8C;AAE9C,6DAA2C;AAC3C,6DAA2C;AAC3C,2DAAyC;AACzC,2DAAyC;AACzC,2DAAyC;AACzC,0DAAwC;AACxC,iEAA+C;AAE/C,gEAA8C;AAC9C,iEAA+C;AAC/C,8DAA4C;AAE5C,uDAAqC;AACrC,sDAAoC;AAEpC,4DAA0C;AAC1C,wDAAsC;AACtC,yDAAuC;AAEvC,wDAAsC;AACtC,8DAA4C;AAE5C,0DAAwC;AACxC,2DAAyC;AAEzC,4DAA0C;AAC1C,wDAAsC;AAEtC,0DAAwC;AACxC,+DAA6C;AAC7C,+DAA6C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gEAA8C;AAC9C,yDAAuC;AACvC,+DAA6C;AAE7C,gEAA8C;AAE9C,6DAA2C;AAC3C,6DAA2C;AAC3C,2DAAyC;AACzC,2DAAyC;AACzC,2DAAyC;AACzC,0DAAwC;AACxC,iEAA+C;AAE/C,gEAA8C;AAC9C,iEAA+C;AAC/C,8DAA4C;AAE5C,uDAAqC;AACrC,sDAAoC;AAEpC,4DAA0C;AAC1C,wDAAsC;AACtC,yDAAuC;AAEvC,wDAAsC;AACtC,8DAA4C;AAC5C,2DAAyC;AAEzC,0DAAwC;AACxC,2DAAyC;AAEzC,4DAA0C;AAC1C,wDAAsC;AAEtC,0DAAwC;AACxC,+DAA6C;AAC7C,+DAA6C"}
@@ -23,6 +23,7 @@ interface Signals2DToZOptions {
23
23
  * @default 0.02
24
24
  */
25
25
  width?: number | XYNumber;
26
+ factor?: number | XYNumber;
26
27
  }
27
28
  export interface Peak2DSeries {
28
29
  x: number[];
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.signals2DToZ = void 0;
4
4
  const spectrum_generator_1 = require("spectrum-generator");
5
5
  function signals2DToZ(signals, options = {}) {
6
- let { from = -1, to = 12, nbPoints = 512, width = 0.02 } = options;
6
+ let { from = -1, to = 12, nbPoints = 512, width = 0.02, factor = 3, } = options;
7
7
  const peaks = signals.reduce((acc, { x, y }) => {
8
8
  acc.x.push(x.delta);
9
9
  acc.y.push(y.delta);
@@ -11,7 +11,7 @@ function signals2DToZ(signals, options = {}) {
11
11
  return acc;
12
12
  }, { x: [], y: [], z: [] });
13
13
  width = ensureXYNumber(width);
14
- return (0, spectrum_generator_1.generateSpectrum2D)(peaks, {
14
+ return (0, spectrum_generator_1.generateSpectrum2D)(mergeClosePeaks(peaks), {
15
15
  generator: {
16
16
  from: ensureXYNumber(from),
17
17
  to: ensureXYNumber(to),
@@ -19,12 +19,27 @@ function signals2DToZ(signals, options = {}) {
19
19
  },
20
20
  peaks: {
21
21
  width,
22
+ factor,
22
23
  },
23
24
  });
24
25
  }
25
26
  exports.signals2DToZ = signals2DToZ;
26
27
  function ensureXYNumber(input) {
27
- let result = typeof input !== 'object' ? { x: input, y: input } : input;
28
- return result;
28
+ return typeof input !== 'object' ? { x: input, y: input } : { ...input };
29
+ }
30
+ function mergeClosePeaks(peaksIn) {
31
+ let peaks = JSON.parse(JSON.stringify(peaksIn));
32
+ for (let i = 0; i < peaks.x.length; i++) {
33
+ for (let j = i + 1; j < peaks.x.length; j++) {
34
+ if (peaks.x[i] === peaks.x[j] && peaks.y[i] === peaks.y[j]) {
35
+ peaks.z[i] += peaks.z[j];
36
+ peaks.x.splice(j, 1);
37
+ peaks.y.splice(j, 1);
38
+ peaks.z.splice(j, 1);
39
+ j--;
40
+ }
41
+ }
42
+ }
43
+ return peaks;
29
44
  }
30
45
  //# sourceMappingURL=signals2DToZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signals2DToZ.js","sourceRoot":"","sources":["../../src/signals/signals2DToZ.ts"],"names":[],"mappings":";;;AAAA,2DAAwD;AAoCxD,SAAgB,YAAY,CAC1B,OAAsB,EACtB,UAA+B,EAAE;IAEjC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAEnE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAC1B,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE;QAChB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CACxB,CAAC;IAEF,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,IAAA,uCAAkB,EAAC,KAAK,EAAE;QAC/B,SAAS,EAAE;YACT,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;YAC1B,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC;YACtB,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC;SACnC;QACD,KAAK,EAAE;YACL,KAAK;SACN;KACF,CAAC,CAAC;AACL,CAAC;AA3BD,oCA2BC;AAED,SAAS,cAAc,CAAC,KAAwB;IAC9C,IAAI,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACxE,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"signals2DToZ.js","sourceRoot":"","sources":["../../src/signals/signals2DToZ.ts"],"names":[],"mappings":";;;AAAA,2DAAwD;AAqCxD,SAAgB,YAAY,CAC1B,OAAsB,EACtB,UAA+B,EAAE;IAEjC,IAAI,EACF,IAAI,GAAG,CAAC,CAAC,EACT,EAAE,GAAG,EAAE,EACP,QAAQ,GAAG,GAAG,EACd,KAAK,GAAG,IAAI,EACZ,MAAM,GAAG,CAAC,GACX,GAAG,OAAO,CAAC;IAEZ,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAC1B,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE;QAChB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CACxB,CAAC;IAEF,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAE9B,OAAO,IAAA,uCAAkB,EAAC,eAAe,CAAC,KAAK,CAAC,EAAE;QAChD,SAAS,EAAE;YACT,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;YAC1B,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC;YACtB,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC;SACnC;QACD,KAAK,EAAE;YACL,KAAK;YACL,MAAM;SACP;KACF,CAAC,CAAC;AACL,CAAC;AAnCD,oCAmCC;AAED,SAAS,cAAc,CAAC,KAAwB;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,eAAe,CAAC,OAAqB;IAC5C,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3C,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBAC1D,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrB,CAAC,EAAE,CAAC;aACL;SACF;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { Nuclei } from '../constants/gyromagneticRatio';
2
+ export interface ObjervedNucleusData {
3
+ /**
4
+ * nucleus to use as reference in the calculation of frequency
5
+ */
6
+ nucleus: Nucleus;
7
+ /**
8
+ * frequency of the reference nucleus
9
+ */
10
+ frequency: number;
11
+ }
12
+ declare type Nucleus = Nuclei | (string & Record<never, never>);
13
+ /**
14
+ * calculate the frequency of a nucleus with respect to a reference nucleus
15
+ */
16
+ export declare function getFrequency(
17
+ /**
18
+ * nucleus to calculate the frequency
19
+ */
20
+ nucleus: Nucleus, observedNucleusData: ObjervedNucleusData): number;
21
+ export {};
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFrequency = void 0;
4
+ const gyromagneticRatio_1 = require("../constants/gyromagneticRatio");
5
+ /**
6
+ * calculate the frequency of a nucleus with respect to a reference nucleus
7
+ */
8
+ function getFrequency(
9
+ /**
10
+ * nucleus to calculate the frequency
11
+ */
12
+ nucleus, observedNucleusData) {
13
+ const { nucleus: obsNucleus, frequency } = observedNucleusData;
14
+ checkExistence(nucleus, obsNucleus);
15
+ return ((frequency * gyromagneticRatio_1.GYROMAGNETIC_RATIO[nucleus]) /
16
+ gyromagneticRatio_1.GYROMAGNETIC_RATIO[obsNucleus]);
17
+ }
18
+ exports.getFrequency = getFrequency;
19
+ function checkExistence(...nucleus) {
20
+ let nuclei = [];
21
+ for (const n of nucleus) {
22
+ if (!(n in gyromagneticRatio_1.GYROMAGNETIC_RATIO)) {
23
+ nuclei.push(n);
24
+ }
25
+ }
26
+ if (nuclei.length !== 0) {
27
+ throw new Error(`${nuclei.join(' , ')} is not supported`);
28
+ }
29
+ }
30
+ //# sourceMappingURL=getFrequency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFrequency.js","sourceRoot":"","sources":["../../src/utilities/getFrequency.ts"],"names":[],"mappings":";;;AAAA,sEAA4E;AAgB5E;;GAEG;AACH,SAAgB,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,sCAAkB,CAAC,OAAiB,CAAC,CAAC;QACnD,sCAAkB,CAAC,UAAoB,CAAC,CACzC,CAAC;AACJ,CAAC;AAfD,oCAeC;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,sCAAkB,CAAC,EAAE;YAC9B,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,7 +1,6 @@
1
1
  // sources:
2
2
  // https://en.wikipedia.org/wiki/Gyromagnetic_ratio
3
- // TODO: #13 can we have a better source and more digits ? @jwist
4
- export const gyromagneticRatio = {
3
+ export const GYROMAGNETIC_RATIO = {
5
4
  '1H': 267.52218744e6,
6
5
  '2H': 41.065e6,
7
6
  '3H': 285.3508e6,
@@ -1 +1 @@
1
- {"version":3,"file":"gyromagneticRatio.js","sourceRoot":"","sources":["../../src/constants/gyromagneticRatio.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,mDAAmD;AAEnD,iEAAiE;AAEjE,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,CAAC,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC,QAAQ;IAChB,KAAK,EAAE,CAAC,QAAQ;IAChB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,CAAC,OAAO;IAChB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,CAAC,QAAQ;CACnB,CAAC"}
1
+ {"version":3,"file":"gyromagneticRatio.js","sourceRoot":"","sources":["../../src/constants/gyromagneticRatio.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,mDAAmD;AA4BnD,MAAM,CAAC,MAAM,kBAAkB,GAAsB;IACnD,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,CAAC,SAAS;IACjB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,CAAC,QAAQ;IAChB,KAAK,EAAE,CAAC,QAAQ;IAChB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,CAAC,OAAO;IAChB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,CAAC,QAAQ;CACnB,CAAC"}
package/lib-esm/index.js CHANGED
@@ -19,6 +19,7 @@ export * from './signals/signalsToXY';
19
19
  export * from './signals/signals2DToZ';
20
20
  export * from './utilities/resurrect';
21
21
  export * from './utilities/rangeFromSignal';
22
+ export * from './utilities/getFrequency';
22
23
  export * from './xy/xyAutoPeaksPicking';
23
24
  export * from './xy/xyAutoRangesPicking';
24
25
  export * from './xyz/xyzAutoZonesPicking';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,+BAA+B,CAAC;AAE9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAE/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAE5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAE5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAEzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AAEtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,+BAA+B,CAAC;AAE9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAE/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAE5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AAEzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAEzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AAEtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { generateSpectrum2D } from 'spectrum-generator';
2
2
  export function signals2DToZ(signals, options = {}) {
3
- let { from = -1, to = 12, nbPoints = 512, width = 0.02 } = options;
3
+ let { from = -1, to = 12, nbPoints = 512, width = 0.02, factor = 3, } = options;
4
4
  const peaks = signals.reduce((acc, { x, y }) => {
5
5
  acc.x.push(x.delta);
6
6
  acc.y.push(y.delta);
@@ -8,7 +8,7 @@ export function signals2DToZ(signals, options = {}) {
8
8
  return acc;
9
9
  }, { x: [], y: [], z: [] });
10
10
  width = ensureXYNumber(width);
11
- return generateSpectrum2D(peaks, {
11
+ return generateSpectrum2D(mergeClosePeaks(peaks), {
12
12
  generator: {
13
13
  from: ensureXYNumber(from),
14
14
  to: ensureXYNumber(to),
@@ -16,11 +16,26 @@ export function signals2DToZ(signals, options = {}) {
16
16
  },
17
17
  peaks: {
18
18
  width,
19
+ factor,
19
20
  },
20
21
  });
21
22
  }
22
23
  function ensureXYNumber(input) {
23
- let result = typeof input !== 'object' ? { x: input, y: input } : input;
24
- return result;
24
+ return typeof input !== 'object' ? { x: input, y: input } : { ...input };
25
+ }
26
+ function mergeClosePeaks(peaksIn) {
27
+ let peaks = JSON.parse(JSON.stringify(peaksIn));
28
+ for (let i = 0; i < peaks.x.length; i++) {
29
+ for (let j = i + 1; j < peaks.x.length; j++) {
30
+ if (peaks.x[i] === peaks.x[j] && peaks.y[i] === peaks.y[j]) {
31
+ peaks.z[i] += peaks.z[j];
32
+ peaks.x.splice(j, 1);
33
+ peaks.y.splice(j, 1);
34
+ peaks.z.splice(j, 1);
35
+ j--;
36
+ }
37
+ }
38
+ }
39
+ return peaks;
25
40
  }
26
41
  //# sourceMappingURL=signals2DToZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signals2DToZ.js","sourceRoot":"","sources":["../../src/signals/signals2DToZ.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAoCxD,MAAM,UAAU,YAAY,CAC1B,OAAsB,EACtB,UAA+B,EAAE;IAEjC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAEnE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAC1B,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE;QAChB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CACxB,CAAC;IAEF,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,kBAAkB,CAAC,KAAK,EAAE;QAC/B,SAAS,EAAE;YACT,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;YAC1B,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC;YACtB,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC;SACnC;QACD,KAAK,EAAE;YACL,KAAK;SACN;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,KAAwB;IAC9C,IAAI,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACxE,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"signals2DToZ.js","sourceRoot":"","sources":["../../src/signals/signals2DToZ.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAqCxD,MAAM,UAAU,YAAY,CAC1B,OAAsB,EACtB,UAA+B,EAAE;IAEjC,IAAI,EACF,IAAI,GAAG,CAAC,CAAC,EACT,EAAE,GAAG,EAAE,EACP,QAAQ,GAAG,GAAG,EACd,KAAK,GAAG,IAAI,EACZ,MAAM,GAAG,CAAC,GACX,GAAG,OAAO,CAAC;IAEZ,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAC1B,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE;QAChB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CACxB,CAAC;IAEF,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAE9B,OAAO,kBAAkB,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;QAChD,SAAS,EAAE;YACT,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC;YAC1B,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC;YACtB,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC;SACnC;QACD,KAAK,EAAE;YACL,KAAK;YACL,MAAM;SACP;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,KAAwB;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,eAAe,CAAC,OAAqB;IAC5C,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3C,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBAC1D,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrB,CAAC,EAAE,CAAC;aACL;SACF;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { GYROMAGNETIC_RATIO } from '../constants/gyromagneticRatio';
2
+ /**
3
+ * calculate the frequency of a nucleus with respect to a reference nucleus
4
+ */
5
+ export function getFrequency(
6
+ /**
7
+ * nucleus to calculate the frequency
8
+ */
9
+ nucleus, observedNucleusData) {
10
+ const { nucleus: obsNucleus, frequency } = observedNucleusData;
11
+ checkExistence(nucleus, obsNucleus);
12
+ return ((frequency * GYROMAGNETIC_RATIO[nucleus]) /
13
+ GYROMAGNETIC_RATIO[obsNucleus]);
14
+ }
15
+ function checkExistence(...nucleus) {
16
+ let nuclei = [];
17
+ for (const n of nucleus) {
18
+ if (!(n in GYROMAGNETIC_RATIO)) {
19
+ nuclei.push(n);
20
+ }
21
+ }
22
+ if (nuclei.length !== 0) {
23
+ throw new Error(`${nuclei.join(' , ')} is not supported`);
24
+ }
25
+ }
26
+ //# sourceMappingURL=getFrequency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFrequency.js","sourceRoot":"","sources":["../../src/utilities/getFrequency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAU,MAAM,gCAAgC,CAAC;AAgB5E;;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,kBAAkB,CAAC,OAAiB,CAAC,CAAC;QACnD,kBAAkB,CAAC,UAAoB,CAAC,CACzC,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,kBAAkB,CAAC,EAAE;YAC9B,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.3.0",
3
+ "version": "7.4.0",
4
4
  "description": "Pure functions allowing to process NMR spectra.",
5
5
  "main": "./lib/index.js",
6
6
  "module": "./lib-esm/index.js",
@@ -3,7 +3,31 @@
3
3
 
4
4
  // TODO: #13 can we have a better source and more digits ? @jwist
5
5
 
6
- export const gyromagneticRatio = {
6
+ export type Nuclei =
7
+ | '1H'
8
+ | '2H'
9
+ | '3H'
10
+ | '3He'
11
+ | '7Li'
12
+ | '13C'
13
+ | '14N'
14
+ | '15N'
15
+ | '17O'
16
+ | '19F'
17
+ | '23Na'
18
+ | '27Al'
19
+ | '29Si'
20
+ | '31P'
21
+ | '57Fe'
22
+ | '63Cu'
23
+ | '67Zn'
24
+ | '129Xe';
25
+
26
+ type GyromagneticRatio = {
27
+ [key in Nuclei]: number;
28
+ };
29
+
30
+ export const GYROMAGNETIC_RATIO: GyromagneticRatio = {
7
31
  '1H': 267.52218744e6,
8
32
  '2H': 41.065e6,
9
33
  '3H': 285.3508e6,
package/src/index.ts CHANGED
@@ -25,6 +25,7 @@ export * from './signals/signals2DToZ';
25
25
 
26
26
  export * from './utilities/resurrect';
27
27
  export * from './utilities/rangeFromSignal';
28
+ export * from './utilities/getFrequency';
28
29
 
29
30
  export * from './xy/xyAutoPeaksPicking';
30
31
  export * from './xy/xyAutoRangesPicking';
@@ -26,6 +26,7 @@ interface Signals2DToZOptions {
26
26
  * @default 0.02
27
27
  */
28
28
  width?: number | XYNumber;
29
+ factor?: number | XYNumber;
29
30
  }
30
31
 
31
32
  export interface Peak2DSeries {
@@ -38,7 +39,13 @@ export function signals2DToZ(
38
39
  signals: NMRSignal2D[],
39
40
  options: Signals2DToZOptions = {},
40
41
  ) {
41
- let { from = -1, to = 12, nbPoints = 512, width = 0.02 } = options;
42
+ let {
43
+ from = -1,
44
+ to = 12,
45
+ nbPoints = 512,
46
+ width = 0.02,
47
+ factor = 3,
48
+ } = options;
42
49
 
43
50
  const peaks = signals.reduce<Peak2DSeries>(
44
51
  (acc, { x, y }) => {
@@ -51,7 +58,8 @@ export function signals2DToZ(
51
58
  );
52
59
 
53
60
  width = ensureXYNumber(width);
54
- return generateSpectrum2D(peaks, {
61
+
62
+ return generateSpectrum2D(mergeClosePeaks(peaks), {
55
63
  generator: {
56
64
  from: ensureXYNumber(from),
57
65
  to: ensureXYNumber(to),
@@ -59,11 +67,27 @@ export function signals2DToZ(
59
67
  },
60
68
  peaks: {
61
69
  width,
70
+ factor,
62
71
  },
63
72
  });
64
73
  }
65
74
 
66
- function ensureXYNumber(input: number | XYNumber): XYNumber {
67
- let result = typeof input !== 'object' ? { x: input, y: input } : input;
68
- return result;
75
+ function ensureXYNumber(input: number | XYNumber) {
76
+ return typeof input !== 'object' ? { x: input, y: input } : { ...input };
77
+ }
78
+
79
+ function mergeClosePeaks(peaksIn: Peak2DSeries) {
80
+ let peaks = JSON.parse(JSON.stringify(peaksIn));
81
+ for (let i = 0; i < peaks.x.length; i++) {
82
+ for (let j = i + 1; j < peaks.x.length; j++) {
83
+ if (peaks.x[i] === peaks.x[j] && peaks.y[i] === peaks.y[j]) {
84
+ peaks.z[i] += peaks.z[j];
85
+ peaks.x.splice(j, 1);
86
+ peaks.y.splice(j, 1);
87
+ peaks.z.splice(j, 1);
88
+ j--;
89
+ }
90
+ }
91
+ }
92
+ return peaks;
69
93
  }
@@ -0,0 +1,47 @@
1
+ import { GYROMAGNETIC_RATIO, Nuclei } from '../constants/gyromagneticRatio';
2
+
3
+ export interface ObjervedNucleusData {
4
+ /**
5
+ * nucleus to use as reference in the calculation of frequency
6
+ */
7
+ nucleus: Nucleus;
8
+ /**
9
+ * frequency of the reference nucleus
10
+ */
11
+ frequency: number;
12
+ }
13
+
14
+ //Literal type is extends string and when union it with string we lose the autocomplete and to solve this we distinguish string
15
+ type Nucleus = Nuclei | (string & Record<never, never>);
16
+
17
+ /**
18
+ * calculate the frequency of a nucleus with respect to a reference nucleus
19
+ */
20
+ export function getFrequency(
21
+ /**
22
+ * nucleus to calculate the frequency
23
+ */
24
+ nucleus: Nucleus,
25
+ observedNucleusData: ObjervedNucleusData,
26
+ ) {
27
+ const { nucleus: obsNucleus, frequency } = observedNucleusData;
28
+
29
+ checkExistence(nucleus, obsNucleus);
30
+
31
+ return (
32
+ (frequency * GYROMAGNETIC_RATIO[nucleus as Nuclei]) /
33
+ GYROMAGNETIC_RATIO[obsNucleus as Nuclei]
34
+ );
35
+ }
36
+
37
+ function checkExistence(...nucleus: Nucleus[]) {
38
+ let nuclei: string[] = [];
39
+ for (const n of nucleus) {
40
+ if (!(n in GYROMAGNETIC_RATIO)) {
41
+ nuclei.push(n);
42
+ }
43
+ }
44
+ if (nuclei.length !== 0) {
45
+ throw new Error(`${nuclei.join(' , ')} is not supported`);
46
+ }
47
+ }