@zakodium/nmrium-core-plugins 0.0.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.
- package/README.md +115 -0
- package/dist/nmrium-core-plugins.cjs +6 -0
- package/dist/nmrium-core-plugins.d.ts +165 -0
- package/dist/nmrium-core-plugins.mjs +6 -0
- package/package.json +85 -0
package/README.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<h3 align="center">
|
|
2
|
+
<a href="https://www.zakodium.com">
|
|
3
|
+
<img src="https://www.zakodium.com/brand/zakodium-logo-white.svg" width="50" alt="Zakodium logo" />
|
|
4
|
+
</a>
|
|
5
|
+
<p>
|
|
6
|
+
Maintained by <a href="https://www.zakodium.com">Zakodium</a>
|
|
7
|
+
</p>
|
|
8
|
+
</h3>
|
|
9
|
+
|
|
10
|
+
# nmrium-core-plugins
|
|
11
|
+
|
|
12
|
+
[![NPM version][npm-image]][npm-url]
|
|
13
|
+
[![npm download][download-image]][download-url]
|
|
14
|
+
[![DOI][doi-image]][doi-url]
|
|
15
|
+
|
|
16
|
+
Package containing core plugins to work with nmrium.
|
|
17
|
+
It provides essential loaders:
|
|
18
|
+
|
|
19
|
+
- bruker
|
|
20
|
+
- jcamp
|
|
21
|
+
- jdx
|
|
22
|
+
- molfile
|
|
23
|
+
- nmre
|
|
24
|
+
- sdf
|
|
25
|
+
- smiles
|
|
26
|
+
- varian
|
|
27
|
+
|
|
28
|
+
And it provides the recommended post-processing plugin.
|
|
29
|
+
|
|
30
|
+
For 1D spectra:
|
|
31
|
+
|
|
32
|
+
- digitalFilter
|
|
33
|
+
- backwardLinearPrediction
|
|
34
|
+
- apodization
|
|
35
|
+
- zeroFilling
|
|
36
|
+
- fft
|
|
37
|
+
- phaseCorrection
|
|
38
|
+
|
|
39
|
+
For 2D spectra:
|
|
40
|
+
|
|
41
|
+
- blpDimension1
|
|
42
|
+
- apodizationDimension1
|
|
43
|
+
- zeroFillingDimension1
|
|
44
|
+
- fftDimension1
|
|
45
|
+
- nusDimension2
|
|
46
|
+
- apodizationDimension2
|
|
47
|
+
- zeroFillingDimension2
|
|
48
|
+
- symmetrizeCosyLike
|
|
49
|
+
- phaseCorrectionTwoDimensions
|
|
50
|
+
- fftDimension2
|
|
51
|
+
|
|
52
|
+
These features can change at any time to be sold in dedicated plugins.
|
|
53
|
+
|
|
54
|
+
## Installation
|
|
55
|
+
|
|
56
|
+
`$ npm i @zakodium/nmrium-core-plugins`
|
|
57
|
+
|
|
58
|
+
## Usage
|
|
59
|
+
|
|
60
|
+
```js
|
|
61
|
+
import { fileCollectionFromPath } from 'filelist-utils';
|
|
62
|
+
import init from '@zakodium/nmrium-core-plugins';
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Initialize the core with the recommended plugins
|
|
66
|
+
*/
|
|
67
|
+
const core = init();
|
|
68
|
+
|
|
69
|
+
const fileCollection = fileCollectionFromPath('path_to_data');
|
|
70
|
+
// we can read a zip, jdx, jdf, nmredata, json, nmrium file extensions
|
|
71
|
+
const result = await core.read(fileCollection, options);
|
|
72
|
+
|
|
73
|
+
// based on extension we choose the format processor
|
|
74
|
+
console.log(result);
|
|
75
|
+
// return {
|
|
76
|
+
// spectra: [],
|
|
77
|
+
// molecules: [],
|
|
78
|
+
// }
|
|
79
|
+
|
|
80
|
+
// readSource function accept a partial FileCollectionItems and a baseURL to generate a
|
|
81
|
+
// data structure with a source object inside with { files, filter, baseURL }
|
|
82
|
+
|
|
83
|
+
const nmriumObject = await core.readFromWebSource(
|
|
84
|
+
{
|
|
85
|
+
baseURL: 'https://cheminfo.github.io',
|
|
86
|
+
files: [
|
|
87
|
+
{
|
|
88
|
+
name: 'aspirin-1h.zip',
|
|
89
|
+
relativePath: 'bruker-data-test/data/zipped/aspirin-1h.zip',
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
{},
|
|
94
|
+
);
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
This package exports all plugin classes with their instanciation method helpers.
|
|
98
|
+
Ex: `BrukerLoaderPlugin` class, and `brukerLoader()` method.
|
|
99
|
+
|
|
100
|
+
And it exports the `recommended(core, plugins)` method to instance all plugins from this package and concate them with your own plugins.
|
|
101
|
+
It returns an array of plugins, you have to register them in the core.
|
|
102
|
+
|
|
103
|
+
## License
|
|
104
|
+
|
|
105
|
+
© 2025 Zakodium Sàrl. This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. [CC BY-NC-SA 4.0](./LICENSE)
|
|
106
|
+
|
|
107
|
+
This package is based on MIT-licensed code that can be found here: https://doi.org/10.5281/zenodo.7100132
|
|
108
|
+
|
|
109
|
+
[npm-image]: https://img.shields.io/npm/v/@zakodium/nmrium-core-plugins.svg
|
|
110
|
+
[npm-url]: https://www.npmjs.com/package/@zakodium/nmrium-core-plugins
|
|
111
|
+
[download-image]: https://img.shields.io/npm/dm/@zakodium/nmrium-core-plugins.svg
|
|
112
|
+
[download-url]: https://www.npmjs.com/package/@zakodium/nmrium-core-plugins
|
|
113
|
+
[doi-image]: https://zenodo.org/badge/DOI/10.5281/zenodo.7101438.svg
|
|
114
|
+
<!-- TODO: fix doi-url for nmrium-core-plugins package -->
|
|
115
|
+
[doi-url]: https://doi.org/10.5281/zenodo.7101438
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";var Er=Object.create;var K=Object.defineProperty;var Tr=Object.getOwnPropertyDescriptor;var Lr=Object.getOwnPropertyNames;var kr=Object.getPrototypeOf,wr=Object.prototype.hasOwnProperty;var vr=(e,r)=>{for(var t in r)K(e,t,{get:r[t],enumerable:!0})},_e=(e,r,t,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of Lr(r))!wr.call(e,n)&&n!==t&&K(e,n,{get:()=>r[n],enumerable:!(i=Tr(r,n))||i.enumerable});return e};var Se=(e,r,t)=>(t=e!=null?Er(kr(e)):{},_e(r||!e||!e.__esModule?K(t,"default",{value:e,enumerable:!0}):t,e)),qr=e=>_e(K({},"__esModule",{value:!0}),e);var Vn={};vr(Vn,{BrukerLoaderPlugin:()=>B,JDFLoaderPlugin:()=>J,JcampLoaderPlugin:()=>W,MolfileLoaderPlugin:()=>V,NMReLoaderPlugin:()=>_,SDFLoaderPlugin:()=>H,SmilesLoaderPlugin:()=>X,VarianLoaderPlugin:()=>Y,brukerLoader:()=>ce,default:()=>xr,init:()=>xr,jcampLoader:()=>ue,jdfLoader:()=>fe,molfileLoader:()=>de,nmreLoader:()=>ye,processJcamp:()=>Ee,readSDF:()=>We,readSMILES:()=>Je,recommended:()=>Mr,sdfLoader:()=>Fe,smilesLoader:()=>Ne,spectrum1DToJcamp:()=>Cr,varianLoader:()=>Pe});module.exports=qr(Vn);var Dr=require("@zakodium/nmrium-core");var nt=require("@zakodium/nmrium-core"),se=require("brukerconverter");function Z(e){let r=[];for(let t of e){if(!t)continue;let{groups:{value:i,unit:n}={}}=t.trim().match(/[$$]*\s*(?<value>[\d.]+)\s*(?<unit>[a-zA-Z]+)/)||{};r.push($r(i,n))}return r}function $r(e,r){switch(r.toLowerCase()){case"s":return Number.parseFloat(e);case"ms":return Number.parseFloat(e)/1e3;case"m":case"min":return Number.parseFloat(e)*60;default:return Number.NaN}}var Re=require("is-any-array");function I(e){if(jr(e))return Br(e)?e.map(He):He(e);if(typeof e=="object"&&e!==null){let r={};for(let t in e)r[t]=I(e[t]);return r}return e}function jr(e){return(0,Re.isAnyArray)(e)}function He(e){return Float64Array.from(e)}function Br(e){return(0,Re.isAnyArray)(e[0])}var k=require("@zakodium/nmrium-core"),et=require("gyromagnetic-ratio"),ie=require("is-any-array"),tt=require("nmr-processing");var E=require("is-any-array");function Q(e){return typeof e=="number"}function ee(e){let{phc0:r,phc1:t}=e;return!(0,E.isAnyArray)(r)&&!Q(r)||!(0,E.isAnyArray)(t)&&!Q(t)||(0,E.isAnyArray)(r)&&!Q(r[0])||(0,E.isAnyArray)(t)&&!Q(t[0])?{}:((0,E.isAnyArray)(t)?t[0]*=-1:t*=-1,(0,E.isAnyArray)(r)?r[0]*=-1:r*=-1,{phc0:r,phc1:t})}function Ye(e,r,t){if(e>0)return Number(e);if(r>14||r===0)return 0;if(Xe[r]){let i=Xe[r];if(!i[t])throw new Error(`decim ${t} not in lookup table for dspfvs ${r}`);return i[t]}else throw new Error(`dspfvs ${r} not in lookup table`)}var Xe={10:{2:44.75,3:33.5,4:66.625,6:59.08333333333333,8:68.5625,12:60.375,16:69.53125,24:61.02083333333333,32:70.015625,48:61.34375,64:70.2578125,96:61.50520833333333,128:70.37890625,192:61.5859375,256:70.439453125,384:61.62630208333333,512:70.4697265625,768:61.646484375,1024:70.48486328125,1536:61.65657552083333,2048:70.492431640625},11:{2:46,3:36.5,4:48,6:50.16666666666667,8:53.25,12:69.5,16:72.25,24:70.16666666666667,32:72.75,48:70.5,64:73,96:70.66666666666667,128:72.5,192:71.33333333333333,256:72.25,384:71.66666666666667,512:72.125,768:71.83333333333333,1024:72.0625,1536:71.91666666666667,2048:72.03125},12:{2:46,3:36.5,4:48,6:50.16666666666667,8:53.25,12:69.5,16:71.625,24:70.16666666666667,32:72.125,48:70.5,64:72.375,96:70.66666666666666,128:72.5,192:71.333333333,256:72.25,384:71.66666666666667,512:72.125,768:71.83333333333333,1024:72.0625,1536:71.91666666666667,2048:72.03125},13:{2:2.75,3:2.833333333333333,4:2.875,6:2.916666666666667,8:2.9375,12:2.958333333333333,16:2.96875,24:2.979166666666667,32:2.984375,48:2.989583333333333,64:2.9921875,96:2.994791666666667}};var Ke=require("nmr-processing");function T(e,r=","){if(e&&typeof e=="string")return e.split(r)}function te(e,r,t){let i=[];if(e[`${t}AXNUC`]&&(i=e[`${t}AXNUC`],Array.isArray(i)||(i=[i]),i=O(i)),i.length===0&&e[`${t}NUC1`]&&(i=e[`${t}NUC1`],Array.isArray(i)||(i=[i]),i=O(i)),i.length===0&&e[".NUCLEUS"]){let n=T(e[".NUCLEUS"]);if(e[`${t}SYMBOL`]){let o=e[`${t}SYMBOL`].split(","),s=o.findIndex(a=>a.includes("2")),l=o.findIndex(a=>a.includes("1"));s!==-1&&l!==-1&&n?i=O([n[s],n[l]]):i=O(n).reverse()}else i=O(n)}return i.length===0&&e[".OBSERVENUCLEUS"]&&(i=O([e[".OBSERVENUCLEUS"]])),i.length===0&&r.experiment&&(i=O(Ge(r.experiment[0]))),zr(e)&&(i=[e["2D_X_NUCLEUS"].replaceAll(/[^A-Za-z0-9]/g,""),e["2D_Y_NUCLEUS"].replaceAll(/[^A-Za-z0-9]/g,"")]),r.experiment&&(r.experiment[0].match("jres")||r.experiment[0].match("dosy"))&&(i=Ge(r.experiment[0])),i.map(Ke.normalizeNucleus)}function zr(e){return e["2D_X_NUCLEUS"]&&!e["2D_X_NUCLEUS"].includes("off")&&e["2D_Y_NUCLEUS"]&&!e["2D_Y_NUCLEUS"].includes("off")}function Ge(e){return typeof e!="string"?[]:(e=e.toLowerCase(),e.includes("jres")?["1H","Hz"]:e.includes("dosy")?["1H","D"]:e.includes("hmbc")||e.includes("hsqc")?["1H","13C"]:e.includes("cosy")||e.includes("tocsy")?["1H","1H"]:[])}function O(e){if(!e)return[];let r=e.map(i=>String(i).replaceAll(/[^A-Za-z0-9]/g,"").replace("NA","").replace("off","")),t=0;for(let i of r)i||t++;return t===0?r:[]}var Ze=require("@zakodium/nmrium-core");function re(e={},r={},t={}){e===null&&(e={}),typeof e=="string"&&(e={pulseSequence:e});let i=Array.isArray(e.pulseSequence)?e.pulseSequence[0]:e.pulseSequence||"";if(typeof i!="string")return e.dimension?`${e.dimension}d`:"";if(i=i.toLowerCase(),i.includes("zg")||i.includes("single_pulse_dec")||i.includes("udeft"))return"1d";if(i.includes("hsqct")||i.includes("invi")&&(i.includes("ml")||i.includes("di")))return"hsqctocsy";if(i.includes("hsqc")||i.includes("invi"))return"hsqc";if(i.includes("hmbc")||i.includes("inv4")&&i.includes("lp"))return"hmbc";if(i.includes("hmqc"))return"hmqc";if(i.includes("cosy"))return"cosy";if(i.includes("jres"))return"jres";if(i.includes("dosy"))return"dosy";if(i.includes("tocsy")||i.includes("mlev")||i.includes("dipsi"))return"tocsy";if(i.includes("noesy"))return"noesy";if(i.includes("roesy"))return"roesy";if(i.includes("dept"))return"dept";if(i.includes("jmod")||i.includes("apt"))return"aptjmod";if(i.includes("inad"))return"inadequate";if(i.includes("adeq"))return"adequate";let{prefix:n=""}=t,o=((0,Ze.getOneIfArray)(r[`${n}SPECTYP`])||"").replace(/^<(.*)>$/,"$1").toLowerCase();return o.length>0&&o!=="undefined"?o:e.dimension?`${e.dimension}d`:""}function N(e,r,t,i=!1){t===void 0||r in e&&!i||(Array.isArray(t)?e[r]=t.map(Qe):e[r]=[Qe(t)])}function Qe(e){return typeof e=="string"&&(e.startsWith("<")&&e.endsWith(">")&&(e=e.slice(1,-1)),e=e.replace(/\$.*/,"").trim()),e}function oe(e,r={}){let{prefix:t="",logger:i}=r,n={dimension:0,nucleus:[],isFid:!1,isFt:!1},o=JSON.stringify(e),s=/\r\n/.exec(o)?`\r
|
|
2
|
+
`:`
|
|
3
|
+
`,{JCAMPDX:l="",ORIGIN:a=""}=e,m=String(l).toLowerCase()+String(a).toLowerCase();"SPECTROMETER/DATASYSTEM"in e&&(m=e["SPECTROMETER/DATASYSTEM"]);let u=(d=[])=>{for(let p of d)if(!(p in n))return!1;return!0};(m.includes("mestre")||m.includes("nova"))&&(m="mnova"),n.creator=m,e.LONGDATE&&De(n,Date.parse(e.LONGDATE)),N(n,"pulseSequence",e[".PULSESEQUENCE"]||e[".PULPROG"]||e[`${t}PULPROG`]);let c=e[`${t}OWNER`];if(c&&N(n,"owner",c.replaceAll(/\$\$.*/gm,"")),N(n,"aqMod",e[`${t}AQ_mod`]),N(n,"experiment",re(n,e,{prefix:t})),n.nucleus=te(e,n,t),n.nucleus.length===0)if(i)i?.warn("There is not a nucleus detected, assuming 1H"),n.nucleus=["1H"];else throw new Error("There is not a nucleus detected");n.dimension=n.nucleus.length;let g=e[`${t}.ACQUISITIONSCHEME`]||e[`${t}FnMODE`];if(g&&N(n,"acquisitionScheme",Wr((0,k.getOneIfArray)(g,1))),N(n,"acquisitionMode",e[`${t}.ACQUISITIONMODE`]),M(n,"lpNumberOfCoefficients",e[`${t}NCOEF`]),M(n,"linearPredictionBin",e[`${t}LPBIN`]),M(n,"tdOff",e[`${t}TDoff`]),N(n,"windowMultiplicationMode",e[`${t}WDW`]),N(n,"title",e.TITLE),N(n,"solvent",e[".SOLVENTNAME"]),N(n,"temperature",e[`${t}TE`]||e[".TE"]),N(n,"type",e.DATATYPE),N(n,"dataClass",e[`${t}DATACLASS`]),N(n,"phc1",e[`${t}PHC1`]),N(n,"phc0",e[`${t}PHC0`]),n.type){let d=n.type[0].toUpperCase();d.includes("FID")?(n.isFid=!0,n.isComplex=!0):d.includes("SPECTRUM")&&(n.isFt=!0)}if(N(n,"firstX",e[`${t}FIRSTX`]),N(n,"lastX",e[`${t}LASTX`]),N(n,"numberOfPoints",e[`${t}NPOINTS`]),N(n,"originFrequency",e[`${t}SFO1`]),n.dimension===1&&M(n,"originFrequency",e[".OBSERVEFREQUENCY"]),"originFrequency"in n&&(n.originFrequency=ne(n.originFrequency)),!n.originFrequency&&n.dimension===2&&".OBSERVEFREQUENCY"in e){let{nucleus:d}=n,p=ne(e[".OBSERVEFREQUENCY"]);if((0,ie.isAnyArray)(p)&&p.length>1){let f=e[`${t}SYMBOL`].split(","),F=f.findIndex(b=>b.includes("2")),h=f.findIndex(b=>b.includes("1"));F!==-1&&h!==-1?n.originFrequency=[p[F],p[h]]:n.originFrequency=p.slice()}else if(typeof p=="number"){let f=(0,tt.getFrequency)(d[1],{frequency:p,nucleus:d[0]});n.originFrequency=[p,f]}}if((!n.originFrequency||n.originFrequency.some(d=>Number.isNaN(d)||d===0))&&(n.originFrequency||(n.originFrequency=n.dimension>1?[400,400]:[400]),n.originFrequency=n.originFrequency.map(d=>Number.isNaN(d)||d===0?400:d),i?.warn("The frequency could not be determined and was set to 400 MHz")),m.toLocaleLowerCase().includes("oxford instruments")?Jr(n,e,{...r,separator:s}):m.includes("nanalysis")&&Vr(n,e),m!=="mnova"&&m!=="mestre"){let d=n.nucleus[0],p=(0,et.getGyromagneticRatio)(d);if(N(n,"probeName",e[`${t}PROBHD`]),N(n,"baseFrequency",e[`${t}BF1`]),N(n,"baseFrequency",e[`${t}SF`]),M(n,"scaleFactor",e[`${t}NC_proc`]),"scaleFactor"in n)for(let b=0;b<n.scaleFactor.length;)n.scaleFactor[b]=2**n.scaleFactor[b++];if(!("baseFrequency"in n)&&"originFrequency"in n?N(n,"baseFrequency",n.originFrequency):n.baseFrequency=ne(n.baseFrequency),!["baseFrequency","originFrequency"].some(b=>!n[b])&&p){let{baseFrequency:b}=n,P=2*Math.PI*(b[0]/p)*1e6;N(n,"fieldStrength",P)}M(n,"spectralWidth",e[`${t}SW`]),M(n,"spectralWidth",e[`${t}QM_SPECTRAL_WIDTH`]),n.dimension===1&&e[`${t}SweepWidth`]&&n.originFrequency&&M(n,"spectralWidth",e[`${t}SweepWidth`]/n.originFrequency[0]),N(n,"numberOfPoints",e[`${t}TD`],!0);let f=n.numberOfPoints;if(N(n,"spectrumSize",e[`${t}SI`]??f),N(n,"sampleName",e[`${t}NAME`]),e[`${t}FNTYPE`]!==void 0&&N(n,"acquisitionMode",Number.parseInt(e[`${t}FNTYPE`],10)),(e[`${t}VARNAME`]?e[`${t}VARNAME`].split(",")[0]:"")==="TIME"){let b=typeof e.LAST=="string"?e.LAST.replace(" ","").split(",")[0]:e.LAST;M(n,"acquisitionTime",b)}if(!n.acquisitionTime&&u(["numberOfPoints","spectralWidth"])){let{spectralWidth:b,originFrequency:P}=n;N(n,"acquisitionTime",Number((f[0]-1)/(2*b[0]*P[0])))}if(e[`${t}P`]){let b=1e6/((0,k.getOneIfArray)(e[`${t}P`]).split(s)[1].split(" ")[1]*4);N(n,"pulseStrength90",b)}if(e[`${t}D`]){let b=(0,k.getOneIfArray)(e[`${t}D`]).split(s)[1].split(" ")[1];M(n,"relaxationTime",b)}if(M(n,"numberOfScans",e[`${t}NS`]),M(n,"numberOfScans",e[`${t}QM_NSCANS`]),N(n,"groupDelay",e[`${t}GRPDLY`]),N(n,"dspfvs",e[`${t}DSPFVS`]),N(n,"decim",e[`${t}DECIM`]),n.isFid&&("groupDelay"in n||u(["dspfvs","decim"]))){let{groupDelay:b,dspfvs:P,decim:R}=n,S=Ye(b?.[0]??0,P?.[0],R?.[0]);N(n,"digitalFilter",S)}let h;if(u(["numberOfPoints","spectralWidth"])){let{spectralWidth:b,numberOfPoints:P}=n;n.isFid?h=P.map(R=>n.acquisitionTime[0]/(R-1)):h=P.map((R,S)=>b[S]/(R-1))}if(N(n,"increment",h),e[`${t}DATE`]){let b=(0,k.getOneIfArray)(e[`${t}DATE`]),P=Number.parseInt(b,10)*1e3;Number.isNaN(P)?De(n,Date.parse(b)):De(n,P)}n.solvent||N(n,"solvent",(0,k.getOneIfArray)(e[`${t}SOLVENT`]))}if(n.dimension<2&&"dataClass"in n&&n.dataClass[0].toUpperCase()==="NTUPLES"&&(N(n,"last",T(e[`${t}LAST`])),N(n,"first",T(e[`${t}FIRST`])),N(n,"varDim",T(e[`${t}VARDIM`])),N(n,"symbols",T(e[`${t}SYMBOL`])),n.symbols&&Array.isArray(n.symbols))){n.symbols.includes("R")&&n.symbols.includes("I")&&(n.isComplex=!0);let d=n.symbols.findIndex(p=>p.toLowerCase()==="x");if(M(n,"firstX",n.first[d]),M(n,"lastX",n.last[d]),M(n,"numberOfPoints",n.varDim[d]),!("spectralWidth"in n)){let{lastX:p,numberOfPoints:f,firstX:F}=n;N(n,"spectralWidth",n.isFid?f/(2*p):Math.abs(p-F)/n.originFrequency)}}if(`${t}REVERSE`in e){let d=e[`${t}REVERSE`];n.reverse=(Array.isArray(d)?d:[d]).map(p=>typeof p=="string"?p.includes("yes"):p)}let y=e[`${t}REFERENCE_POINT`];if(!("frequencyOffset"in n)&&y&&u(["spectralWidth","baseFrequency"])){let d=typeof y=="number"?y:e[`${t}REFERENCE_POINT`].match(/(?<reference>[+-]?\d+(?:\.\d+)?)\s*.*/),p;if(typeof y=="number"?p=y:(y.match(/(?<reference>[+-]?\d+(?:\.\d+)?)\s*.*/),p=Number(d?.groups?.reference)),!Number.isNaN(p)){let{spectralWidth:f,baseFrequency:F}=n;N(n,"frequencyOffset",.5*f*F-p)}}if(!("frequencyOffset"in n)&&u(["baseFrequency","originFrequency"])){let{baseFrequency:d,originFrequency:p}=n,f=d.map((F,h)=>(p[h]-F)*1e6);N(n,"frequencyOffset",f)}for(let d in n)n[d]&&n[d].length===1&&(n[d]=n[d][0]);return!n.frequencyOffset&&".SHIFTREFERENCE"in e&&Ur(e,n),Array.isArray(n.nucleus)||(n.nucleus=[n.nucleus]),n}function M(e,r,t){t!==void 0&&N(e,r,ne(t))}function De(e,r){if(!Number.isNaN(r)){e.epoch=r;let t=new Date(r);e.date=t.toUTCString(),e.localeDate=t.toLocaleString()}}function Ur(e,r){let t=e[".SHIFTREFERENCE"],i=t.trim().startsWith("(")?/\((?<data>[^)]+)\)/:/(?<data>[^)]+)/,n=t.match(i);if(n.groups.data){let o=n.groups.data.split(",");if(o.length<4)return;let s=Number.parseInt(r.numberOfPoints,10),{spectralWidth:l,baseFrequency:a}=r,m=Number.parseInt(o[2],10),u=Number.parseFloat(o[3]),c;if(r.isFid){if(["baseFrequency","numberOfPoints","spectralWidth"].some(g=>!(g in r)))return;c=u+(s*.5-m)*l/s}else{let g=Number.parseFloat(r.firstX),y=Number.parseFloat(r.lastX),d=(y+g)/2,p=(y-g)/(s+1),f=p<0?g:y+(m-1)*p;c=(d-f)/a+u}c!==void 0&&!Number.isNaN(c)&&(r.frequencyOffset=c*a)}}function ne(e){if((0,ie.isAnyArray)(e)){let r=[];for(let t of e)r.push(typeof t=="string"?Number.parseFloat(t):t);return r}return typeof e=="string"?Number.parseFloat(e):e}function Wr(e){switch(String((0,ie.isAnyArray)(e)?e[1]:e).toLowerCase().replaceAll(/\s/g,"")){case"1":case"notphasesensitive":return"notPhaseSensitive";case"2":return"QSEQ";case"3":case"tppi":return"TPPI";case"4":case"states":return"States";case"5":case"tppi-states":return"States-TPPI";case"6":case"echo-antiecho":return"Echo-antiecho";default:return"undefined"}}function Jr(e,r,t={}){let{prefix:i="",separator:n=`
|
|
4
|
+
`}=t;N(e,"spectralWidth",r[`${i}SweepWidth`]/e.originFrequency[0]);let o=r[`${i}.PULSESEQUENCE`].split(n),s=[];r[".OBSERVENUCLEUS"]&&s.push(r[".OBSERVENUCLEUS"]),r.INDIRECTNUCLEUS&&s.push(r.INDIRECTNUCLEUS),e.nucleus=O(s),e.pulseSequence=o[0];let l=o.slice(2,-1);if(s.length>1)if(s[0]===s[1])e.spectralWidth.push(e.spectralWidth[0]);else{let a=JSON.stringify(l).match(/\$\$SW1=\s*(?<sw>[+-]?(?:[0-9]*[.])?[0-9]+)/);if(a?.groups){let{originFrequency:m}=e,u=Number.parseFloat(a.groups.sw);e.spectralWidth.push(u/m[1])}}return e}function Vr(e,r){let{T1NUCLEUS:t,T2NUCLEUS:i,PAGE:n}=r;e.pulseSequence=r.EXPERIMENT||r[".PULSESEQUENCE"];let o=[],{dimension:s,isComplex:l}=e;if(s===2&&e.pulseSequence==="T1"){let u=l?2:1;for(let c=0;c<n.length;c+=u){let g=n[c].replace(/T1=/,"");o.push(Number(g))}r.vdlistValues=o}e.nucleus=s>1?[i,t]:i;let{phc0:a,phc1:m}=e;if(a&&m){let u=ee({phc0:a,phc1:m});e={...e,...u}}}var _r={keepRecordsRegExp:/.*/,keepFiles:!0};async function ae(e,r={}){let t={spectra:[],molecules:[]},{converter:i={},selector:n={},logger:o}=r,s=(0,se.groupByExperiments)(e,{logger:o,...Xr(n)}),l=[];for(let m of s)l.push((0,se.convertOneExperiment)(m,{..._r,...i}).then(u=>Hr(u,r)));let a=await Promise.allSettled(l);for(let m=0;m<a.length;m++){let u=a[m];if(u.status==="fulfilled"){let c=ee(u.value.info);t.spectra.push({...u.value,info:{...u.value.info,...c}})}else if(u.reason){let c=s[m].name;o?.warn(`Bruker data: ${c}, fails with: ${u.reason}`);continue}}return o&&o[t.spectra.length>0?"info":"debug"](`Loaded ${t.spectra.length} spectra from Bruker files`),(0,nt.formatSpectra)(t)}function Hr(e,r={}){let{keepSource:t=!1,logger:i}=r,n={...e.info,...e.meta},o=oe(n,{logger:i}),s={},{isFid:l}=o;if(Yr(e)){let y=e.minMax;for(let d in y){let p=y[d];p&&(p.z=I(p.z))}s.components=e.minMax}else o.dimension===1&&(s.components=e.spectra);let{source:a}=e,{expno:m,name:u,files:c}=a;n.vdlist&&(n.vdlistValues=Z(n.vdlist));let g={dependentVariables:[s],meta:n,info:{...o,experimentNumber:m,name:u}};return c&&t&&(g.sourceSelector={files:c.map(y=>y.relativePath)}),Gr(g,e),g}function Xr(e){let{general:r={},bruker:t={}}=e,{processingNumbers:i,experimentNumbers:n,...o}=t;return{...r,...o,processingNumbers:rt(i),experimentNumbers:rt(n)}}function rt(e){if(e)return e.split(/[^\d]+/).filter(Boolean).map(r=>Number.parseInt(r,10))}function Yr(e){let{info:r}=e;return r.twoD}function Gr(e,r){if(!("integrals"in r))return;let{integrals:t=[]}=r;e.integrals={values:t.map(i=>{let{from:n,to:o,integration:s}=i;return{from:n,to:o,integral:s,kind:"signal"}})}}var B=class{id="nmrium-core-plugins#BrukerLoaderPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={onFiles:this.onReadProcessFiles}}onReadProcessFiles=(r,t)=>{let{sourceSelector:i,converter:n,keepSource:o,logger:s}=t??{};return ae(r,{converter:n?.bruker,selector:i,keepSource:o,logger:s})}};function ce(){return new B}var vt=require("@zakodium/nmrium-core"),qt=require("jcampconverter");function it(e,r,t={}){let{selector:i={},keepSource:n=!1}=t;if(!n)return e;for(let o=0;o<e.spectra.length;o++){let s=e.spectra[o];s.sourceSelector={files:[r.relativePath],jcamp:{index:o,...i}}}return e}var ot=require("jcampconverter");function Me(e,r,t){let{dataType:i,children:n}=e,o=i==="LINK"&&n?n:[e];for(let s of o){if(s.dataType==="LINK"){Me(s,r,t);continue}let l=(0,ot.convert)(s.jcamp,t);r.push(...l.flatten)}}function ct(e,r={}){let t=[],i=mt(e,r);for(let s of i?e:[])s.dataType==="LINK"?s.children=xe(s.children,r):s=xe([s],r)[0],t.push(s);let{name:n,logger:o}=r;return e.length===0&&o?.warn(`There is no data ${n?`in ${n}`:"in the JCAMP-DX"}`),t}function xe(e=[],r={}){let{name:t,logger:i,tree:n=[],dataSelection:o="both"}=r,s=[];for(let u of e){let{dataType:c,dataClass:g}=u;if(c==="LINK")u.children=xe(u.children,r);else if(n.some(y=>{let{dataClass:d=g,dataType:p=c}=y;return g===d&&c===p})){i?.warn(`Skipping ${g} and ${c} ${t?`in ${t}`:"in the JCAMP-DX"},
|
|
5
|
+
because it didn't match the import filters`);continue}s.push(u)}let l=[],a=s.some(at),m=s.some(st);for(let u of s){if(o!=="both"&&u.dataType!=="LINK"){if(at(u)&&(o==="ft"||o==="preferFT"&&m)){i?.warn(`Skipping raw data ${t?`in ${t}`:"in the JCAMP-DX"} because it didn't match the import filters`);continue}if(st(u)&&(o==="fid"||o==="preferFID"&&a)){i?.warn(`Skipping FFT data ${t?`in ${t}`:"in the JCAMP-DX"} because it didn't match the import filters`);continue}}l.push(u)}return l}function st(e){return e.dataType?.toUpperCase().includes("SPECTRUM")&&e.dataClass&&!e.dataClass.toUpperCase().includes("PEAK")}function at(e){return e.dataType?.toUpperCase().includes("FID")}function mt(e,r={}){let{logger:t,name:i=""}=r;for(let n of e){if(n.dataType==="LINK"&&mt(n.children,r))return!0;let{dataType:o=""}=n,s=o.toLowerCase();if(s.length>0){if(s.includes("spectrum")&&!s.includes("nmr"))return t?.warn(`File ${i} was ignored because it is a ${o}`),!1;if(s.includes("nmr"))return!0}}return!1}var Ae=require("@zakodium/nmrium-core"),yt=require("jcampconverter"),Qr=Se(require("openchemlib/full"),1);var lt=require("nmr-processing"),ut=require("openchemlib/full");async function pt(e,r={}){let t=await e.text(),i=w(t),n={molecules:i,spectra:[]};return i.length===0&&r.logger?.debug(`${e.name} is an empty molfile`),n}function w(e){let r=[];if(!(0,lt.isMolfileNotEmpty)(e))return[];let i=ut.Molecule.fromMolfile(e).toMolfile();return r.push({molfile:i}),r}var ft=require("nmr-processing"),Zr=Se(require("openchemlib/full"),1),dt=require("openchemlib-utils");var Kr=new Set(["ndnmrspectrum","ndnmrfid","nmrspectrum","nmrfid"]);function me(e){let{dataType:r="",dataClass:t=""}=e,i=r.replaceAll(/\s/g,"").toLowerCase(),n=t.replaceAll(/\s/g,"").toLowerCase();return Kr.has(i)&&n!=="peaktable"}function gt(e,r,t={}){let{spectra:i,info:n,meta:o}=e,s=i[0].data,l=[],a={x:"delta",y:"intensity",w:"width",m:"multiplicity",a:"atom"},{logger:m,name:u,spectraData:c}=t,{CROSSREFERENCE:g}=n,y=typeof g!="string"?g:g.split(/\r?\n/).map(S=>S.trim()).filter(Boolean),d=y.find(S=>S?.toLowerCase().includes("structure"));if(d===void 0)return m&&m.warn(`There is not a structure reference for ${u} file, assignment object could not be completed`),null;let p=Number.parseInt(d?.toLowerCase().replace(/_/,"").replace(/structure:\s*blockid\s*=\s*(?<blockId>.*)/,"$<blockId>"),10);if(Number.isNaN(p)||p<1)return m&&m.warn(`Structure block_id not found for ${u} file, assignment object could not be completed`),null;let F=c?.molecules?.find(S=>S.blockId===p)?.molfile??"";if(F===""){let S=r.find(x=>x.info.BLOCKID===p),{MOLFILE:D=""}=S?.meta||{};F=D}if(!(0,ft.isMolfileNotEmpty)(F))return m&&m.warn(`Empty molfile for ${u} file with structure block_id = ${p}, assignment object could not be completed`),null;let h=(0,dt.getDiastereotopicAtomIDsFromMolfile)(Zr,F),b=te({...n,...o},{},"");for(let S=0;S<s.x.length;S++){let D={};for(let x in s){let A=s[x][S];typeof A=="string"&&A.startsWith("<")&&A.endsWith(">")&&(A=A.slice(1,-1)),D[a[x]]=A}if("atom"in D){let x=h.map[D.atom-1];b.includes("1H")?x.nbHydrogens>0?(D.diaIDs=x.hydrogenOCLIDs,D.nbHydrogens=x.nbHydrogens):(D.diaIDs=[x.oclID],D.nbHydrogens=x.nbHydrogens):(D.diaIDs=[x.oclID],D.nbHydrogens=1)}l.push(D)}let P={};for(let S of l){let{delta:D,diaIDs:x}=S,A=`${D}_${x.join("_")}`;if(P[A])P[A].atoms.push(S.atom);else{let{atom:_n,...Ir}=S;P[A]={...Ir,atoms:[S.atom]}}}let R=[];for(let S of y)S.toLowerCase().includes("spectrum")&&R.push(Number(S.toLowerCase().replace(/_/,"").replace(/.*:\s*blockid=(?<blockId>.*)/,"$<blockId>")));if(R.length===0){for(let S of r)if(me(S)){let{BLOCKID:D}=S.info;R.push(Number(D))}R.length>1&&(R=[],m&&m.warn(`There is not a spectral cross-reference for the peak assignment in the ${u} file`))}return{moleculeBlockID:p,spectraBlockIDs:R,assignments:Object.values(P),molecule:h.molecule}}function ht(e,r,t,i){for(let n of e){let{meta:o,dataClass:s="",dataType:l="",info:a}=n,m=Number.parseInt(String(a.BLOCKID),10);o.MOLFILE?nn(String(o.MOLFILE),r,m):n.jcampCS&&rn(n,r,m),en(s,l)&&tn(r,n,e,i),me(n)&&t.push(n)}}function en(e,r){return e?.toLowerCase().includes("assignments")&&r?.toLowerCase().includes("assignments")}function tn(e,r,t,i){let n=gt(r,t,{spectraData:e,logger:i.logger,name:i.name});if(e.assignmentsByBlocks||(e.assignmentsByBlocks={}),n){let{spectraBlockIDs:o}=n;for(let s of o)e.assignmentsByBlocks[s]=n}}function rn(e,r,t){r.molecules||(r.molecules=[]);let i=(0,yt.parseJcampCS)(e,{OCL:Qr}),n=w(i?.molfile||"");n.length>0&&r.molecules.push({id:(0,Ae.generateID)(),blockId:t,...n[0]})}function nn(e,r,t){r.molecules||(r.molecules=[]);let i=w(String(e));r.molecules.push({id:(0,Ae.generateID)(),blockId:t,...i[0]})}var Ie=require("@zakodium/nmrium-core"),U=require("ml-spectra-processing"),Tt=require("nmr-processing");function v(e){return e.slice(0,Math.max(0,e.lastIndexOf(".")))}function q(e){e.sort((r,t)=>r.from-t.from);for(let r=0;r<e.length-1;r++)e[r].to>e[r+1].from&&(e[r].to=Math.max(e[r+1].to,e[r].to),e[r].signals=e[r].signals.concat(e[r+1].signals),e[r].integration+=e[r+1].integration,e.splice(r+1,1),r--);return e}var Pt=require("nmr-processing");var Ft=require("ml-spectra-processing");function z(e){return e.trim().slice(1,-1).split(/,\s*/).map(r=>r.trim())}var on={I:"id",X:"from",Y:"to",Hs:"delta",An:"integration",H:"nbAtoms",C:"multiplicity",N:"assignment","(J)":"js"},bt=["I","X","Y","Hs","An","H","C","N","(J)"];function Nt(e){let r={headersFromParenthesis:[],headersFromComments:[],comments:[],data:[],multiplets:[]},t=e.split(/\r?\n/).filter(i=>i.trim()!=="");if(t.length===0)return r;if(t[0].startsWith("(")&&!t[0].match(/\d/)){let i=t.shift();r.headersFromParenthesis=z(i)}return r.comments=t.filter(i=>i.startsWith("$$")).map(i=>i.replace(/^\$\$\s*/,"")),r.headersFromComments=an(r.comments),r.data=t.filter(i=>!i.startsWith("$$")).map(z),r.multiplets=sn(r),r}function sn(e,r={}){let{logger:t}=r,i=e.data[0].map((a,m)=>m).filter(a=>e.data.every(m=>Number.isNaN(m[a])||Number.isNaN(Number(m[a]))));if(t?.trace(`Parsing JCAMP-DX assignment: stringColumnIndexes: ${i.join(",")}`),i.length===0)return t?.warn("Parsing JCAMP-DX assignment: No string columns found. Skipping parsing of assignment."),[];let n=i[0],o;if(e.headersFromParenthesis.length>0&&e.headersFromParenthesis[n]==="C")o=e.headersFromParenthesis;else if(e.headersFromComments.length>0&&e.headersFromComments[n]==="C")o=e.headersFromComments;else if(bt[n]==="C")o=bt;else return t?.warn("No header found for multiplicity. Skipping parsing of assignment."),[];return(0,Ft.xMaxValue)(e.data.map(a=>a.length))>o.length&&t?.warn("Some assignments are containing more values than headers"),e.data.map(a=>{let m={};for(let u=0;u<o.length;u++){let c=o[u];m[on[c]||c]=a[u]}return m})}function an(e){return e.map(r=>r.split(":")[0].trim()).filter(r=>r.length>0)}function St(e,r={}){let{logger:t}=r,i=Nt(e),n={multiplets:[],comments:i.comments};for(let o of i.multiplets){let{id:s,from:l,to:a,delta:m,integration:u,nbAtoms:c,multiplicity:g}=o,y={id:s,js:[],multiplicity:"",...cn({from:l,to:a,delta:m,integration:u,nbAtoms:c})};if(typeof o.js=="string"){let d=o.js.split(/\s+/).map(Number.parseFloat),p=0,f=(0,Pt.splitPatterns)(g).map(b=>{let P=(b?.multiplicity||1)-1;return p+=P,{value:b.value,multiplicity:b?.multiplicity,js:d.slice(p-P,p)}}),F=f.reduce((b,P)=>b+(P.multiplicity?P.multiplicity-1:0),0);d.length!==F&&t?.warn(`The number of j values (${d.length}) is not equal to the sum of the multiplicities - 1 (${F})`);let h=[];for(let b of f){if(b.js.every(P=>P===b.js[0])){h.push(b);continue}if(b.multiplicity!==b.js.length+1){h.push(b);continue}for(let P=0;P<b.multiplicity-1;P++)h.push({value:"d",multiplicity:2,js:[b.js[P]]})}h.sort((b,P)=>P.js[0]-b.js[0]),y.js=h.map(b=>({coupling:b.js[0],multiplicity:b.value}))}typeof o.assignment=="string"&&(y.assignment=ln(o.assignment)),typeof o.multiplicity=="string"&&(y.multiplicity=o.multiplicity),n.multiplets.push(y)}return n}function cn(e){let r={};for(let t in e){let i=e[t],n=typeof i=="number"?i:Number.parseFloat(i);Number.isNaN(n)||(r[t]=n)}return r}var mn={quot:'"',apos:"'",comma:",",amp:"&",lpar:"(",rpar:")",lt:"<",gt:">",colon:":",semi:";"};function ln(e){return e.replaceAll(/&(\w+);/gi,(r,t)=>mn[t.toLowerCase()]||r)}function Rt(e){let r=e.split(/\r?\n/).filter(i=>i.trim()!==""),t=[];for(let i of r)if(i.startsWith("(")){let[n,o,s]=z(i).map(Number.parseFloat);t.push({id:n,x:o,y:s})}return t}function Dt(e,r={}){let t={};if(!e["OBSERVED MULTIPLETS"])return[];let i=St(e["OBSERVED MULTIPLETS"],r);if(!i)return[];let{multiplets:n}=i;for(let o of n){let{id:s,from:l,to:a,integration:m=0,...u}=o;t[s]={from:l,to:a,integration:m,signals:[{id:s,...u}]}}if(e["OBSERVED MULTIPLETS PEAKS"]){let o=Rt(e["OBSERVED MULTIPLETS PEAKS"]),s={};for(let l of o){let{id:a,x:m,y:u}=l;s[a]||(s[a]=[]),s[a].push({x:m,y:u,width:.05})}for(let l in t)s[l]&&(t[l].signals[0].peaks=s[l])}return q(Object.values(t))}function Mt(e,r){let i=[...e.getMolecularFormula().formula.matchAll(/(?<element>[A-Z][a-z]?)(?<count>\d*)/g)].map(o=>({element:o?.groups?.element,count:o?.groups?.count?Number(o.groups.count):1})),n=[...r.nucleus[0].matchAll(/[0-9]*(?<element>[A-Z][a-z]?)/g,"$element")][0].groups.element;return i.find(o=>o.element===n)?.count||100}function xt(e){let r={};return".PHASE0"in e&&(r.ph0=Number.parseFloat(e[".PHASE0"]),r.ph1=Number.parseFloat(e[".PHASE1"])),r}function Oe(e){let{ph0:r,ph1:t}=e;return Number.isFinite(r)&&Number.isFinite(t)}var Ce=require("@zakodium/nmrium-core");function At(e,r,t){for(let i=0;i<e.length;i++){if(r.includes(i))continue;let{delta:n,multiplicity:o="",diaIDs:s}=e[i],l=Number(n)-.01,a=Number(n)+.01;t.push({from:l,to:a,integration:1,id:(0,Ce.generateID)(),signals:[{id:(0,Ce.generateID)(),delta:n,multiplicity:o,diaIDs:s}]})}}var Ot=require("linear-sum-assignment"),Ct=require("ml-spectra-processing");function It(e,r){let t=e.map(s=>s.delta),i=r.map(s=>s.delta),n=(0,Ct.xCostMatrix)(i,t,{fct:(s,l)=>Math.abs(s-l)}),{rowAssignments:o}=(0,Ot.linearSumAssignment)(n,{maximaze:!1});return Array.from(o)}function Et(e,r){let{assignments:t,ranges:i}=r;t?.sort((s,l)=>l.delta-s.delta);let n=[],o=[];for(let s of i){let l=0,{from:a,to:m}=s,u=[];for(let c=l;c<t.length;c++){let{delta:g}=t[c];g<=m&&g>=a?(u.push(t[c]),o.push(c)):g>m&&(l=c)}if(u.length>0){let c=s.signals,g=[],y=u.length>1&&c.length>1?It(c,u):[0];for(let d=0;d<u.length;d++){let p=y[d],{delta:f,multiplicity:F,diaIDs:h}=u[d];p>-1?g.push({...c[p],diaIDs:h}):g.push({delta:f,multiplicity:F,diaIDs:h})}s.signals=g,n.push(s)}}At(t,o,n),n.sort((s,l)=>s.from-l.from),e.ranges={values:q(n).map(s=>{let{integration:l,...a}=s;return a}),options:{sum:r.integrationSum,isSumConstant:!0,sumAuto:!0}},e.ranges.options.moleculeId=String(r.moleculeId)}function Lt(e,r,t,i,n){let{logger:o}=n,s={components:kt(e)?fn(e,t.isFid):pn(e)},{name:l=t.title||`jcamp_${(0,Ie.generateID)()}`}=n,a={dependentVariables:[s],meta:r,info:{...t,name:v(l)}};return un(e)&&dn(a,i,r,e,t,{logger:o}),a}function kt(e){return"minMax"in e}function un(e){return!kt(e)}function pn(e){return e.spectra.map(r=>{let t=I(r.data);return{...r,data:t}})}function fn(e,r){let t={...e.minMax,z:I(e.minMax?.z)};return r?gn(t):{rr:t}}function dn(e,r,t,i,n,o){let{assignmentsByBlocks:s}=r,l=xt(t);Oe(l)&&yn(e,l);let a=String(i.info.BLOCKID);if(s?.[a]){let{molecule:m,assignments:u,moleculeBlockID:c}=s[a],g=Mt(m,n),y=I(i.spectra[0].data);if(y.x[0]>y.x[1])for(let F of i.spectra)F.data.x.reverse(),F.data.y.reverse();if(Oe(l)&&i.spectra.length>1){let{re:F}=hn(i,l);y.y=F}let{x:d,y:p}=y,f=Dt(t,o)??(0,Tt.xyAutoRangesPicking)({x:d,y:p},{peakPicking:{frequency:n.originFrequency},ranges:{frequency:n.originFrequency,integrationSum:g}});Et(e,{moleculeId:c,ranges:f,assignments:u,integrationSum:g})}}function gn(e){let{z:r,...t}=e,i=[],n=[];for(let l=0;l<r.length;l+=2)i.push(r[l].slice()),n.push(r[l+1].slice());let o=(0,U.matrixMinMaxZ)(i),s=(0,U.matrixMinMaxZ)(n);return{re:{...t,z:i,minZ:o.min,maxZ:o.max},im:{...t,z:n,minZ:s.min,maxZ:s.max}}}function yn(e,r){let{ph0:t,ph1:i}=r;e.filters||(e.filters=[]),e.filters.push({id:(0,Ie.generateID)(),name:"phaseCorrection",value:{ph0:t,ph1:i,absolute:!1},enabled:!0})}function hn(e,r){let{ph0:t,ph1:i}=r,{re:n,im:o}=(0,U.reimPhaseCorrection)({re:e.spectra[0].data.y,im:e.spectra[1].data.y},t*Math.PI/180,i*Math.PI/180);return{re:n,im:o}}function wt(e,r,t){let{logger:i}=t,n=[];for(let o of e)if(o.spectra&&o.spectra.length>0||o.minMax){bn(o);let s={...o.info,...o.meta},l=oe(s,{logger:i});if(l.experiment==="wobble_curve")continue;n.push(Lt(o,s,l,r,t))}return n}function bn(e){let r=e.meta["BRUKER FILE EXP"];if(!r)return;let i=(Array.isArray(r)?r:[r]).find(o=>o.slice(0,10).includes("vdlist"));if(!i)return;let n=i.split(`
|
|
6
|
+
`).slice(1);e.info.vdlistValues=Z(n)}async function le(e,r={}){let t=await e.text(),i=Ee(t,{name:e.name,...r});return it(i,e,r)}function Ee(e,r={}){let t={spectra:[],molecules:[]},{name:i,converter:n={},selector:o={},logger:s}=r,{keepRecordsRegExp:l=/.*/}=n,a={keepSpectra:!0,noContour:!0,noTrimRegExp:/\$MOLFILE/,keepRecordsRegExp:l,logger:s},m=ct((0,qt.createTree)(e),{name:i,...o,logger:s});for(let u of m)Fn(u,t,a,i);if(Nn(t,o),t.spectra.length===0&&m.length>0){let u=t.molecules.length===0?" nor molecule":"";s?.warn(`No spectra${u} data was loaded from file ${i}`)}return(0,vt.formatSpectra)(t)}function Fn(e,r,t,i){let n=[],o=[],s={molecules:[]},{logger:l}=t,a={name:i,logger:l};Me(e,o,t),ht(o,s,n,a),r.spectra.push(...wt(n,s,a)),r.molecules.push(...s.molecules)}function Nn(e,r){r.index!==void 0&&(e.spectra=e.spectra.slice(r.index,r.index+1))}var W=class{id="nmrium-core-plugins#JcampLoaderPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={supportedExtensions:["jcamp","jdx","dx"],onFile:this.onReadProcessFile.bind(this)}}onReadProcessFile(r,t={}){let{sourceSelector:i={},converter:n,keepSource:o,logger:s}=t;return s?.debug(`Reading JCAMP-DX file: ${r.name}`),le(r,{selector:this.getJcampSelector(i),converter:n?.jcamp,keepSource:o,logger:s})}getJcampSelector(r={}){let{jcamp:t={},general:i={}}=r,{dataSelection:n="both"}=i;return{...t,dataSelection:n}}};function ue(){return new W}var pe=require("@zakodium/nmrium-core"),Ut=require("gyromagnetic-ratio"),Wt=require("is-any-array"),Jt=require("jeolconverter"),Vt=Se(require("lodash.merge"),1),_t=require("nmr-processing");var L=require("is-any-array");var $t={0:"uint8",1:"uint16",2:"uint32",3:"uint64",4:"int8",5:"int16",6:"int32",7:"int64",8:"float32",9:"float64",10:"complex64",11:"complex128"},jt={0:"scalar",1:"vector",2:"matrix",3:"symetricMatrix",4:"pixel"};function Bt(e,r,t={}){let{quantityType:i=0,encoding:n="none",name:o="",unit:s="",quantityName:l="",sparseSampling:a={},from:m=[0],to:u=[-1]}=t;if((0,L.isAnyArray)(e))throw new Error("jeol with an array of data is not yet supported");if(!("re"in e&&"im"in e))throw new Error("Only re/im data is supported");let c=Le(e,m,u),{componentLabels:g=c.componentLabels}=t;return{type:"internal",quantityType:jt[i],numericType:$t[r],encoding:n,name:o,unit:s,quantityName:l,componentLabels:g,sparseSampling:a,description:t.description||"",application:t.application||"",components:c.components,dataLength:c.dataLength}}function Pn(e){return(0,L.isAnyArray)(e.re)&&(0,L.isAnyArray)(e.im)}function Sn(e){return!(0,L.isAnyArray)(e.re[0])}function Le(e,r,t){let i=[],n=[],o=[];if(Pn(e))if(Sn(e)){i[0]=Te(r[0],t[0],e.re.length);let s=new Float64Array(i[0]);for(let l=0;l<i[0];l+=2){let a=l+r[0]*2;s[l]=e.re[a/2],s[l+1]=e.im[a/2]}o.push(s),n.push("complex")}else if((0,L.isAnyArray)(e.re[0])){i[0]=Rn(r[1],t[1],e.re.length),i[1]=Te(r[0],t[0],e.re[0].length);for(let s=0;s<i[0];s++){let l=new Float64Array(i[1]);for(let a=0;a<i[1];a+=2){let m=a+r[0]*2;l[a]=e.re[s][m/2],l[a+1]=e.im[s][m/2]}o.push(l)}}else throw new Error("check your object");else if((0,L.isAnyArray)(e.re.re)){i[0]=Te(r[1],t[1],e.re.re.length);let s=Le(e.re,r,t).components,l=Le(e.im,r,t).components;for(let a=0;a<i[0]/2;a++)o.push(s[a],l[a])}else throw new Error("check the dimension or the type of data in your array");return{dataLength:i,componentLabels:n,components:o}}function Rn(e,r,t){return r-e+1<t?r-e+1:t}function Te(e,r,t){return r-e+1<t?(r-e+1)*2:t*2}async function Ht(e,r={}){let t=await e.arrayBuffer(),{name:i=v(e.name),keepSource:n=!1}=r,o={spectra:[],molecules:[]},l=xn(t)[0],{metadata:a,...m}=l.description,u=0,c=m.dimension===1?"1d":"2d",g="NMR SPECTRUM",y=m.dimension===1?m.nucleus[0]:m.nucleus,d=m.spectralWidthClipped[0],p;l.dependentVariables&&(m.dimension===1?p=Dn(l):m.dimension===2&&(p=Mn(l)));for(let F in m)Array.isArray(m[F])&&m[F].length===1&&(m[F]=m[F][0]);let f={data:p,info:{...m,acquisitionMode:u,experiment:c,type:g,nucleus:y,spectralWidthClipped:d,name:i},meta:a};return n&&(f.sourceSelector={files:[e.relativePath]}),o.spectra=[f],(0,pe.formatSpectra)(o)}function Dn(e){let r=e.dimensions[0],t=e.dependentVariables,i=r.quantityName,n=r.count,o=r.increment.magnitude,s=r.originOffset.magnitude,l=r.coordinatesOffset.magnitude,a=t[0].components[0],m=new Float64Array(n),u=new Float64Array(n);for(let p=a.length-1,f=0;p>0;p-=2)m[f]=a[p-1],u[f++]=a[p];let c={},[g,y]=[0,0];switch(i){case"frequency":y=0+l/s*1e6,g=o/s*1e6,c.re=m,c.im=u;break;case"time":y=s,g=o,c.re=m.reverse(),c.im=u.reverse().map(p=>-p);break;default:break}let d=[];for(let p=0;p<n;p++)d.push(y+p*g);return c.x=d,c}function Mn(e){let r=e.dimensions,t=e.dependentVariables,i=r[0].quantityName,n=[],o=[],s=Number.MIN_SAFE_INTEGER,l=Number.MAX_SAFE_INTEGER,a=Number.MAX_SAFE_INTEGER,m=Number.MIN_SAFE_INTEGER;for(let g of t[0].components){let y=new Float64Array(g.length/2),d=new Float64Array(g.length/2);for(let p=g.length-1,f=0;p>0;p-=2){let F=g[p-1],h=g[p];F>s&&(s=F),F<l&&(l=F),h>m&&(m=h),h<a&&(a=h),y[f]=F,d[f++]=h}if(i==="frequency")n.push(y),o.push(d);else{let p=y.length,f=new Float64Array(d.length);for(let F=0,h=p-1;F<p;F++)f[F]=-d[h--];n.push(y.reverse()),o.push(f)}}let u={re:{z:n,minZ:l,maxZ:s},im:{z:o,minZ:a,maxZ:m}},c=["X","Y"];for(let g=0;g<c.length;g++){let y=r[g].count,d=r[g].increment.magnitude,p=r[g].originOffset.magnitude,f=r[g].coordinatesOffset.magnitude,F=c[g];for(let h of["re","im"])i==="frequency"?(u[h][`min${F}`]=0+f/p*1e6,u[h][`max${F}`]=y*(d/p)*1e6):(u[h][`min${F}`]=p,u[h][`max${F}`]=y*d)}return u}function xn(e){let r=(0,Jt.parseJEOL)(e),t=r.info,i=r.headers,n=r.parameters,{dimension:o}=t,s={};for(let f of n.paramArray){let{name:F,value:h}=f;s[F]=Xt(h,o)}delete n.paramArray;let l=r.data,a={};a.title=`title: ${i.title} / comment: ${i.comment} / author:${i.author} / site: ${i.site}`,a.nucleus=t.nucleus.map(_t.normalizeNucleus),a.sampleName=t.sampleName,a.date=t.date,a.epoch=t.epoch,a.localeDate=new Date((0,pe.getOneIfArray)(t.epoch)).toLocaleString(),a.author=t.author,a.solvent=t.solvent,a.temperature=t.temperature.magnitude,a.probeName=t.probeName||"",a.fieldStrength=t.fieldStrength.magnitude;let m=a.nucleus.map(Ut.getGyromagneticRatio);a.baseFrequency=m.map(f=>t.fieldStrength.magnitude*f/(2*Math.PI*1e6)),a.pulseSequence=t.experiment,a.temperature=t.temperature?.unit?.toLowerCase()==="celsius"?273.15+t.temperature.magnitude:t.temperature.magnitude,a.digitalFilter=t.digitalFilter,a.pulseStrength90=1/(4*t.pulseStrength90.magnitude),a.numberOfScans=t.numberOfScans,a.relaxationTime=t.relaxationTime.magnitude,a.isComplex=t.dataSections.includes("im"),a.isFid=t.dataUnits[0]==="Second",a.isFt=t.dataUnits[0]==="Ppm",a.dimension=t.dimension,a.originFrequency=t.originFrequency.map(f=>f.magnitude/1e6).slice(0,o),a.numberOfPoints=t.dataPoints.slice(0,1),a.frequencyOffset=t.frequencyOffset.map((f,F)=>f.magnitude*a.baseFrequency[F]).slice(0,o),a.acquisitionTime=t.acquisitionTime.map(f=>f.magnitude).slice(0,o),a.spectralWidth=t.spectralWidth.map((f,F)=>f.magnitude/t.originFrequency[F].magnitude*1e6).slice(0,o),a.spectralWidthClipped=t.spectralWidthClipped.map((f,F)=>f.magnitude/a.baseFrequency[F]*1e6).slice(0,o);let u=[],c={},g;for(let f=0;f<t.dimension;f++){if(g={magnitude:t.acquisitionTime[f].magnitude/(t.dataPoints[f]-1),unit:"s"},t.dataUnits[f]==="Second")c.quantityName="time",c.originOffset={magnitude:0,unit:"s"},f===0?c.coordinatesOffset={magnitude:t.digitalFilter*g.magnitude,unit:"s"}:c.coordinatesOffset={magnitude:0,unit:"s"},c.reciprocal={originOffset:{magnitude:t.originFrequency[f].magnitude,unit:"Hz"},quantityName:"frequency",coordinatesOffset:{magnitude:t.frequencyOffset[f].magnitude*t.originFrequency[f].magnitude/1e6,unit:"Hz"}};else if(t.dataUnits[f]==="Ppm"){c.quantityName="frequency";let F=t.originFrequency[f].magnitude;c.originOffset={magnitude:F,unit:"Hz"};let h=t.dataOffsetStart[f],P=t.dataOffsetStop[f]-h+1;g={magnitude:An(t,f)/(P-1),unit:"Hz"};let D=t.dataAxisStop[f]*F/1e6;c.coordinatesOffset={magnitude:D,unit:"Hz"},P!==t.dataPoints[f]&&(t.dataPoints[f]=P)}f===0?c.description="direct dimension":c.description="indirect dimension",u.push({label:String(i.dataAxisTitles[f]),count:Number(t.dataPoints[f]),increment:g,type:"linear",description:String(c.description)||"",application:c.application||{},coordinatesOffset:c.coordinatesOffset||0,originOffset:c.originOffset||0,quantityName:String(c.quantityName)||"",reciprocal:c.reciprocal||{},period:c.period||0,complexFFT:c.complexFFT||!1})}let y=[];y.push(Bt(l,11,{unit:"none",quantityName:"relative intensity",from:t.dataOffsetStart,to:t.dataOffsetStop}));let d={...a};return delete d.paramList,d.metadata={...zt(i,o),...zt(n,o),...(0,Vt.default)({},s)},[{timeStamp:Date.now(),description:d,dimensions:u,dependentVariables:y}]}function An(e,r){let{spectralWidth:t,spectralWidthClipped:i}=e;return i[r].magnitude!=="NA"?i[r].magnitude:t[r].magnitude}function zt(e,r){let t={};for(let i in e)t[i]=Xt(e[i],r);return t}function Xt(e,r){return(0,Wt.isAnyArray)(e)?r>1?e.slice(0,r):e[0]:e}var J=class{id="nmrium-core-plugins#JDFLoaderPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={supportedExtensions:["jdf"],onFile:this.onReadProcessFile.bind(this)}}onReadProcessFile(r,t={}){let{logger:i,keepSource:n}=t;return i?.debug(`Reading JDF file: ${r.name}`),Ht(r,{name:r.name,keepSource:n,logger:i})}};function fe(){return new J}var V=class{id="nmrium-core-plugins#MolfileLoaderPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={supportedExtensions:["mol"],onFile:this.onReadProcessFile.bind(this)}}onReadProcessFile(r,t={}){let{logger:i}=t;return i?.debug(`Reading molfile file: ${r.name}`),pt(r,{logger:i})}};function de(){return new V}var ge=require("nmredata");var we=require("@zakodium/nmrium-core");var ke=require("@zakodium/nmrium-core"),Yt=require("ml-spectra-processing");function Gt(e,r){let{x:t,re:i}=r.data;return e.map(n=>{let o=(0,Yt.xyIntegration)({x:t,y:i},{from:n.from,to:n.to}),s=[];for(let l of n.signals||[]){let{kind:a=null,id:m,js:u=[],diaIDs:c=[],...g}=l;s.push({...g,kind:a||"signal",js:u,id:m||(0,ke.generateID)(),diaIDs:c})}return{...n,id:n.id||(0,ke.generateID)(),kind:s?.[0].kind||"signal",absolute:o,signals:s}})}function Kt(e,r){let t=[],{baseFrequency:i=500}=r.info;for(let n of e){let{delta:o,diaIDs:s=[],multiplicity:l="",integration:a=0}=n,m=n.jCoupling||[],u=On({delta:o,js:m,frequency:i});if(m&&l&&m.length===l.length){m.sort((c,g)=>g.coupling-c.coupling);for(let c=0;c<m.length;c++)m[c].multiplicity=l[c]}t.push({id:(0,we.generateID)(),...u,integration:a,signals:[{id:(0,we.generateID)(),js:m,delta:o,diaIDs:s,multiplicity:l}]})}r.ranges.values=Gt(q(t),r)}function On(e){let{delta:r,js:t=[],frequency:i}=e,n=.5;for(let o of t)n+=o.coupling;return n/=i,{from:r-n,to:r+n}}var ve=require("@zakodium/nmrium-core"),Cn=["x","y"],In={x:0,y:0};function Zt(e,r,t={}){let i=[],{shift:n=In}=t,{originFrequency:o=[400,400]}=r.info,s={x:o[0],y:o[1]};for(let l of e){let a={x:{},y:{},id:(0,ve.generateID)(),kind:"signal"},m={id:(0,ve.generateID)(),kind:"signal",peaks:[]},u={x:10,y:10};for(let c of Cn){let{coupling:g=[],delta:y,diaIDs:d=[]}=l[c];for(let p of g)u[c]+=p.coupling;if(l.activeCoupling){let{activeCoupling:p=[]}=l;for(let f of p)u[c]+=f.coupling}u[c]/=s[c],a[c]={from:y-u[c],to:y+u[c]},m[c]={delta:y,diaIDs:d,originalDelta:y-n[c]}}i.push({...a,signals:[m]})}r.zones.values=i}function Qt(e){return En(e.data)}function En(e){return"rr"in e||!("x"in e)&&"re"in e}async function er(e,r,t={}){let i={spectra:[],molecules:[]},n=await Tn(e,r,t);if(n.spectra.length>0){let{spectra:o,molecules:s,usedFiles:l}=n;i.spectra.push(...o),i.molecules.push(...s);let a=e.files.length;for(let m=a-1;m>=0;m--){let u=e.files[m].relativePath;!u.match(/acqu.*/s)&&l.includes(u)&&e.files.splice(m,1)}}return i}async function Tn(e,r,t){let i=[],n=await(0,ge.getSDF)(e),o={spectra:[],molecules:[]};if(n.length===0)return{...o,usedFiles:i};let s=[];for(let a of n){let m=(0,ge.nmrRecordToJSON)({sdf:a,fileCollection:e}).then(u=>{let{spectra:c,molecules:g=[]}=u;return i.push(a.root+a.filename),o.molecules.push(...g),Ln(c,r,t)});s.push(m)}let l=await Promise.allSettled(s);for(let a of l)a.status==="fulfilled"?(o.spectra.push(...a.value.spectra),i.push(...a.value.usedFiles)):a.reason&&t?.logger?.error(a.reason);return{...o,usedFiles:i}}async function Ln(e,r,t){let i=[],n=[],o={spectra:[],molecules:[]};for(let s of e){let l=kn(s.source,r,t).then(a=>{let{spectra:m,files:u}=a;i.push(...u);for(let c of m)Qt(c)?Zt(s.signals,c):Kt(s.signals,c);o.spectra.push(...m)});n.push(l)}return await Promise.allSettled(n),{...o,usedFiles:i}}async function kn(e,r,t={}){let{file:i,jcampURL:n}=e,{converter:o}=t;if(n){let a=await wn(n,r,o?.jcamp);if(a)return{...a,files:[]}}let s=[];for(let a of i||[])s.push(vn(a,t).then(m=>({...m,files:a.fileCollection.files.map(u=>u.relativePath)})));let l=await Promise.allSettled(s);for(let a of l){if(a.status==="fulfilled")return a.value;a.reason&&t?.logger?.error(a.reason)}return{spectra:[],molecules:[],files:[]}}async function wn(e,r,t={}){let i={entries:[{relativePath:e}]},n={name:v(e||""),xy:!0,noContours:!0,...t},{data:o}=await r.readFromWebSource(i,n);return o}async function vn(e,r={}){let{converter:t,sourceSelector:i}=r;switch(e.type){case"jcamp":return le(e.fileCollection.files[0],{name:e?.fileCollection.files[0].name||"",converter:t?.jcamp,selector:i?.jcamp,logger:r.logger,keepSource:r.keepSource});case"brukerFiles":return ae(e.fileCollection,{converter:t?.bruker,selector:i});default:throw new Error("There is not a supported source")}}var _=class{constructor(r){this.core=r;this.onReadProcess={onFiles:this.onReadProcessFiles}}id="nmrium-core-plugins#NMReLoaderPlugin";version=1;migrations=[];onReadProcess;onReadProcessFiles=(r,t)=>er(r,this.core,t)};function ye(e){return new _(e)}var he=require("nmr-processing");var qe=require("@zakodium/nmrium-core"),qn=["no","exponential","modifiedGaussian","sine","qsine","trap","user","sinc","qsinc","traf","trafs"];function $n(e){return e in tr}function $e(e,r){let{prefix:t="",index:i=0}=r,n=(0,qe.getOneIfArray)(e[`${t}WDW`],i),o=qn[n?Number(n):0],s={};if(!$n(o))return s;let l=tr[o];if(l){let{kind:a,parameters:m}=l,u={};for(let c in m){let g=m[c],{source:y,processor:d}=g;if(y){let p=(0,qe.getOneIfArray)(e[`${t}${y}`],i);if(!p)continue;let f=Number(p);u[c]=d?d(f):f}else g.value!==void 0&&(u[c]=g.value)}s[a]={apply:!0,options:u}}return s}var tr={exponential:{kind:"exponential",parameters:{lineBroadening:{source:"LB"}}},modifiedGaussian:{kind:"gaussian",parameters:{lineBroadening:{source:"LB"},lineBroadeningCenter:{source:"GB"}}},sine:{kind:"sineBell",parameters:{offset:{source:"SSB",processor:e=>1/e},exponent:{value:1}}},qsine:{kind:"sineSquare",parameters:{offset:{source:"SSB",processor:e=>1/e}}},traf:{kind:"traf",parameters:{lineBroadening:{source:"LB"}}}};var rr={sineBell:ir({offset:0})},nr={cosy:{...rr},hmbc:{...rr},hsqc:{sineBell:ir({offset:.5})}},jn={...nr};function je(e="",r=1){let t=Bn(e),i={},n=r===1?nr[t||""]:jn[t||""];return n&&(i=structuredClone(n)),i}function ir(e){return{apply:!0,options:e}}function Bn(e){let t=e.toLowerCase().match(/cosy|hsqc|hmbc/);return t?t[0]:null}function or(e,r={}){let{prefix:t="",experiment:i=re(e)}=r;return e[`${t}WDW`]?{f2:$e(e,{...r,index:0}),f1:$e(e,{...r,index:1})}:{f2:je(i,1),f1:je(i,2)}}var sr=require("nmr-processing"),Be=["digitalFilter","backwardLinearPrediction","forwardLinearPrediction","apodization","zeroFilling","fft",["shiftX","phaseCorrection","baselineCorrection"]],$={};for(let e=0;e<Be.length;e++){let r=Be[e];for(let t of Array.isArray(r)?r:[r])$[t]=e}for(let e of Object.values(sr.Filters1D))e.name in $||($[e.name]=Be.length);var ar=require("nmr-processing"),ze=["digitalFilter2D","blpDimension1","flpDimension1","apodizationDimension1","zeroFillingDimension1","fftDimension1","blpDimension2","flpDimension2","nusDimension2","apodizationDimension2","zeroFillingDimension2","fftDimension2","phaseCorrectionTwoDimensions",["shift2DX","shift2DY","symmetrizeCosyLike"]],j={};for(let e=0;e<ze.length;e++){let r=ze[e];for(let t of Array.isArray(r)?r:[r])j[t]=e}for(let e of Object.values(ar.Filters2D))e.name in j||(j[e.name]=ze.length);var zn=new Set(["backwardLinearPrediction","forwardLinearPrediction","digitalFilter2D","phaseCorrectionTwoDimensions","blpDimension1","flpDimension1","apodizationDimension1","apodizationDimension2","zeroFillingDimension1","fftDimension1","blpDimension2","flpDimension2","zeroFillingDimension2","fftDimension2","nusDimension2","symmetrizeCosyLike"]);function Un(e,r){let{filter:t,experimentalFeatures:i=!1}=r,{name:n}=t;({...he.Filters1D,...he.Filters2D})[n]&&(e.some(s=>s.name===n)||(i||!zn.has(n))&&e.push({...t,enabled:!0}))}function cr(e,r={}){let{data:t}=e;if(!t)return e;let{autoProcessing:i,experimentalFeatures:n}=r,o=(l,a)=>Un(l,{...a,experimentalFeatures:n}),{spectra:s}=t;for(let l of s){let{data:a,info:m,meta:u,filters:c}=l,{dimension:g,isFid:y}=m;if(y){if(g===1){let d=a.re.length,{tdOff:p,digitalFilter:f}=m;if(f&&f>0&&o(c,{filter:{name:"digitalFilter",value:{digitalFilterValue:f}}}),!i)continue;p&&Math.abs(p)>0&&o(c,{filter:{name:"backwardLinearPrediction",value:{nbInputs:d/2}}}),o(c,{filter:{name:"apodization",value:{exponential:{apply:!0,options:{lineBroadening:1}}}}}),o(c,{filter:{name:"zeroFilling",value:{nbPoints:2*d}}}),o(c,{filter:{name:"fft",value:{}}}),o(c,{filter:{name:"phaseCorrection",value:Wn(m)}}),c.sort((F,h)=>$[F.name]-$[h.name])}else if(g===2){if(!i||!n)continue;let d=a.re.z.length,p=a.re.z[0].length,{tdOff:f,experiment:F=""}=m,h=m.spectrumSize;Array.isArray(h)&&h.length>1?(h[0]<=p&&(h[0]=p*2),h[0]<=d&&(h[0]=d*2)):h=[p*2,2*d];let b=F.toLowerCase().includes("cosy");f&&Math.abs(f[0])>0&&o(c,{filter:{name:"blpDimension1",value:{nbInputs:p/2}}});let P=or(u,{experiment:F});o(c,{filter:{name:"apodizationDimension1",value:P.f2}}),o(c,{filter:{name:"zeroFillingDimension1",value:{nbPoints:h[0]}}}),o(c,{filter:{name:"fftDimension1",value:{}}}),u&&"nuslist"in u&&o(c,{filter:{name:"nusDimension2",value:{}}}),o(c,{filter:{name:"apodizationDimension2",value:P.f1}}),o(c,{filter:{name:"zeroFillingDimension2",value:{nbPoints:h[b?0:1]}}}),b?o(c,{filter:{name:"symmetrizeCosyLike",value:{}}}):o(c,{filter:{name:"phaseCorrectionTwoDimensions",value:{}}}),o(c,{filter:{name:"fftDimension2",value:{}}}),c.sort((R,S)=>j[R.name]-j[S.name])}}}}function Wn(e){let{phc0:r=0,phc1:t=0}=e;return mr([r,t])?{}:{ph0:r,ph1:t}}function mr(e){return Array.isArray(e)?e.every(r=>!r&&r===0):mr([e])}var be=class{id="nmrium-core-plugins#NmriumPostProcessingPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={onProcessing:this.onPostProcessing.bind(this)}}onPostProcessing(r,t){cr(r,t)}};function Ue(){return new be}var lr=require("sdf-parser");function We(e,r={}){let{mixedEOL:t}=r,{molecules:i}=(0,lr.parse)(e,{mixedEOL:t}),n=[];for(let{molfile:o}of i){let s=w(o);n.push(...s)}return n}async function ur(e,r={}){let{logger:t,mixedEOL:i}=r,n=await e.text(),o=We(n,{mixedEOL:i}),s={molecules:o,spectra:[]};return t&&t[o.length>0?"info":"debug"](`Loaded ${s.molecules.length} molecules from the ${e.name} file`),s}var H=class{id="nmrium-core-plugins#SDFLoaderPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={supportedExtensions:["sdf"],onFile:this.onReadProcessFile.bind(this)}}onReadProcessFile(r,t={}){let{logger:i}=t;return i?.debug(`Reading sdf file: ${r.name}`),ur(r,{logger:i})}};function Fe(){return new H}var pr=require("openchemlib/full");function Je(e){let r=[],t=e.split(/\r?\n/).filter(Boolean);for(let i of t){let o=pr.Molecule.fromSmiles(i).toMolfile();r.push({molfile:o})}return r}async function fr(e,r={}){let t=await e.text(),i=Je(t),n={molecules:i,spectra:[]};return r.logger?.info(`Found ${i.length} molecules from the ${e.name} file`),n}var X=class{id="nmrium-core-plugins#SmilesLoaderPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={supportedExtensions:["smi","smiles"],onFile:this.onReadProcessFile.bind(this)}}onReadProcessFile(r,t={}){let{logger:i}=t;return fr(r,{logger:i})}};function Ne(){return new X}var br=require("@zakodium/nmrium-core"),Fr=require("filelist-utils"),Nr=require("is-any-array"),Pr=require("ml-spectra-processing"),Sr=require("varian-converter");var dr=require("nmr-processing");function gr(e,r){let{meta:t,procpar:i}=e,n={};for(let h of i)n[h.name]=h.values;let o={},s={},{np:l,solvent:a,sfrq:m,reffrq:u,temp:c,rp:g,sw:y,rfl:d,rfp:p}=n;N(o,"numberOfPoints",l&&Number(C(l))/2),N(o,"solvent",C(a)),N(o,"originFrequency",C(m)),N(o,"baseFrequency",C(u)),(Number.isNaN(o.originFrequency)||o.originFrequency===0)&&(o.originFrequency=400,r?.warn("The frequency could not be determined and was set to 400MHz")),N(o,"temperature",C(c)),N(o,"phc0",g&&Number(g[0])),N(s,"rfl",d&&Number(C(d))),N(s,"rfp",p&&Number(C(p))),N(s,"sw",y&&Number(C(y)));for(let h in s){let b=s[h];Array.isArray(b)&&b.length===1&&(s[h]=b[0])}if(!("baseFrequency"in o)&&"originFrequency"in o){let h=Number.parseFloat(o.originFrequency);if(["sw","rfl","rfp"].every(b=>b in s)){let{sw:b=1,rfl:P=1,rfp:R=1}=Jn(s,["sw","rfl","rfp"]);N(o,"baseFrequency",h-(b/2-P+R)/1e6)}else N(o,"baseFrequency",h)}let{baseFrequency:f,originFrequency:F}=o;N(o,"frequencyOffset",(F-f)*1e6),N(o,"spectralWidth",y&&Number(y[0])/o.baseFrequency);for(let h in o)o[h].length===1&&(o[h]=o[h][0]);return n.tn&&(o.nucleus=n.tn.map(dr.normalizeNucleus)),o.dimension=1,o.isFid=!t.status.isSpectrum,{info:o,meta:{...s,...yr(t),...n}}}function C(e){return e&&(Array.isArray(e)?e[0]:e)}function Jn(e,r){let t={};for(let i of r){let n=e[i];n&&typeof n=="number"&&(t[i]=n)}return t}function yr(e){let r={};for(let t of Object.keys(e)){let i=e[t];typeof i=="object"&&i!==null&&i.constructor&&i.constructor!==Object?r[t]=yr(i):r[t]=i}return r}function hr(e){let r={},t=new Set(e.files.map(i=>i.relativePath));for(let i of e){let n=i.name.toLowerCase();if(n.match(/^(?:fid|procpar|text|log)$/)){if(n.match(/^(?:fid|text|log)$/)){let l=i.relativePath.replace(/(?:fid|text|log)$/,"procpar");if(!t.has(l))continue}let o=i.relativePath.split("/"),s=o.slice(0,-1).join("/");r[s]||(r[s]={name:o.at(-2),files:[]}),r[s].files.push(i)}}return Object.values(r)}async function Rr(e,r={}){let{keepSource:t,logger:i}=r,n=hr(e);i&&i.debug(`Found ${Object.keys(n).length} varian experiments`);let o=[],s={spectra:[],molecules:[]};for(let a of n){let{name:m,files:u}=a,c=new Fr.FileCollection(u),g=(0,Sr.convert1D)(c).then(y=>{let{info:d,meta:p}=gr(y),f=y.fid.data[0],F=(0,Nr.isAnyArray)(f.im),h={data:{...f,x:y.x},meta:p,info:{isComplex:F,name:m,...d},display:{name:m}};if(d.isFid&&F){let{im:b}=h.data;(0,Pr.xMultiply)(b,-1,{output:b})}u&&t&&(h.sourceSelector={files:u.map(b=>b.relativePath)}),s.spectra.push(h)});o.push(g)}let l=await Promise.allSettled(o);for(let a=0;a<l.length;a++){let m=l[a];if(m.status==="rejected"&&m.reason){let u=n[a].name;i?.warn(`Varian data: ${u}, fails with: ${m.reason}`)}}return s.spectra.length>0&&i?.info(`Loaded ${s.spectra.length} spectra from Varian files`),(0,br.formatSpectra)(s)}var Y=class{id="nmrium-core-plugins#VarianLoaderPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={onFiles:this.onReadProcessFiles}}onReadProcessFiles=(r,t)=>{let{keepSource:i,logger:n}=t??{};return Rr(r,{keepSource:i,logger:n})}};function Pe(){return new Y}function Mr(e,r=[]){return[ye(e),Pe(),ce(),ue(),de(),Fe(),Ne(),fe(),Ue()].concat(r)}function xr(){let e=new Dr.NMRiumCore;return e.registerPlugins(Mr(e)),e}var Ve=require("@zakodium/nmrium-core"),Or=require("convert-to-jcamp");function Ar(e,r){return e.filters.find(t=>t.name===r)}function Cr(e,r={}){let{info:t,meta:i,data:n}=e,{onlyReal:o=!1}=r,{isFid:s,spectralWidth:l}=t,a=(0,Ve.getOneIfArray)(t.baseFrequency||t.originFrequency),{x:m,re:u,im:c}=n,g=new Float64Array(u),y=!o&&c?new Float64Array(c):void 0,d={};G(d,"SW",l),G(d,"BF1",a);let p=Ar(e,"fft")?.enabled,f={originFrequency:t.originFrequency,dataType:!t.isFid||p?"NMR SPECTRUM":"NMR FID",dataClass:!o&&c?"NTUPLES":"XYDATA"};if(s){let b=e.filters.find(P=>P.name==="digitalFilter");if(b&&!p){let{value:{digitalFilterValue:P},enabled:R}=b;if(R){let S=Math.floor(P);g.set(u.slice(u.length-S)),g.set(u.slice(0,u.length-S),S),c&&y&&(y.set(c.slice(c.length-S)),y.set(c.slice(0,c.length-S),S))}}G(f,"decim",t.decim),G(f,"dspfvs",t.dspfvs),G(f,"digitalFilter",t.digitalFilter)}let F={xyEncoding:"DIFDUP",info:{...t,...f},meta:{...i,...d}},h={x:{data:m,label:t.isFid?"TIME":"FREQUENCY",units:t.isFid?"second":"HZ",symbol:"X"},r:{data:g,label:`${t.isFid?"FID":"SPECTRUM"}/REAL`,units:"ARBITRARY UNITS",symbol:"R"}};return y&&(h.i={data:y,label:`${t.isFid?"FID":"SPECTRUM"}/IMAG`,units:"ARBITRARY UNITS",symbol:"I"}),(0,Or.from1DNMRVariables)(h,F)}function G(e,r,t){t!==void 0&&(e[r]=(0,Ve.getOneIfArray)(t))}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import type { DataSelectionOption } from '@zakodium/nmrium-core';
|
|
2
|
+
import type { FileCollection } from 'filelist-utils';
|
|
3
|
+
import type { Logger } from 'cheminfo-types';
|
|
4
|
+
import { NMRiumCore } from '@zakodium/nmrium-core';
|
|
5
|
+
import type { NmriumData } from '@zakodium/nmrium-core';
|
|
6
|
+
import type { NMRiumPlugin } from '@zakodium/nmrium-core';
|
|
7
|
+
import type { NMRiumPluginMigration } from '@zakodium/nmrium-core';
|
|
8
|
+
import type { NMRiumPluginOnReadProcess } from '@zakodium/nmrium-core';
|
|
9
|
+
import type { ParsingOptions } from '@zakodium/nmrium-core';
|
|
10
|
+
import type { Spectrum1D } from '@zakodium/nmrium-core';
|
|
11
|
+
import type { StateMolecule } from '@zakodium/nmrium-core';
|
|
12
|
+
|
|
13
|
+
export declare function brukerLoader(): NMRiumPlugin;
|
|
14
|
+
|
|
15
|
+
export declare class BrukerLoaderPlugin implements NMRiumPlugin {
|
|
16
|
+
id: string;
|
|
17
|
+
version: number;
|
|
18
|
+
migrations: NMRiumPluginMigration[];
|
|
19
|
+
onReadProcess: NMRiumPluginOnReadProcess;
|
|
20
|
+
constructor();
|
|
21
|
+
onReadProcessFiles: (files: FileCollection, options?: ParsingOptions) => Promise<NmriumData>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
declare interface FilterTreeByDataTypeDataClass {
|
|
25
|
+
/**
|
|
26
|
+
* dataClass to be filter out of the tree, default value is
|
|
27
|
+
* the same dataClass of the input data.
|
|
28
|
+
*/
|
|
29
|
+
dataClass?: string;
|
|
30
|
+
/**
|
|
31
|
+
* dataType to be filter out of the tree, default value is
|
|
32
|
+
* the same dataType of the input data.
|
|
33
|
+
*/
|
|
34
|
+
dataType?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Init NMRiumCore with recommended plugins.
|
|
39
|
+
*/
|
|
40
|
+
declare function init(): NMRiumCore;
|
|
41
|
+
export default init;
|
|
42
|
+
export { init }
|
|
43
|
+
|
|
44
|
+
declare interface JcampConverterOptions {
|
|
45
|
+
keepRecordsRegExp?: RegExp;
|
|
46
|
+
profiling?: boolean;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export declare function jcampLoader(): NMRiumPlugin;
|
|
50
|
+
|
|
51
|
+
export declare class JcampLoaderPlugin implements NMRiumPlugin {
|
|
52
|
+
id: string;
|
|
53
|
+
version: number;
|
|
54
|
+
migrations: NMRiumPluginMigration[];
|
|
55
|
+
onReadProcess: NMRiumPluginOnReadProcess;
|
|
56
|
+
constructor();
|
|
57
|
+
private onReadProcessFile;
|
|
58
|
+
private getJcampSelector;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
declare interface JcampParsingOptions {
|
|
62
|
+
name?: string;
|
|
63
|
+
converter?: JcampConverterOptions;
|
|
64
|
+
selector?: JcampSelectorOptions;
|
|
65
|
+
keepSource?: boolean;
|
|
66
|
+
logger?: Logger;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
declare interface JcampSelectorOptions {
|
|
70
|
+
index?: number;
|
|
71
|
+
tree?: FilterTreeByDataTypeDataClass[];
|
|
72
|
+
dataSelection?: DataSelectionOption;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export declare function jdfLoader(): NMRiumPlugin;
|
|
76
|
+
|
|
77
|
+
export declare class JDFLoaderPlugin implements NMRiumPlugin {
|
|
78
|
+
id: string;
|
|
79
|
+
version: number;
|
|
80
|
+
migrations: NMRiumPluginMigration[];
|
|
81
|
+
onReadProcess: NMRiumPluginOnReadProcess;
|
|
82
|
+
constructor();
|
|
83
|
+
private onReadProcessFile;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export declare function molfileLoader(): NMRiumPlugin;
|
|
87
|
+
|
|
88
|
+
export declare class MolfileLoaderPlugin implements NMRiumPlugin {
|
|
89
|
+
id: string;
|
|
90
|
+
version: number;
|
|
91
|
+
migrations: NMRiumPluginMigration[];
|
|
92
|
+
onReadProcess: NMRiumPluginOnReadProcess;
|
|
93
|
+
constructor();
|
|
94
|
+
private onReadProcessFile;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export declare function nmreLoader(core: NMRiumCore): NMRiumPlugin;
|
|
98
|
+
|
|
99
|
+
export declare class NMReLoaderPlugin implements NMRiumPlugin {
|
|
100
|
+
private core;
|
|
101
|
+
id: string;
|
|
102
|
+
version: number;
|
|
103
|
+
migrations: NMRiumPluginMigration[];
|
|
104
|
+
onReadProcess: NMRiumPluginOnReadProcess;
|
|
105
|
+
constructor(core: NMRiumCore);
|
|
106
|
+
onReadProcessFiles: (files: FileCollection, options?: ParsingOptions) => Promise<NmriumData>;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
declare interface ParseSDFOptions {
|
|
110
|
+
mixedEOL?: boolean;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export declare function processJcamp(text: string, options?: JcampParsingOptions): NmriumData;
|
|
114
|
+
|
|
115
|
+
export declare function readSDF(text: string, options?: ParseSDFOptions): StateMolecule[];
|
|
116
|
+
|
|
117
|
+
export declare function readSMILES(text: string): StateMolecule[];
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Recommended plugins for NMRium.
|
|
121
|
+
* This helper allows passing your own plugins to the recommended ones.
|
|
122
|
+
* Recommended plugins will have higher priority than the passed ones.
|
|
123
|
+
* @param core - NMRePlugin depend on core to load webSource.
|
|
124
|
+
* @param plugins - optional, convenient to pass your own plugins.
|
|
125
|
+
*/
|
|
126
|
+
export declare function recommended(core: NMRiumCore, plugins?: NMRiumPlugin[]): NMRiumPlugin[];
|
|
127
|
+
|
|
128
|
+
export declare function sdfLoader(): NMRiumPlugin;
|
|
129
|
+
|
|
130
|
+
export declare class SDFLoaderPlugin implements NMRiumPlugin {
|
|
131
|
+
id: string;
|
|
132
|
+
version: number;
|
|
133
|
+
migrations: NMRiumPluginMigration[];
|
|
134
|
+
onReadProcess: NMRiumPluginOnReadProcess;
|
|
135
|
+
constructor();
|
|
136
|
+
private onReadProcessFile;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export declare function smilesLoader(): NMRiumPlugin;
|
|
140
|
+
|
|
141
|
+
export declare class SmilesLoaderPlugin implements NMRiumPlugin {
|
|
142
|
+
id: string;
|
|
143
|
+
version: number;
|
|
144
|
+
migrations: NMRiumPluginMigration[];
|
|
145
|
+
onReadProcess: NMRiumPluginOnReadProcess;
|
|
146
|
+
constructor();
|
|
147
|
+
private onReadProcessFile;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export declare function spectrum1DToJcamp(spectrum: Spectrum1D, options?: {
|
|
151
|
+
onlyReal?: boolean;
|
|
152
|
+
}): string;
|
|
153
|
+
|
|
154
|
+
export declare function varianLoader(): NMRiumPlugin;
|
|
155
|
+
|
|
156
|
+
export declare class VarianLoaderPlugin implements NMRiumPlugin {
|
|
157
|
+
id: string;
|
|
158
|
+
version: number;
|
|
159
|
+
migrations: NMRiumPluginMigration[];
|
|
160
|
+
onReadProcess: NMRiumPluginOnReadProcess;
|
|
161
|
+
constructor();
|
|
162
|
+
onReadProcessFiles: (files: FileCollection, options?: ParsingOptions) => Promise<NmriumData>;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export { }
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{NMRiumCore as wn}from"@zakodium/nmrium-core";import{formatSpectra as Kt}from"@zakodium/nmrium-core";import{convertOneExperiment as Zt,groupByExperiments as Qt}from"brukerconverter";function U(e){let r=[];for(let t of e){if(!t)continue;let{groups:{value:i,unit:n}={}}=t.trim().match(/[$$]*\s*(?<value>[\d.]+)\s*(?<unit>[a-zA-Z]+)/)||{};r.push(jt(i,n))}return r}function jt(e,r){switch(r.toLowerCase()){case"s":return Number.parseFloat(e);case"ms":return Number.parseFloat(e)/1e3;case"m":case"min":return Number.parseFloat(e)*60;default:return Number.NaN}}import{isAnyArray as Oe}from"is-any-array";function I(e){if(Bt(e))return zt(e)?e.map(Ae):Ae(e);if(typeof e=="object"&&e!==null){let r={};for(let t in e)r[t]=I(e[t]);return r}return e}function Bt(e){return Oe(e)}function Ae(e){return Float64Array.from(e)}function zt(e){return Oe(e[0])}import{getOneIfArray as j}from"@zakodium/nmrium-core";import{getGyromagneticRatio as Vt}from"gyromagnetic-ratio";import{isAnyArray as ce}from"is-any-array";import{getFrequency as _t}from"nmr-processing";import{isAnyArray as T}from"is-any-array";function W(e){return typeof e=="number"}function J(e){let{phc0:r,phc1:t}=e;return!T(r)&&!W(r)||!T(t)&&!W(t)||T(r)&&!W(r[0])||T(t)&&!W(t[0])?{}:(T(t)?t[0]*=-1:t*=-1,T(r)?r[0]*=-1:r*=-1,{phc0:r,phc1:t})}function Ie(e,r,t){if(e>0)return Number(e);if(r>14||r===0)return 0;if(Ce[r]){let i=Ce[r];if(!i[t])throw new Error(`decim ${t} not in lookup table for dspfvs ${r}`);return i[t]}else throw new Error(`dspfvs ${r} not in lookup table`)}var Ce={10:{2:44.75,3:33.5,4:66.625,6:59.08333333333333,8:68.5625,12:60.375,16:69.53125,24:61.02083333333333,32:70.015625,48:61.34375,64:70.2578125,96:61.50520833333333,128:70.37890625,192:61.5859375,256:70.439453125,384:61.62630208333333,512:70.4697265625,768:61.646484375,1024:70.48486328125,1536:61.65657552083333,2048:70.492431640625},11:{2:46,3:36.5,4:48,6:50.16666666666667,8:53.25,12:69.5,16:72.25,24:70.16666666666667,32:72.75,48:70.5,64:73,96:70.66666666666667,128:72.5,192:71.33333333333333,256:72.25,384:71.66666666666667,512:72.125,768:71.83333333333333,1024:72.0625,1536:71.91666666666667,2048:72.03125},12:{2:46,3:36.5,4:48,6:50.16666666666667,8:53.25,12:69.5,16:71.625,24:70.16666666666667,32:72.125,48:70.5,64:72.375,96:70.66666666666666,128:72.5,192:71.333333333,256:72.25,384:71.66666666666667,512:72.125,768:71.83333333333333,1024:72.0625,1536:71.91666666666667,2048:72.03125},13:{2:2.75,3:2.833333333333333,4:2.875,6:2.916666666666667,8:2.9375,12:2.958333333333333,16:2.96875,24:2.979166666666667,32:2.984375,48:2.989583333333333,64:2.9921875,96:2.994791666666667}};import{normalizeNucleus as Ut}from"nmr-processing";function E(e,r=","){if(e&&typeof e=="string")return e.split(r)}function V(e,r,t){let i=[];if(e[`${t}AXNUC`]&&(i=e[`${t}AXNUC`],Array.isArray(i)||(i=[i]),i=O(i)),i.length===0&&e[`${t}NUC1`]&&(i=e[`${t}NUC1`],Array.isArray(i)||(i=[i]),i=O(i)),i.length===0&&e[".NUCLEUS"]){let n=E(e[".NUCLEUS"]);if(e[`${t}SYMBOL`]){let o=e[`${t}SYMBOL`].split(","),s=o.findIndex(a=>a.includes("2")),l=o.findIndex(a=>a.includes("1"));s!==-1&&l!==-1&&n?i=O([n[s],n[l]]):i=O(n).reverse()}else i=O(n)}return i.length===0&&e[".OBSERVENUCLEUS"]&&(i=O([e[".OBSERVENUCLEUS"]])),i.length===0&&r.experiment&&(i=O(Ee(r.experiment[0]))),Wt(e)&&(i=[e["2D_X_NUCLEUS"].replaceAll(/[^A-Za-z0-9]/g,""),e["2D_Y_NUCLEUS"].replaceAll(/[^A-Za-z0-9]/g,"")]),r.experiment&&(r.experiment[0].match("jres")||r.experiment[0].match("dosy"))&&(i=Ee(r.experiment[0])),i.map(Ut)}function Wt(e){return e["2D_X_NUCLEUS"]&&!e["2D_X_NUCLEUS"].includes("off")&&e["2D_Y_NUCLEUS"]&&!e["2D_Y_NUCLEUS"].includes("off")}function Ee(e){return typeof e!="string"?[]:(e=e.toLowerCase(),e.includes("jres")?["1H","Hz"]:e.includes("dosy")?["1H","D"]:e.includes("hmbc")||e.includes("hsqc")?["1H","13C"]:e.includes("cosy")||e.includes("tocsy")?["1H","1H"]:[])}function O(e){if(!e)return[];let r=e.map(i=>String(i).replaceAll(/[^A-Za-z0-9]/g,"").replace("NA","").replace("off","")),t=0;for(let i of r)i||t++;return t===0?r:[]}import{getOneIfArray as Jt}from"@zakodium/nmrium-core";function _(e={},r={},t={}){e===null&&(e={}),typeof e=="string"&&(e={pulseSequence:e});let i=Array.isArray(e.pulseSequence)?e.pulseSequence[0]:e.pulseSequence||"";if(typeof i!="string")return e.dimension?`${e.dimension}d`:"";if(i=i.toLowerCase(),i.includes("zg")||i.includes("single_pulse_dec")||i.includes("udeft"))return"1d";if(i.includes("hsqct")||i.includes("invi")&&(i.includes("ml")||i.includes("di")))return"hsqctocsy";if(i.includes("hsqc")||i.includes("invi"))return"hsqc";if(i.includes("hmbc")||i.includes("inv4")&&i.includes("lp"))return"hmbc";if(i.includes("hmqc"))return"hmqc";if(i.includes("cosy"))return"cosy";if(i.includes("jres"))return"jres";if(i.includes("dosy"))return"dosy";if(i.includes("tocsy")||i.includes("mlev")||i.includes("dipsi"))return"tocsy";if(i.includes("noesy"))return"noesy";if(i.includes("roesy"))return"roesy";if(i.includes("dept"))return"dept";if(i.includes("jmod")||i.includes("apt"))return"aptjmod";if(i.includes("inad"))return"inadequate";if(i.includes("adeq"))return"adequate";let{prefix:n=""}=t,o=(Jt(r[`${n}SPECTYP`])||"").replace(/^<(.*)>$/,"$1").toLowerCase();return o.length>0&&o!=="undefined"?o:e.dimension?`${e.dimension}d`:""}function N(e,r,t,i=!1){t===void 0||r in e&&!i||(Array.isArray(t)?e[r]=t.map(Te):e[r]=[Te(t)])}function Te(e){return typeof e=="string"&&(e.startsWith("<")&&e.endsWith(">")&&(e=e.slice(1,-1)),e=e.replace(/\$.*/,"").trim()),e}function X(e,r={}){let{prefix:t="",logger:i}=r,n={dimension:0,nucleus:[],isFid:!1,isFt:!1},o=JSON.stringify(e),s=/\r\n/.exec(o)?`\r
|
|
2
|
+
`:`
|
|
3
|
+
`,{JCAMPDX:l="",ORIGIN:a=""}=e,m=String(l).toLowerCase()+String(a).toLowerCase();"SPECTROMETER/DATASYSTEM"in e&&(m=e["SPECTROMETER/DATASYSTEM"]);let u=(d=[])=>{for(let p of d)if(!(p in n))return!1;return!0};(m.includes("mestre")||m.includes("nova"))&&(m="mnova"),n.creator=m,e.LONGDATE&&ae(n,Date.parse(e.LONGDATE)),N(n,"pulseSequence",e[".PULSESEQUENCE"]||e[".PULPROG"]||e[`${t}PULPROG`]);let c=e[`${t}OWNER`];if(c&&N(n,"owner",c.replaceAll(/\$\$.*/gm,"")),N(n,"aqMod",e[`${t}AQ_mod`]),N(n,"experiment",_(n,e,{prefix:t})),n.nucleus=V(e,n,t),n.nucleus.length===0)if(i)i?.warn("There is not a nucleus detected, assuming 1H"),n.nucleus=["1H"];else throw new Error("There is not a nucleus detected");n.dimension=n.nucleus.length;let g=e[`${t}.ACQUISITIONSCHEME`]||e[`${t}FnMODE`];if(g&&N(n,"acquisitionScheme",Xt(j(g,1))),N(n,"acquisitionMode",e[`${t}.ACQUISITIONMODE`]),M(n,"lpNumberOfCoefficients",e[`${t}NCOEF`]),M(n,"linearPredictionBin",e[`${t}LPBIN`]),M(n,"tdOff",e[`${t}TDoff`]),N(n,"windowMultiplicationMode",e[`${t}WDW`]),N(n,"title",e.TITLE),N(n,"solvent",e[".SOLVENTNAME"]),N(n,"temperature",e[`${t}TE`]||e[".TE"]),N(n,"type",e.DATATYPE),N(n,"dataClass",e[`${t}DATACLASS`]),N(n,"phc1",e[`${t}PHC1`]),N(n,"phc0",e[`${t}PHC0`]),n.type){let d=n.type[0].toUpperCase();d.includes("FID")?(n.isFid=!0,n.isComplex=!0):d.includes("SPECTRUM")&&(n.isFt=!0)}if(N(n,"firstX",e[`${t}FIRSTX`]),N(n,"lastX",e[`${t}LASTX`]),N(n,"numberOfPoints",e[`${t}NPOINTS`]),N(n,"originFrequency",e[`${t}SFO1`]),n.dimension===1&&M(n,"originFrequency",e[".OBSERVEFREQUENCY"]),"originFrequency"in n&&(n.originFrequency=H(n.originFrequency)),!n.originFrequency&&n.dimension===2&&".OBSERVEFREQUENCY"in e){let{nucleus:d}=n,p=H(e[".OBSERVEFREQUENCY"]);if(ce(p)&&p.length>1){let f=e[`${t}SYMBOL`].split(","),F=f.findIndex(b=>b.includes("2")),h=f.findIndex(b=>b.includes("1"));F!==-1&&h!==-1?n.originFrequency=[p[F],p[h]]:n.originFrequency=p.slice()}else if(typeof p=="number"){let f=_t(d[1],{frequency:p,nucleus:d[0]});n.originFrequency=[p,f]}}if((!n.originFrequency||n.originFrequency.some(d=>Number.isNaN(d)||d===0))&&(n.originFrequency||(n.originFrequency=n.dimension>1?[400,400]:[400]),n.originFrequency=n.originFrequency.map(d=>Number.isNaN(d)||d===0?400:d),i?.warn("The frequency could not be determined and was set to 400 MHz")),m.toLocaleLowerCase().includes("oxford instruments")?Yt(n,e,{...r,separator:s}):m.includes("nanalysis")&&Gt(n,e),m!=="mnova"&&m!=="mestre"){let d=n.nucleus[0],p=Vt(d);if(N(n,"probeName",e[`${t}PROBHD`]),N(n,"baseFrequency",e[`${t}BF1`]),N(n,"baseFrequency",e[`${t}SF`]),M(n,"scaleFactor",e[`${t}NC_proc`]),"scaleFactor"in n)for(let b=0;b<n.scaleFactor.length;)n.scaleFactor[b]=2**n.scaleFactor[b++];if(!("baseFrequency"in n)&&"originFrequency"in n?N(n,"baseFrequency",n.originFrequency):n.baseFrequency=H(n.baseFrequency),!["baseFrequency","originFrequency"].some(b=>!n[b])&&p){let{baseFrequency:b}=n,P=2*Math.PI*(b[0]/p)*1e6;N(n,"fieldStrength",P)}M(n,"spectralWidth",e[`${t}SW`]),M(n,"spectralWidth",e[`${t}QM_SPECTRAL_WIDTH`]),n.dimension===1&&e[`${t}SweepWidth`]&&n.originFrequency&&M(n,"spectralWidth",e[`${t}SweepWidth`]/n.originFrequency[0]),N(n,"numberOfPoints",e[`${t}TD`],!0);let f=n.numberOfPoints;if(N(n,"spectrumSize",e[`${t}SI`]??f),N(n,"sampleName",e[`${t}NAME`]),e[`${t}FNTYPE`]!==void 0&&N(n,"acquisitionMode",Number.parseInt(e[`${t}FNTYPE`],10)),(e[`${t}VARNAME`]?e[`${t}VARNAME`].split(",")[0]:"")==="TIME"){let b=typeof e.LAST=="string"?e.LAST.replace(" ","").split(",")[0]:e.LAST;M(n,"acquisitionTime",b)}if(!n.acquisitionTime&&u(["numberOfPoints","spectralWidth"])){let{spectralWidth:b,originFrequency:P}=n;N(n,"acquisitionTime",Number((f[0]-1)/(2*b[0]*P[0])))}if(e[`${t}P`]){let b=1e6/(j(e[`${t}P`]).split(s)[1].split(" ")[1]*4);N(n,"pulseStrength90",b)}if(e[`${t}D`]){let b=j(e[`${t}D`]).split(s)[1].split(" ")[1];M(n,"relaxationTime",b)}if(M(n,"numberOfScans",e[`${t}NS`]),M(n,"numberOfScans",e[`${t}QM_NSCANS`]),N(n,"groupDelay",e[`${t}GRPDLY`]),N(n,"dspfvs",e[`${t}DSPFVS`]),N(n,"decim",e[`${t}DECIM`]),n.isFid&&("groupDelay"in n||u(["dspfvs","decim"]))){let{groupDelay:b,dspfvs:P,decim:R}=n,S=Ie(b?.[0]??0,P?.[0],R?.[0]);N(n,"digitalFilter",S)}let h;if(u(["numberOfPoints","spectralWidth"])){let{spectralWidth:b,numberOfPoints:P}=n;n.isFid?h=P.map(R=>n.acquisitionTime[0]/(R-1)):h=P.map((R,S)=>b[S]/(R-1))}if(N(n,"increment",h),e[`${t}DATE`]){let b=j(e[`${t}DATE`]),P=Number.parseInt(b,10)*1e3;Number.isNaN(P)?ae(n,Date.parse(b)):ae(n,P)}n.solvent||N(n,"solvent",j(e[`${t}SOLVENT`]))}if(n.dimension<2&&"dataClass"in n&&n.dataClass[0].toUpperCase()==="NTUPLES"&&(N(n,"last",E(e[`${t}LAST`])),N(n,"first",E(e[`${t}FIRST`])),N(n,"varDim",E(e[`${t}VARDIM`])),N(n,"symbols",E(e[`${t}SYMBOL`])),n.symbols&&Array.isArray(n.symbols))){n.symbols.includes("R")&&n.symbols.includes("I")&&(n.isComplex=!0);let d=n.symbols.findIndex(p=>p.toLowerCase()==="x");if(M(n,"firstX",n.first[d]),M(n,"lastX",n.last[d]),M(n,"numberOfPoints",n.varDim[d]),!("spectralWidth"in n)){let{lastX:p,numberOfPoints:f,firstX:F}=n;N(n,"spectralWidth",n.isFid?f/(2*p):Math.abs(p-F)/n.originFrequency)}}if(`${t}REVERSE`in e){let d=e[`${t}REVERSE`];n.reverse=(Array.isArray(d)?d:[d]).map(p=>typeof p=="string"?p.includes("yes"):p)}let y=e[`${t}REFERENCE_POINT`];if(!("frequencyOffset"in n)&&y&&u(["spectralWidth","baseFrequency"])){let d=typeof y=="number"?y:e[`${t}REFERENCE_POINT`].match(/(?<reference>[+-]?\d+(?:\.\d+)?)\s*.*/),p;if(typeof y=="number"?p=y:(y.match(/(?<reference>[+-]?\d+(?:\.\d+)?)\s*.*/),p=Number(d?.groups?.reference)),!Number.isNaN(p)){let{spectralWidth:f,baseFrequency:F}=n;N(n,"frequencyOffset",.5*f*F-p)}}if(!("frequencyOffset"in n)&&u(["baseFrequency","originFrequency"])){let{baseFrequency:d,originFrequency:p}=n,f=d.map((F,h)=>(p[h]-F)*1e6);N(n,"frequencyOffset",f)}for(let d in n)n[d]&&n[d].length===1&&(n[d]=n[d][0]);return!n.frequencyOffset&&".SHIFTREFERENCE"in e&&Ht(e,n),Array.isArray(n.nucleus)||(n.nucleus=[n.nucleus]),n}function M(e,r,t){t!==void 0&&N(e,r,H(t))}function ae(e,r){if(!Number.isNaN(r)){e.epoch=r;let t=new Date(r);e.date=t.toUTCString(),e.localeDate=t.toLocaleString()}}function Ht(e,r){let t=e[".SHIFTREFERENCE"],i=t.trim().startsWith("(")?/\((?<data>[^)]+)\)/:/(?<data>[^)]+)/,n=t.match(i);if(n.groups.data){let o=n.groups.data.split(",");if(o.length<4)return;let s=Number.parseInt(r.numberOfPoints,10),{spectralWidth:l,baseFrequency:a}=r,m=Number.parseInt(o[2],10),u=Number.parseFloat(o[3]),c;if(r.isFid){if(["baseFrequency","numberOfPoints","spectralWidth"].some(g=>!(g in r)))return;c=u+(s*.5-m)*l/s}else{let g=Number.parseFloat(r.firstX),y=Number.parseFloat(r.lastX),d=(y+g)/2,p=(y-g)/(s+1),f=p<0?g:y+(m-1)*p;c=(d-f)/a+u}c!==void 0&&!Number.isNaN(c)&&(r.frequencyOffset=c*a)}}function H(e){if(ce(e)){let r=[];for(let t of e)r.push(typeof t=="string"?Number.parseFloat(t):t);return r}return typeof e=="string"?Number.parseFloat(e):e}function Xt(e){switch(String(ce(e)?e[1]:e).toLowerCase().replaceAll(/\s/g,"")){case"1":case"notphasesensitive":return"notPhaseSensitive";case"2":return"QSEQ";case"3":case"tppi":return"TPPI";case"4":case"states":return"States";case"5":case"tppi-states":return"States-TPPI";case"6":case"echo-antiecho":return"Echo-antiecho";default:return"undefined"}}function Yt(e,r,t={}){let{prefix:i="",separator:n=`
|
|
4
|
+
`}=t;N(e,"spectralWidth",r[`${i}SweepWidth`]/e.originFrequency[0]);let o=r[`${i}.PULSESEQUENCE`].split(n),s=[];r[".OBSERVENUCLEUS"]&&s.push(r[".OBSERVENUCLEUS"]),r.INDIRECTNUCLEUS&&s.push(r.INDIRECTNUCLEUS),e.nucleus=O(s),e.pulseSequence=o[0];let l=o.slice(2,-1);if(s.length>1)if(s[0]===s[1])e.spectralWidth.push(e.spectralWidth[0]);else{let a=JSON.stringify(l).match(/\$\$SW1=\s*(?<sw>[+-]?(?:[0-9]*[.])?[0-9]+)/);if(a?.groups){let{originFrequency:m}=e,u=Number.parseFloat(a.groups.sw);e.spectralWidth.push(u/m[1])}}return e}function Gt(e,r){let{T1NUCLEUS:t,T2NUCLEUS:i,PAGE:n}=r;e.pulseSequence=r.EXPERIMENT||r[".PULSESEQUENCE"];let o=[],{dimension:s,isComplex:l}=e;if(s===2&&e.pulseSequence==="T1"){let u=l?2:1;for(let c=0;c<n.length;c+=u){let g=n[c].replace(/T1=/,"");o.push(Number(g))}r.vdlistValues=o}e.nucleus=s>1?[i,t]:i;let{phc0:a,phc1:m}=e;if(a&&m){let u=J({phc0:a,phc1:m});e={...e,...u}}}var er={keepRecordsRegExp:/.*/,keepFiles:!0};async function Y(e,r={}){let t={spectra:[],molecules:[]},{converter:i={},selector:n={},logger:o}=r,s=Qt(e,{logger:o,...rr(n)}),l=[];for(let m of s)l.push(Zt(m,{...er,...i}).then(u=>tr(u,r)));let a=await Promise.allSettled(l);for(let m=0;m<a.length;m++){let u=a[m];if(u.status==="fulfilled"){let c=J(u.value.info);t.spectra.push({...u.value,info:{...u.value.info,...c}})}else if(u.reason){let c=s[m].name;o?.warn(`Bruker data: ${c}, fails with: ${u.reason}`);continue}}return o&&o[t.spectra.length>0?"info":"debug"](`Loaded ${t.spectra.length} spectra from Bruker files`),Kt(t)}function tr(e,r={}){let{keepSource:t=!1,logger:i}=r,n={...e.info,...e.meta},o=X(n,{logger:i}),s={},{isFid:l}=o;if(nr(e)){let y=e.minMax;for(let d in y){let p=y[d];p&&(p.z=I(p.z))}s.components=e.minMax}else o.dimension===1&&(s.components=e.spectra);let{source:a}=e,{expno:m,name:u,files:c}=a;n.vdlist&&(n.vdlistValues=U(n.vdlist));let g={dependentVariables:[s],meta:n,info:{...o,experimentNumber:m,name:u}};return c&&t&&(g.sourceSelector={files:c.map(y=>y.relativePath)}),ir(g,e),g}function rr(e){let{general:r={},bruker:t={}}=e,{processingNumbers:i,experimentNumbers:n,...o}=t;return{...r,...o,processingNumbers:Le(i),experimentNumbers:Le(n)}}function Le(e){if(e)return e.split(/[^\d]+/).filter(Boolean).map(r=>Number.parseInt(r,10))}function nr(e){let{info:r}=e;return r.twoD}function ir(e,r){if(!("integrals"in r))return;let{integrals:t=[]}=r;e.integrals={values:t.map(i=>{let{from:n,to:o,integration:s}=i;return{from:n,to:o,integral:s,kind:"signal"}})}}var G=class{id="nmrium-core-plugins#BrukerLoaderPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={onFiles:this.onReadProcessFiles}}onReadProcessFiles=(r,t)=>{let{sourceSelector:i,converter:n,keepSource:o,logger:s}=t??{};return Y(r,{converter:n?.bruker,selector:i,keepSource:o,logger:s})}};function me(){return new G}import{formatSpectra as $r}from"@zakodium/nmrium-core";import{createTree as jr}from"jcampconverter";function ke(e,r,t={}){let{selector:i={},keepSource:n=!1}=t;if(!n)return e;for(let o=0;o<e.spectra.length;o++){let s=e.spectra[o];s.sourceSelector={files:[r.relativePath],jcamp:{index:o,...i}}}return e}import{convert as or}from"jcampconverter";function le(e,r,t){let{dataType:i,children:n}=e,o=i==="LINK"&&n?n:[e];for(let s of o){if(s.dataType==="LINK"){le(s,r,t);continue}let l=or(s.jcamp,t);r.push(...l.flatten)}}function qe(e,r={}){let t=[],i=$e(e,r);for(let s of i?e:[])s.dataType==="LINK"?s.children=ue(s.children,r):s=ue([s],r)[0],t.push(s);let{name:n,logger:o}=r;return e.length===0&&o?.warn(`There is no data ${n?`in ${n}`:"in the JCAMP-DX"}`),t}function ue(e=[],r={}){let{name:t,logger:i,tree:n=[],dataSelection:o="both"}=r,s=[];for(let u of e){let{dataType:c,dataClass:g}=u;if(c==="LINK")u.children=ue(u.children,r);else if(n.some(y=>{let{dataClass:d=g,dataType:p=c}=y;return g===d&&c===p})){i?.warn(`Skipping ${g} and ${c} ${t?`in ${t}`:"in the JCAMP-DX"},
|
|
5
|
+
because it didn't match the import filters`);continue}s.push(u)}let l=[],a=s.some(ve),m=s.some(we);for(let u of s){if(o!=="both"&&u.dataType!=="LINK"){if(ve(u)&&(o==="ft"||o==="preferFT"&&m)){i?.warn(`Skipping raw data ${t?`in ${t}`:"in the JCAMP-DX"} because it didn't match the import filters`);continue}if(we(u)&&(o==="fid"||o==="preferFID"&&a)){i?.warn(`Skipping FFT data ${t?`in ${t}`:"in the JCAMP-DX"} because it didn't match the import filters`);continue}}l.push(u)}return l}function we(e){return e.dataType?.toUpperCase().includes("SPECTRUM")&&e.dataClass&&!e.dataClass.toUpperCase().includes("PEAK")}function ve(e){return e.dataType?.toUpperCase().includes("FID")}function $e(e,r={}){let{logger:t,name:i=""}=r;for(let n of e){if(n.dataType==="LINK"&&$e(n.children,r))return!0;let{dataType:o=""}=n,s=o.toLowerCase();if(s.length>0){if(s.includes("spectrum")&&!s.includes("nmr"))return t?.warn(`File ${i} was ignored because it is a ${o}`),!1;if(s.includes("nmr"))return!0}}return!1}import{generateID as ze}from"@zakodium/nmrium-core";import{parseJcampCS as pr}from"jcampconverter";import*as fr from"openchemlib/full";import{isMolfileNotEmpty as sr}from"nmr-processing";import{Molecule as ar}from"openchemlib/full";async function je(e,r={}){let t=await e.text(),i=L(t),n={molecules:i,spectra:[]};return i.length===0&&r.logger?.debug(`${e.name} is an empty molfile`),n}function L(e){let r=[];if(!sr(e))return[];let i=ar.fromMolfile(e).toMolfile();return r.push({molfile:i}),r}import{isMolfileNotEmpty as mr}from"nmr-processing";import*as lr from"openchemlib/full";import{getDiastereotopicAtomIDsFromMolfile as ur}from"openchemlib-utils";var cr=new Set(["ndnmrspectrum","ndnmrfid","nmrspectrum","nmrfid"]);function K(e){let{dataType:r="",dataClass:t=""}=e,i=r.replaceAll(/\s/g,"").toLowerCase(),n=t.replaceAll(/\s/g,"").toLowerCase();return cr.has(i)&&n!=="peaktable"}function Be(e,r,t={}){let{spectra:i,info:n,meta:o}=e,s=i[0].data,l=[],a={x:"delta",y:"intensity",w:"width",m:"multiplicity",a:"atom"},{logger:m,name:u,spectraData:c}=t,{CROSSREFERENCE:g}=n,y=typeof g!="string"?g:g.split(/\r?\n/).map(S=>S.trim()).filter(Boolean),d=y.find(S=>S?.toLowerCase().includes("structure"));if(d===void 0)return m&&m.warn(`There is not a structure reference for ${u} file, assignment object could not be completed`),null;let p=Number.parseInt(d?.toLowerCase().replace(/_/,"").replace(/structure:\s*blockid\s*=\s*(?<blockId>.*)/,"$<blockId>"),10);if(Number.isNaN(p)||p<1)return m&&m.warn(`Structure block_id not found for ${u} file, assignment object could not be completed`),null;let F=c?.molecules?.find(S=>S.blockId===p)?.molfile??"";if(F===""){let S=r.find(x=>x.info.BLOCKID===p),{MOLFILE:D=""}=S?.meta||{};F=D}if(!mr(F))return m&&m.warn(`Empty molfile for ${u} file with structure block_id = ${p}, assignment object could not be completed`),null;let h=ur(lr,F),b=V({...n,...o},{},"");for(let S=0;S<s.x.length;S++){let D={};for(let x in s){let A=s[x][S];typeof A=="string"&&A.startsWith("<")&&A.endsWith(">")&&(A=A.slice(1,-1)),D[a[x]]=A}if("atom"in D){let x=h.map[D.atom-1];b.includes("1H")?x.nbHydrogens>0?(D.diaIDs=x.hydrogenOCLIDs,D.nbHydrogens=x.nbHydrogens):(D.diaIDs=[x.oclID],D.nbHydrogens=x.nbHydrogens):(D.diaIDs=[x.oclID],D.nbHydrogens=1)}l.push(D)}let P={};for(let S of l){let{delta:D,diaIDs:x}=S,A=`${D}_${x.join("_")}`;if(P[A])P[A].atoms.push(S.atom);else{let{atom:Bn,...$t}=S;P[A]={...$t,atoms:[S.atom]}}}let R=[];for(let S of y)S.toLowerCase().includes("spectrum")&&R.push(Number(S.toLowerCase().replace(/_/,"").replace(/.*:\s*blockid=(?<blockId>.*)/,"$<blockId>")));if(R.length===0){for(let S of r)if(K(S)){let{BLOCKID:D}=S.info;R.push(Number(D))}R.length>1&&(R=[],m&&m.warn(`There is not a spectral cross-reference for the peak assignment in the ${u} file`))}return{moleculeBlockID:p,spectraBlockIDs:R,assignments:Object.values(P),molecule:h.molecule}}function Ue(e,r,t,i){for(let n of e){let{meta:o,dataClass:s="",dataType:l="",info:a}=n,m=Number.parseInt(String(a.BLOCKID),10);o.MOLFILE?hr(String(o.MOLFILE),r,m):n.jcampCS&&yr(n,r,m),dr(s,l)&&gr(r,n,e,i),K(n)&&t.push(n)}}function dr(e,r){return e?.toLowerCase().includes("assignments")&&r?.toLowerCase().includes("assignments")}function gr(e,r,t,i){let n=Be(r,t,{spectraData:e,logger:i.logger,name:i.name});if(e.assignmentsByBlocks||(e.assignmentsByBlocks={}),n){let{spectraBlockIDs:o}=n;for(let s of o)e.assignmentsByBlocks[s]=n}}function yr(e,r,t){r.molecules||(r.molecules=[]);let i=pr(e,{OCL:fr}),n=L(i?.molfile||"");n.length>0&&r.molecules.push({id:ze(),blockId:t,...n[0]})}function hr(e,r,t){r.molecules||(r.molecules=[]);let i=L(String(e));r.molecules.push({id:ze(),blockId:t,...i[0]})}import{generateID as tt}from"@zakodium/nmrium-core";import{matrixMinMaxZ as et,reimPhaseCorrection as Or}from"ml-spectra-processing";import{xyAutoRangesPicking as Cr}from"nmr-processing";function k(e){return e.slice(0,Math.max(0,e.lastIndexOf(".")))}function w(e){e.sort((r,t)=>r.from-t.from);for(let r=0;r<e.length-1;r++)e[r].to>e[r+1].from&&(e[r].to=Math.max(e[r+1].to,e[r].to),e[r].signals=e[r].signals.concat(e[r+1].signals),e[r].integration+=e[r+1].integration,e.splice(r+1,1),r--);return e}import{splitPatterns as Sr}from"nmr-processing";import{xMaxValue as br}from"ml-spectra-processing";function B(e){return e.trim().slice(1,-1).split(/,\s*/).map(r=>r.trim())}var Fr={I:"id",X:"from",Y:"to",Hs:"delta",An:"integration",H:"nbAtoms",C:"multiplicity",N:"assignment","(J)":"js"},We=["I","X","Y","Hs","An","H","C","N","(J)"];function Je(e){let r={headersFromParenthesis:[],headersFromComments:[],comments:[],data:[],multiplets:[]},t=e.split(/\r?\n/).filter(i=>i.trim()!=="");if(t.length===0)return r;if(t[0].startsWith("(")&&!t[0].match(/\d/)){let i=t.shift();r.headersFromParenthesis=B(i)}return r.comments=t.filter(i=>i.startsWith("$$")).map(i=>i.replace(/^\$\$\s*/,"")),r.headersFromComments=Pr(r.comments),r.data=t.filter(i=>!i.startsWith("$$")).map(B),r.multiplets=Nr(r),r}function Nr(e,r={}){let{logger:t}=r,i=e.data[0].map((a,m)=>m).filter(a=>e.data.every(m=>Number.isNaN(m[a])||Number.isNaN(Number(m[a]))));if(t?.trace(`Parsing JCAMP-DX assignment: stringColumnIndexes: ${i.join(",")}`),i.length===0)return t?.warn("Parsing JCAMP-DX assignment: No string columns found. Skipping parsing of assignment."),[];let n=i[0],o;if(e.headersFromParenthesis.length>0&&e.headersFromParenthesis[n]==="C")o=e.headersFromParenthesis;else if(e.headersFromComments.length>0&&e.headersFromComments[n]==="C")o=e.headersFromComments;else if(We[n]==="C")o=We;else return t?.warn("No header found for multiplicity. Skipping parsing of assignment."),[];return br(e.data.map(a=>a.length))>o.length&&t?.warn("Some assignments are containing more values than headers"),e.data.map(a=>{let m={};for(let u=0;u<o.length;u++){let c=o[u];m[Fr[c]||c]=a[u]}return m})}function Pr(e){return e.map(r=>r.split(":")[0].trim()).filter(r=>r.length>0)}function Ve(e,r={}){let{logger:t}=r,i=Je(e),n={multiplets:[],comments:i.comments};for(let o of i.multiplets){let{id:s,from:l,to:a,delta:m,integration:u,nbAtoms:c,multiplicity:g}=o,y={id:s,js:[],multiplicity:"",...Rr({from:l,to:a,delta:m,integration:u,nbAtoms:c})};if(typeof o.js=="string"){let d=o.js.split(/\s+/).map(Number.parseFloat),p=0,f=Sr(g).map(b=>{let P=(b?.multiplicity||1)-1;return p+=P,{value:b.value,multiplicity:b?.multiplicity,js:d.slice(p-P,p)}}),F=f.reduce((b,P)=>b+(P.multiplicity?P.multiplicity-1:0),0);d.length!==F&&t?.warn(`The number of j values (${d.length}) is not equal to the sum of the multiplicities - 1 (${F})`);let h=[];for(let b of f){if(b.js.every(P=>P===b.js[0])){h.push(b);continue}if(b.multiplicity!==b.js.length+1){h.push(b);continue}for(let P=0;P<b.multiplicity-1;P++)h.push({value:"d",multiplicity:2,js:[b.js[P]]})}h.sort((b,P)=>P.js[0]-b.js[0]),y.js=h.map(b=>({coupling:b.js[0],multiplicity:b.value}))}typeof o.assignment=="string"&&(y.assignment=Mr(o.assignment)),typeof o.multiplicity=="string"&&(y.multiplicity=o.multiplicity),n.multiplets.push(y)}return n}function Rr(e){let r={};for(let t in e){let i=e[t],n=typeof i=="number"?i:Number.parseFloat(i);Number.isNaN(n)||(r[t]=n)}return r}var Dr={quot:'"',apos:"'",comma:",",amp:"&",lpar:"(",rpar:")",lt:"<",gt:">",colon:":",semi:";"};function Mr(e){return e.replaceAll(/&(\w+);/gi,(r,t)=>Dr[t.toLowerCase()]||r)}function _e(e){let r=e.split(/\r?\n/).filter(i=>i.trim()!==""),t=[];for(let i of r)if(i.startsWith("(")){let[n,o,s]=B(i).map(Number.parseFloat);t.push({id:n,x:o,y:s})}return t}function He(e,r={}){let t={};if(!e["OBSERVED MULTIPLETS"])return[];let i=Ve(e["OBSERVED MULTIPLETS"],r);if(!i)return[];let{multiplets:n}=i;for(let o of n){let{id:s,from:l,to:a,integration:m=0,...u}=o;t[s]={from:l,to:a,integration:m,signals:[{id:s,...u}]}}if(e["OBSERVED MULTIPLETS PEAKS"]){let o=_e(e["OBSERVED MULTIPLETS PEAKS"]),s={};for(let l of o){let{id:a,x:m,y:u}=l;s[a]||(s[a]=[]),s[a].push({x:m,y:u,width:.05})}for(let l in t)s[l]&&(t[l].signals[0].peaks=s[l])}return w(Object.values(t))}function Xe(e,r){let i=[...e.getMolecularFormula().formula.matchAll(/(?<element>[A-Z][a-z]?)(?<count>\d*)/g)].map(o=>({element:o?.groups?.element,count:o?.groups?.count?Number(o.groups.count):1})),n=[...r.nucleus[0].matchAll(/[0-9]*(?<element>[A-Z][a-z]?)/g,"$element")][0].groups.element;return i.find(o=>o.element===n)?.count||100}function Ye(e){let r={};return".PHASE0"in e&&(r.ph0=Number.parseFloat(e[".PHASE0"]),r.ph1=Number.parseFloat(e[".PHASE1"])),r}function pe(e){let{ph0:r,ph1:t}=e;return Number.isFinite(r)&&Number.isFinite(t)}import{generateID as Ge}from"@zakodium/nmrium-core";function Ke(e,r,t){for(let i=0;i<e.length;i++){if(r.includes(i))continue;let{delta:n,multiplicity:o="",diaIDs:s}=e[i],l=Number(n)-.01,a=Number(n)+.01;t.push({from:l,to:a,integration:1,id:Ge(),signals:[{id:Ge(),delta:n,multiplicity:o,diaIDs:s}]})}}import{linearSumAssignment as xr}from"linear-sum-assignment";import{xCostMatrix as Ar}from"ml-spectra-processing";function Ze(e,r){let t=e.map(s=>s.delta),i=r.map(s=>s.delta),n=Ar(i,t,{fct:(s,l)=>Math.abs(s-l)}),{rowAssignments:o}=xr(n,{maximaze:!1});return Array.from(o)}function Qe(e,r){let{assignments:t,ranges:i}=r;t?.sort((s,l)=>l.delta-s.delta);let n=[],o=[];for(let s of i){let l=0,{from:a,to:m}=s,u=[];for(let c=l;c<t.length;c++){let{delta:g}=t[c];g<=m&&g>=a?(u.push(t[c]),o.push(c)):g>m&&(l=c)}if(u.length>0){let c=s.signals,g=[],y=u.length>1&&c.length>1?Ze(c,u):[0];for(let d=0;d<u.length;d++){let p=y[d],{delta:f,multiplicity:F,diaIDs:h}=u[d];p>-1?g.push({...c[p],diaIDs:h}):g.push({delta:f,multiplicity:F,diaIDs:h})}s.signals=g,n.push(s)}}Ke(t,o,n),n.sort((s,l)=>s.from-l.from),e.ranges={values:w(n).map(s=>{let{integration:l,...a}=s;return a}),options:{sum:r.integrationSum,isSumConstant:!0,sumAuto:!0}},e.ranges.options.moleculeId=String(r.moleculeId)}function rt(e,r,t,i,n){let{logger:o}=n,s={components:nt(e)?Tr(e,t.isFid):Er(e)},{name:l=t.title||`jcamp_${tt()}`}=n,a={dependentVariables:[s],meta:r,info:{...t,name:k(l)}};return Ir(e)&&Lr(a,i,r,e,t,{logger:o}),a}function nt(e){return"minMax"in e}function Ir(e){return!nt(e)}function Er(e){return e.spectra.map(r=>{let t=I(r.data);return{...r,data:t}})}function Tr(e,r){let t={...e.minMax,z:I(e.minMax?.z)};return r?kr(t):{rr:t}}function Lr(e,r,t,i,n,o){let{assignmentsByBlocks:s}=r,l=Ye(t);pe(l)&&wr(e,l);let a=String(i.info.BLOCKID);if(s?.[a]){let{molecule:m,assignments:u,moleculeBlockID:c}=s[a],g=Xe(m,n),y=I(i.spectra[0].data);if(y.x[0]>y.x[1])for(let F of i.spectra)F.data.x.reverse(),F.data.y.reverse();if(pe(l)&&i.spectra.length>1){let{re:F}=vr(i,l);y.y=F}let{x:d,y:p}=y,f=He(t,o)??Cr({x:d,y:p},{peakPicking:{frequency:n.originFrequency},ranges:{frequency:n.originFrequency,integrationSum:g}});Qe(e,{moleculeId:c,ranges:f,assignments:u,integrationSum:g})}}function kr(e){let{z:r,...t}=e,i=[],n=[];for(let l=0;l<r.length;l+=2)i.push(r[l].slice()),n.push(r[l+1].slice());let o=et(i),s=et(n);return{re:{...t,z:i,minZ:o.min,maxZ:o.max},im:{...t,z:n,minZ:s.min,maxZ:s.max}}}function wr(e,r){let{ph0:t,ph1:i}=r;e.filters||(e.filters=[]),e.filters.push({id:tt(),name:"phaseCorrection",value:{ph0:t,ph1:i,absolute:!1},enabled:!0})}function vr(e,r){let{ph0:t,ph1:i}=r,{re:n,im:o}=Or({re:e.spectra[0].data.y,im:e.spectra[1].data.y},t*Math.PI/180,i*Math.PI/180);return{re:n,im:o}}function it(e,r,t){let{logger:i}=t,n=[];for(let o of e)if(o.spectra&&o.spectra.length>0||o.minMax){qr(o);let s={...o.info,...o.meta},l=X(s,{logger:i});if(l.experiment==="wobble_curve")continue;n.push(rt(o,s,l,r,t))}return n}function qr(e){let r=e.meta["BRUKER FILE EXP"];if(!r)return;let i=(Array.isArray(r)?r:[r]).find(o=>o.slice(0,10).includes("vdlist"));if(!i)return;let n=i.split(`
|
|
6
|
+
`).slice(1);e.info.vdlistValues=U(n)}async function Z(e,r={}){let t=await e.text(),i=ot(t,{name:e.name,...r});return ke(i,e,r)}function ot(e,r={}){let t={spectra:[],molecules:[]},{name:i,converter:n={},selector:o={},logger:s}=r,{keepRecordsRegExp:l=/.*/}=n,a={keepSpectra:!0,noContour:!0,noTrimRegExp:/\$MOLFILE/,keepRecordsRegExp:l,logger:s},m=qe(jr(e),{name:i,...o,logger:s});for(let u of m)Br(u,t,a,i);if(zr(t,o),t.spectra.length===0&&m.length>0){let u=t.molecules.length===0?" nor molecule":"";s?.warn(`No spectra${u} data was loaded from file ${i}`)}return $r(t)}function Br(e,r,t,i){let n=[],o=[],s={molecules:[]},{logger:l}=t,a={name:i,logger:l};le(e,o,t),Ue(o,s,n,a),r.spectra.push(...it(n,s,a)),r.molecules.push(...s.molecules)}function zr(e,r){r.index!==void 0&&(e.spectra=e.spectra.slice(r.index,r.index+1))}var Q=class{id="nmrium-core-plugins#JcampLoaderPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={supportedExtensions:["jcamp","jdx","dx"],onFile:this.onReadProcessFile.bind(this)}}onReadProcessFile(r,t={}){let{sourceSelector:i={},converter:n,keepSource:o,logger:s}=t;return s?.debug(`Reading JCAMP-DX file: ${r.name}`),Z(r,{selector:this.getJcampSelector(i),converter:n?.jcamp,keepSource:o,logger:s})}getJcampSelector(r={}){let{jcamp:t={},general:i={}}=r,{dataSelection:n="both"}=i;return{...t,dataSelection:n}}};function fe(){return new Q}import{formatSpectra as Vr,getOneIfArray as _r}from"@zakodium/nmrium-core";import{getGyromagneticRatio as Hr}from"gyromagnetic-ratio";import{isAnyArray as Xr}from"is-any-array";import{parseJEOL as Yr}from"jeolconverter";import Gr from"lodash.merge";import{normalizeNucleus as Kr}from"nmr-processing";import{isAnyArray as v}from"is-any-array";var st={0:"uint8",1:"uint16",2:"uint32",3:"uint64",4:"int8",5:"int16",6:"int32",7:"int64",8:"float32",9:"float64",10:"complex64",11:"complex128"},at={0:"scalar",1:"vector",2:"matrix",3:"symetricMatrix",4:"pixel"};function ct(e,r,t={}){let{quantityType:i=0,encoding:n="none",name:o="",unit:s="",quantityName:l="",sparseSampling:a={},from:m=[0],to:u=[-1]}=t;if(v(e))throw new Error("jeol with an array of data is not yet supported");if(!("re"in e&&"im"in e))throw new Error("Only re/im data is supported");let c=ge(e,m,u),{componentLabels:g=c.componentLabels}=t;return{type:"internal",quantityType:at[i],numericType:st[r],encoding:n,name:o,unit:s,quantityName:l,componentLabels:g,sparseSampling:a,description:t.description||"",application:t.application||"",components:c.components,dataLength:c.dataLength}}function Ur(e){return v(e.re)&&v(e.im)}function Wr(e){return!v(e.re[0])}function ge(e,r,t){let i=[],n=[],o=[];if(Ur(e))if(Wr(e)){i[0]=de(r[0],t[0],e.re.length);let s=new Float64Array(i[0]);for(let l=0;l<i[0];l+=2){let a=l+r[0]*2;s[l]=e.re[a/2],s[l+1]=e.im[a/2]}o.push(s),n.push("complex")}else if(v(e.re[0])){i[0]=Jr(r[1],t[1],e.re.length),i[1]=de(r[0],t[0],e.re[0].length);for(let s=0;s<i[0];s++){let l=new Float64Array(i[1]);for(let a=0;a<i[1];a+=2){let m=a+r[0]*2;l[a]=e.re[s][m/2],l[a+1]=e.im[s][m/2]}o.push(l)}}else throw new Error("check your object");else if(v(e.re.re)){i[0]=de(r[1],t[1],e.re.re.length);let s=ge(e.re,r,t).components,l=ge(e.im,r,t).components;for(let a=0;a<i[0]/2;a++)o.push(s[a],l[a])}else throw new Error("check the dimension or the type of data in your array");return{dataLength:i,componentLabels:n,components:o}}function Jr(e,r,t){return r-e+1<t?r-e+1:t}function de(e,r,t){return r-e+1<t?(r-e+1)*2:t*2}async function lt(e,r={}){let t=await e.arrayBuffer(),{name:i=k(e.name),keepSource:n=!1}=r,o={spectra:[],molecules:[]},l=en(t)[0],{metadata:a,...m}=l.description,u=0,c=m.dimension===1?"1d":"2d",g="NMR SPECTRUM",y=m.dimension===1?m.nucleus[0]:m.nucleus,d=m.spectralWidthClipped[0],p;l.dependentVariables&&(m.dimension===1?p=Zr(l):m.dimension===2&&(p=Qr(l)));for(let F in m)Array.isArray(m[F])&&m[F].length===1&&(m[F]=m[F][0]);let f={data:p,info:{...m,acquisitionMode:u,experiment:c,type:g,nucleus:y,spectralWidthClipped:d,name:i},meta:a};return n&&(f.sourceSelector={files:[e.relativePath]}),o.spectra=[f],Vr(o)}function Zr(e){let r=e.dimensions[0],t=e.dependentVariables,i=r.quantityName,n=r.count,o=r.increment.magnitude,s=r.originOffset.magnitude,l=r.coordinatesOffset.magnitude,a=t[0].components[0],m=new Float64Array(n),u=new Float64Array(n);for(let p=a.length-1,f=0;p>0;p-=2)m[f]=a[p-1],u[f++]=a[p];let c={},[g,y]=[0,0];switch(i){case"frequency":y=0+l/s*1e6,g=o/s*1e6,c.re=m,c.im=u;break;case"time":y=s,g=o,c.re=m.reverse(),c.im=u.reverse().map(p=>-p);break;default:break}let d=[];for(let p=0;p<n;p++)d.push(y+p*g);return c.x=d,c}function Qr(e){let r=e.dimensions,t=e.dependentVariables,i=r[0].quantityName,n=[],o=[],s=Number.MIN_SAFE_INTEGER,l=Number.MAX_SAFE_INTEGER,a=Number.MAX_SAFE_INTEGER,m=Number.MIN_SAFE_INTEGER;for(let g of t[0].components){let y=new Float64Array(g.length/2),d=new Float64Array(g.length/2);for(let p=g.length-1,f=0;p>0;p-=2){let F=g[p-1],h=g[p];F>s&&(s=F),F<l&&(l=F),h>m&&(m=h),h<a&&(a=h),y[f]=F,d[f++]=h}if(i==="frequency")n.push(y),o.push(d);else{let p=y.length,f=new Float64Array(d.length);for(let F=0,h=p-1;F<p;F++)f[F]=-d[h--];n.push(y.reverse()),o.push(f)}}let u={re:{z:n,minZ:l,maxZ:s},im:{z:o,minZ:a,maxZ:m}},c=["X","Y"];for(let g=0;g<c.length;g++){let y=r[g].count,d=r[g].increment.magnitude,p=r[g].originOffset.magnitude,f=r[g].coordinatesOffset.magnitude,F=c[g];for(let h of["re","im"])i==="frequency"?(u[h][`min${F}`]=0+f/p*1e6,u[h][`max${F}`]=y*(d/p)*1e6):(u[h][`min${F}`]=p,u[h][`max${F}`]=y*d)}return u}function en(e){let r=Yr(e),t=r.info,i=r.headers,n=r.parameters,{dimension:o}=t,s={};for(let f of n.paramArray){let{name:F,value:h}=f;s[F]=ut(h,o)}delete n.paramArray;let l=r.data,a={};a.title=`title: ${i.title} / comment: ${i.comment} / author:${i.author} / site: ${i.site}`,a.nucleus=t.nucleus.map(Kr),a.sampleName=t.sampleName,a.date=t.date,a.epoch=t.epoch,a.localeDate=new Date(_r(t.epoch)).toLocaleString(),a.author=t.author,a.solvent=t.solvent,a.temperature=t.temperature.magnitude,a.probeName=t.probeName||"",a.fieldStrength=t.fieldStrength.magnitude;let m=a.nucleus.map(Hr);a.baseFrequency=m.map(f=>t.fieldStrength.magnitude*f/(2*Math.PI*1e6)),a.pulseSequence=t.experiment,a.temperature=t.temperature?.unit?.toLowerCase()==="celsius"?273.15+t.temperature.magnitude:t.temperature.magnitude,a.digitalFilter=t.digitalFilter,a.pulseStrength90=1/(4*t.pulseStrength90.magnitude),a.numberOfScans=t.numberOfScans,a.relaxationTime=t.relaxationTime.magnitude,a.isComplex=t.dataSections.includes("im"),a.isFid=t.dataUnits[0]==="Second",a.isFt=t.dataUnits[0]==="Ppm",a.dimension=t.dimension,a.originFrequency=t.originFrequency.map(f=>f.magnitude/1e6).slice(0,o),a.numberOfPoints=t.dataPoints.slice(0,1),a.frequencyOffset=t.frequencyOffset.map((f,F)=>f.magnitude*a.baseFrequency[F]).slice(0,o),a.acquisitionTime=t.acquisitionTime.map(f=>f.magnitude).slice(0,o),a.spectralWidth=t.spectralWidth.map((f,F)=>f.magnitude/t.originFrequency[F].magnitude*1e6).slice(0,o),a.spectralWidthClipped=t.spectralWidthClipped.map((f,F)=>f.magnitude/a.baseFrequency[F]*1e6).slice(0,o);let u=[],c={},g;for(let f=0;f<t.dimension;f++){if(g={magnitude:t.acquisitionTime[f].magnitude/(t.dataPoints[f]-1),unit:"s"},t.dataUnits[f]==="Second")c.quantityName="time",c.originOffset={magnitude:0,unit:"s"},f===0?c.coordinatesOffset={magnitude:t.digitalFilter*g.magnitude,unit:"s"}:c.coordinatesOffset={magnitude:0,unit:"s"},c.reciprocal={originOffset:{magnitude:t.originFrequency[f].magnitude,unit:"Hz"},quantityName:"frequency",coordinatesOffset:{magnitude:t.frequencyOffset[f].magnitude*t.originFrequency[f].magnitude/1e6,unit:"Hz"}};else if(t.dataUnits[f]==="Ppm"){c.quantityName="frequency";let F=t.originFrequency[f].magnitude;c.originOffset={magnitude:F,unit:"Hz"};let h=t.dataOffsetStart[f],P=t.dataOffsetStop[f]-h+1;g={magnitude:tn(t,f)/(P-1),unit:"Hz"};let D=t.dataAxisStop[f]*F/1e6;c.coordinatesOffset={magnitude:D,unit:"Hz"},P!==t.dataPoints[f]&&(t.dataPoints[f]=P)}f===0?c.description="direct dimension":c.description="indirect dimension",u.push({label:String(i.dataAxisTitles[f]),count:Number(t.dataPoints[f]),increment:g,type:"linear",description:String(c.description)||"",application:c.application||{},coordinatesOffset:c.coordinatesOffset||0,originOffset:c.originOffset||0,quantityName:String(c.quantityName)||"",reciprocal:c.reciprocal||{},period:c.period||0,complexFFT:c.complexFFT||!1})}let y=[];y.push(ct(l,11,{unit:"none",quantityName:"relative intensity",from:t.dataOffsetStart,to:t.dataOffsetStop}));let d={...a};return delete d.paramList,d.metadata={...mt(i,o),...mt(n,o),...Gr({},s)},[{timeStamp:Date.now(),description:d,dimensions:u,dependentVariables:y}]}function tn(e,r){let{spectralWidth:t,spectralWidthClipped:i}=e;return i[r].magnitude!=="NA"?i[r].magnitude:t[r].magnitude}function mt(e,r){let t={};for(let i in e)t[i]=ut(e[i],r);return t}function ut(e,r){return Xr(e)?r>1?e.slice(0,r):e[0]:e}var ee=class{id="nmrium-core-plugins#JDFLoaderPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={supportedExtensions:["jdf"],onFile:this.onReadProcessFile.bind(this)}}onReadProcessFile(r,t={}){let{logger:i,keepSource:n}=t;return i?.debug(`Reading JDF file: ${r.name}`),lt(r,{name:r.name,keepSource:n,logger:i})}};function ye(){return new ee}var te=class{id="nmrium-core-plugins#MolfileLoaderPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={supportedExtensions:["mol"],onFile:this.onReadProcessFile.bind(this)}}onReadProcessFile(r,t={}){let{logger:i}=t;return i?.debug(`Reading molfile file: ${r.name}`),je(r,{logger:i})}};function he(){return new te}import{getSDF as cn,nmrRecordToJSON as mn}from"nmredata";import{generateID as dt}from"@zakodium/nmrium-core";import{generateID as pt}from"@zakodium/nmrium-core";import{xyIntegration as rn}from"ml-spectra-processing";function ft(e,r){let{x:t,re:i}=r.data;return e.map(n=>{let o=rn({x:t,y:i},{from:n.from,to:n.to}),s=[];for(let l of n.signals||[]){let{kind:a=null,id:m,js:u=[],diaIDs:c=[],...g}=l;s.push({...g,kind:a||"signal",js:u,id:m||pt(),diaIDs:c})}return{...n,id:n.id||pt(),kind:s?.[0].kind||"signal",absolute:o,signals:s}})}function gt(e,r){let t=[],{baseFrequency:i=500}=r.info;for(let n of e){let{delta:o,diaIDs:s=[],multiplicity:l="",integration:a=0}=n,m=n.jCoupling||[],u=nn({delta:o,js:m,frequency:i});if(m&&l&&m.length===l.length){m.sort((c,g)=>g.coupling-c.coupling);for(let c=0;c<m.length;c++)m[c].multiplicity=l[c]}t.push({id:dt(),...u,integration:a,signals:[{id:dt(),js:m,delta:o,diaIDs:s,multiplicity:l}]})}r.ranges.values=ft(w(t),r)}function nn(e){let{delta:r,js:t=[],frequency:i}=e,n=.5;for(let o of t)n+=o.coupling;return n/=i,{from:r-n,to:r+n}}import{generateID as yt}from"@zakodium/nmrium-core";var on=["x","y"],sn={x:0,y:0};function ht(e,r,t={}){let i=[],{shift:n=sn}=t,{originFrequency:o=[400,400]}=r.info,s={x:o[0],y:o[1]};for(let l of e){let a={x:{},y:{},id:yt(),kind:"signal"},m={id:yt(),kind:"signal",peaks:[]},u={x:10,y:10};for(let c of on){let{coupling:g=[],delta:y,diaIDs:d=[]}=l[c];for(let p of g)u[c]+=p.coupling;if(l.activeCoupling){let{activeCoupling:p=[]}=l;for(let f of p)u[c]+=f.coupling}u[c]/=s[c],a[c]={from:y-u[c],to:y+u[c]},m[c]={delta:y,diaIDs:d,originalDelta:y-n[c]}}i.push({...a,signals:[m]})}r.zones.values=i}function bt(e){return an(e.data)}function an(e){return"rr"in e||!("x"in e)&&"re"in e}async function Ft(e,r,t={}){let i={spectra:[],molecules:[]},n=await ln(e,r,t);if(n.spectra.length>0){let{spectra:o,molecules:s,usedFiles:l}=n;i.spectra.push(...o),i.molecules.push(...s);let a=e.files.length;for(let m=a-1;m>=0;m--){let u=e.files[m].relativePath;!u.match(/acqu.*/s)&&l.includes(u)&&e.files.splice(m,1)}}return i}async function ln(e,r,t){let i=[],n=await cn(e),o={spectra:[],molecules:[]};if(n.length===0)return{...o,usedFiles:i};let s=[];for(let a of n){let m=mn({sdf:a,fileCollection:e}).then(u=>{let{spectra:c,molecules:g=[]}=u;return i.push(a.root+a.filename),o.molecules.push(...g),un(c,r,t)});s.push(m)}let l=await Promise.allSettled(s);for(let a of l)a.status==="fulfilled"?(o.spectra.push(...a.value.spectra),i.push(...a.value.usedFiles)):a.reason&&t?.logger?.error(a.reason);return{...o,usedFiles:i}}async function un(e,r,t){let i=[],n=[],o={spectra:[],molecules:[]};for(let s of e){let l=pn(s.source,r,t).then(a=>{let{spectra:m,files:u}=a;i.push(...u);for(let c of m)bt(c)?ht(s.signals,c):gt(s.signals,c);o.spectra.push(...m)});n.push(l)}return await Promise.allSettled(n),{...o,usedFiles:i}}async function pn(e,r,t={}){let{file:i,jcampURL:n}=e,{converter:o}=t;if(n){let a=await fn(n,r,o?.jcamp);if(a)return{...a,files:[]}}let s=[];for(let a of i||[])s.push(dn(a,t).then(m=>({...m,files:a.fileCollection.files.map(u=>u.relativePath)})));let l=await Promise.allSettled(s);for(let a of l){if(a.status==="fulfilled")return a.value;a.reason&&t?.logger?.error(a.reason)}return{spectra:[],molecules:[],files:[]}}async function fn(e,r,t={}){let i={entries:[{relativePath:e}]},n={name:k(e||""),xy:!0,noContours:!0,...t},{data:o}=await r.readFromWebSource(i,n);return o}async function dn(e,r={}){let{converter:t,sourceSelector:i}=r;switch(e.type){case"jcamp":return Z(e.fileCollection.files[0],{name:e?.fileCollection.files[0].name||"",converter:t?.jcamp,selector:i?.jcamp,logger:r.logger,keepSource:r.keepSource});case"brukerFiles":return Y(e.fileCollection,{converter:t?.bruker,selector:i});default:throw new Error("There is not a supported source")}}var re=class{constructor(r){this.core=r;this.onReadProcess={onFiles:this.onReadProcessFiles}}id="nmrium-core-plugins#NMReLoaderPlugin";version=1;migrations=[];onReadProcess;onReadProcessFiles=(r,t)=>Ft(r,this.core,t)};function be(e){return new re(e)}import{Filters1D as Pn,Filters2D as Sn}from"nmr-processing";import{getOneIfArray as Nt}from"@zakodium/nmrium-core";var gn=["no","exponential","modifiedGaussian","sine","qsine","trap","user","sinc","qsinc","traf","trafs"];function yn(e){return e in Pt}function Fe(e,r){let{prefix:t="",index:i=0}=r,n=Nt(e[`${t}WDW`],i),o=gn[n?Number(n):0],s={};if(!yn(o))return s;let l=Pt[o];if(l){let{kind:a,parameters:m}=l,u={};for(let c in m){let g=m[c],{source:y,processor:d}=g;if(y){let p=Nt(e[`${t}${y}`],i);if(!p)continue;let f=Number(p);u[c]=d?d(f):f}else g.value!==void 0&&(u[c]=g.value)}s[a]={apply:!0,options:u}}return s}var Pt={exponential:{kind:"exponential",parameters:{lineBroadening:{source:"LB"}}},modifiedGaussian:{kind:"gaussian",parameters:{lineBroadening:{source:"LB"},lineBroadeningCenter:{source:"GB"}}},sine:{kind:"sineBell",parameters:{offset:{source:"SSB",processor:e=>1/e},exponent:{value:1}}},qsine:{kind:"sineSquare",parameters:{offset:{source:"SSB",processor:e=>1/e}}},traf:{kind:"traf",parameters:{lineBroadening:{source:"LB"}}}};var St={sineBell:Dt({offset:0})},Rt={cosy:{...St},hmbc:{...St},hsqc:{sineBell:Dt({offset:.5})}},hn={...Rt};function Ne(e="",r=1){let t=bn(e),i={},n=r===1?Rt[t||""]:hn[t||""];return n&&(i=structuredClone(n)),i}function Dt(e){return{apply:!0,options:e}}function bn(e){let t=e.toLowerCase().match(/cosy|hsqc|hmbc/);return t?t[0]:null}function Mt(e,r={}){let{prefix:t="",experiment:i=_(e)}=r;return e[`${t}WDW`]?{f2:Fe(e,{...r,index:0}),f1:Fe(e,{...r,index:1})}:{f2:Ne(i,1),f1:Ne(i,2)}}import{Filters1D as Fn}from"nmr-processing";var Pe=["digitalFilter","backwardLinearPrediction","forwardLinearPrediction","apodization","zeroFilling","fft",["shiftX","phaseCorrection","baselineCorrection"]],q={};for(let e=0;e<Pe.length;e++){let r=Pe[e];for(let t of Array.isArray(r)?r:[r])q[t]=e}for(let e of Object.values(Fn))e.name in q||(q[e.name]=Pe.length);import{Filters2D as Nn}from"nmr-processing";var Se=["digitalFilter2D","blpDimension1","flpDimension1","apodizationDimension1","zeroFillingDimension1","fftDimension1","blpDimension2","flpDimension2","nusDimension2","apodizationDimension2","zeroFillingDimension2","fftDimension2","phaseCorrectionTwoDimensions",["shift2DX","shift2DY","symmetrizeCosyLike"]],$={};for(let e=0;e<Se.length;e++){let r=Se[e];for(let t of Array.isArray(r)?r:[r])$[t]=e}for(let e of Object.values(Nn))e.name in $||($[e.name]=Se.length);var Rn=new Set(["backwardLinearPrediction","forwardLinearPrediction","digitalFilter2D","phaseCorrectionTwoDimensions","blpDimension1","flpDimension1","apodizationDimension1","apodizationDimension2","zeroFillingDimension1","fftDimension1","blpDimension2","flpDimension2","zeroFillingDimension2","fftDimension2","nusDimension2","symmetrizeCosyLike"]);function Dn(e,r){let{filter:t,experimentalFeatures:i=!1}=r,{name:n}=t;({...Pn,...Sn})[n]&&(e.some(s=>s.name===n)||(i||!Rn.has(n))&&e.push({...t,enabled:!0}))}function xt(e,r={}){let{data:t}=e;if(!t)return e;let{autoProcessing:i,experimentalFeatures:n}=r,o=(l,a)=>Dn(l,{...a,experimentalFeatures:n}),{spectra:s}=t;for(let l of s){let{data:a,info:m,meta:u,filters:c}=l,{dimension:g,isFid:y}=m;if(y){if(g===1){let d=a.re.length,{tdOff:p,digitalFilter:f}=m;if(f&&f>0&&o(c,{filter:{name:"digitalFilter",value:{digitalFilterValue:f}}}),!i)continue;p&&Math.abs(p)>0&&o(c,{filter:{name:"backwardLinearPrediction",value:{nbInputs:d/2}}}),o(c,{filter:{name:"apodization",value:{exponential:{apply:!0,options:{lineBroadening:1}}}}}),o(c,{filter:{name:"zeroFilling",value:{nbPoints:2*d}}}),o(c,{filter:{name:"fft",value:{}}}),o(c,{filter:{name:"phaseCorrection",value:Mn(m)}}),c.sort((F,h)=>q[F.name]-q[h.name])}else if(g===2){if(!i||!n)continue;let d=a.re.z.length,p=a.re.z[0].length,{tdOff:f,experiment:F=""}=m,h=m.spectrumSize;Array.isArray(h)&&h.length>1?(h[0]<=p&&(h[0]=p*2),h[0]<=d&&(h[0]=d*2)):h=[p*2,2*d];let b=F.toLowerCase().includes("cosy");f&&Math.abs(f[0])>0&&o(c,{filter:{name:"blpDimension1",value:{nbInputs:p/2}}});let P=Mt(u,{experiment:F});o(c,{filter:{name:"apodizationDimension1",value:P.f2}}),o(c,{filter:{name:"zeroFillingDimension1",value:{nbPoints:h[0]}}}),o(c,{filter:{name:"fftDimension1",value:{}}}),u&&"nuslist"in u&&o(c,{filter:{name:"nusDimension2",value:{}}}),o(c,{filter:{name:"apodizationDimension2",value:P.f1}}),o(c,{filter:{name:"zeroFillingDimension2",value:{nbPoints:h[b?0:1]}}}),b?o(c,{filter:{name:"symmetrizeCosyLike",value:{}}}):o(c,{filter:{name:"phaseCorrectionTwoDimensions",value:{}}}),o(c,{filter:{name:"fftDimension2",value:{}}}),c.sort((R,S)=>$[R.name]-$[S.name])}}}}function Mn(e){let{phc0:r=0,phc1:t=0}=e;return At([r,t])?{}:{ph0:r,ph1:t}}function At(e){return Array.isArray(e)?e.every(r=>!r&&r===0):At([e])}var ne=class{id="nmrium-core-plugins#NmriumPostProcessingPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={onProcessing:this.onPostProcessing.bind(this)}}onPostProcessing(r,t){xt(r,t)}};function Re(){return new ne}import{parse as xn}from"sdf-parser";function Ot(e,r={}){let{mixedEOL:t}=r,{molecules:i}=xn(e,{mixedEOL:t}),n=[];for(let{molfile:o}of i){let s=L(o);n.push(...s)}return n}async function Ct(e,r={}){let{logger:t,mixedEOL:i}=r,n=await e.text(),o=Ot(n,{mixedEOL:i}),s={molecules:o,spectra:[]};return t&&t[o.length>0?"info":"debug"](`Loaded ${s.molecules.length} molecules from the ${e.name} file`),s}var ie=class{id="nmrium-core-plugins#SDFLoaderPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={supportedExtensions:["sdf"],onFile:this.onReadProcessFile.bind(this)}}onReadProcessFile(r,t={}){let{logger:i}=t;return i?.debug(`Reading sdf file: ${r.name}`),Ct(r,{logger:i})}};function De(){return new ie}import{Molecule as An}from"openchemlib/full";function It(e){let r=[],t=e.split(/\r?\n/).filter(Boolean);for(let i of t){let o=An.fromSmiles(i).toMolfile();r.push({molfile:o})}return r}async function Et(e,r={}){let t=await e.text(),i=It(t),n={molecules:i,spectra:[]};return r.logger?.info(`Found ${i.length} molecules from the ${e.name} file`),n}var oe=class{id="nmrium-core-plugins#SmilesLoaderPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={supportedExtensions:["smi","smiles"],onFile:this.onReadProcessFile.bind(this)}}onReadProcessFile(r,t={}){let{logger:i}=t;return Et(r,{logger:i})}};function Me(){return new oe}import{formatSpectra as In}from"@zakodium/nmrium-core";import{FileCollection as En}from"filelist-utils";import{isAnyArray as Tn}from"is-any-array";import{xMultiply as Ln}from"ml-spectra-processing";import{convert1D as kn}from"varian-converter";import{normalizeNucleus as On}from"nmr-processing";function Tt(e,r){let{meta:t,procpar:i}=e,n={};for(let h of i)n[h.name]=h.values;let o={},s={},{np:l,solvent:a,sfrq:m,reffrq:u,temp:c,rp:g,sw:y,rfl:d,rfp:p}=n;N(o,"numberOfPoints",l&&Number(C(l))/2),N(o,"solvent",C(a)),N(o,"originFrequency",C(m)),N(o,"baseFrequency",C(u)),(Number.isNaN(o.originFrequency)||o.originFrequency===0)&&(o.originFrequency=400,r?.warn("The frequency could not be determined and was set to 400MHz")),N(o,"temperature",C(c)),N(o,"phc0",g&&Number(g[0])),N(s,"rfl",d&&Number(C(d))),N(s,"rfp",p&&Number(C(p))),N(s,"sw",y&&Number(C(y)));for(let h in s){let b=s[h];Array.isArray(b)&&b.length===1&&(s[h]=b[0])}if(!("baseFrequency"in o)&&"originFrequency"in o){let h=Number.parseFloat(o.originFrequency);if(["sw","rfl","rfp"].every(b=>b in s)){let{sw:b=1,rfl:P=1,rfp:R=1}=Cn(s,["sw","rfl","rfp"]);N(o,"baseFrequency",h-(b/2-P+R)/1e6)}else N(o,"baseFrequency",h)}let{baseFrequency:f,originFrequency:F}=o;N(o,"frequencyOffset",(F-f)*1e6),N(o,"spectralWidth",y&&Number(y[0])/o.baseFrequency);for(let h in o)o[h].length===1&&(o[h]=o[h][0]);return n.tn&&(o.nucleus=n.tn.map(On)),o.dimension=1,o.isFid=!t.status.isSpectrum,{info:o,meta:{...s,...Lt(t),...n}}}function C(e){return e&&(Array.isArray(e)?e[0]:e)}function Cn(e,r){let t={};for(let i of r){let n=e[i];n&&typeof n=="number"&&(t[i]=n)}return t}function Lt(e){let r={};for(let t of Object.keys(e)){let i=e[t];typeof i=="object"&&i!==null&&i.constructor&&i.constructor!==Object?r[t]=Lt(i):r[t]=i}return r}function kt(e){let r={},t=new Set(e.files.map(i=>i.relativePath));for(let i of e){let n=i.name.toLowerCase();if(n.match(/^(?:fid|procpar|text|log)$/)){if(n.match(/^(?:fid|text|log)$/)){let l=i.relativePath.replace(/(?:fid|text|log)$/,"procpar");if(!t.has(l))continue}let o=i.relativePath.split("/"),s=o.slice(0,-1).join("/");r[s]||(r[s]={name:o.at(-2),files:[]}),r[s].files.push(i)}}return Object.values(r)}async function wt(e,r={}){let{keepSource:t,logger:i}=r,n=kt(e);i&&i.debug(`Found ${Object.keys(n).length} varian experiments`);let o=[],s={spectra:[],molecules:[]};for(let a of n){let{name:m,files:u}=a,c=new En(u),g=kn(c).then(y=>{let{info:d,meta:p}=Tt(y),f=y.fid.data[0],F=Tn(f.im),h={data:{...f,x:y.x},meta:p,info:{isComplex:F,name:m,...d},display:{name:m}};if(d.isFid&&F){let{im:b}=h.data;Ln(b,-1,{output:b})}u&&t&&(h.sourceSelector={files:u.map(b=>b.relativePath)}),s.spectra.push(h)});o.push(g)}let l=await Promise.allSettled(o);for(let a=0;a<l.length;a++){let m=l[a];if(m.status==="rejected"&&m.reason){let u=n[a].name;i?.warn(`Varian data: ${u}, fails with: ${m.reason}`)}}return s.spectra.length>0&&i?.info(`Loaded ${s.spectra.length} spectra from Varian files`),In(s)}var se=class{id="nmrium-core-plugins#VarianLoaderPlugin";version=1;migrations=[];onReadProcess;constructor(){this.onReadProcess={onFiles:this.onReadProcessFiles}}onReadProcessFiles=(r,t)=>{let{keepSource:i,logger:n}=t??{};return wt(r,{keepSource:i,logger:n})}};function xe(){return new se}function vn(e,r=[]){return[be(e),xe(),me(),fe(),he(),De(),Me(),ye(),Re()].concat(r)}function qn(){let e=new wn;return e.registerPlugins(vn(e)),e}import{getOneIfArray as qt}from"@zakodium/nmrium-core";import{from1DNMRVariables as $n}from"convert-to-jcamp";function vt(e,r){return e.filters.find(t=>t.name===r)}function jn(e,r={}){let{info:t,meta:i,data:n}=e,{onlyReal:o=!1}=r,{isFid:s,spectralWidth:l}=t,a=qt(t.baseFrequency||t.originFrequency),{x:m,re:u,im:c}=n,g=new Float64Array(u),y=!o&&c?new Float64Array(c):void 0,d={};z(d,"SW",l),z(d,"BF1",a);let p=vt(e,"fft")?.enabled,f={originFrequency:t.originFrequency,dataType:!t.isFid||p?"NMR SPECTRUM":"NMR FID",dataClass:!o&&c?"NTUPLES":"XYDATA"};if(s){let b=e.filters.find(P=>P.name==="digitalFilter");if(b&&!p){let{value:{digitalFilterValue:P},enabled:R}=b;if(R){let S=Math.floor(P);g.set(u.slice(u.length-S)),g.set(u.slice(0,u.length-S),S),c&&y&&(y.set(c.slice(c.length-S)),y.set(c.slice(0,c.length-S),S))}}z(f,"decim",t.decim),z(f,"dspfvs",t.dspfvs),z(f,"digitalFilter",t.digitalFilter)}let F={xyEncoding:"DIFDUP",info:{...t,...f},meta:{...i,...d}},h={x:{data:m,label:t.isFid?"TIME":"FREQUENCY",units:t.isFid?"second":"HZ",symbol:"X"},r:{data:g,label:`${t.isFid?"FID":"SPECTRUM"}/REAL`,units:"ARBITRARY UNITS",symbol:"R"}};return y&&(h.i={data:y,label:`${t.isFid?"FID":"SPECTRUM"}/IMAG`,units:"ARBITRARY UNITS",symbol:"I"}),$n(h,F)}function z(e,r,t){t!==void 0&&(e[r]=qt(t))}export{G as BrukerLoaderPlugin,ee as JDFLoaderPlugin,Q as JcampLoaderPlugin,te as MolfileLoaderPlugin,re as NMReLoaderPlugin,ie as SDFLoaderPlugin,oe as SmilesLoaderPlugin,se as VarianLoaderPlugin,me as brukerLoader,qn as default,qn as init,fe as jcampLoader,ye as jdfLoader,he as molfileLoader,be as nmreLoader,ot as processJcamp,Ot as readSDF,It as readSMILES,vn as recommended,De as sdfLoader,Me as smilesLoader,jn as spectrum1DToJcamp,xe as varianLoader};
|
package/package.json
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zakodium/nmrium-core-plugins",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Recommended plugins for NMRium, loaders of common formats like bruker or jcamp, and some post-processing plugins",
|
|
5
|
+
"author": "",
|
|
6
|
+
"license": "CC-BY-NC-SA-4.0",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/nmrium-core-plugins.d.ts",
|
|
11
|
+
"require": "./dist/nmrium-core-plugins.cjs",
|
|
12
|
+
"default": "./dist/nmrium-core-plugins.mjs"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist/nmrium-core-plugins.d.ts",
|
|
17
|
+
"dist/nmrium-core-plugins.cjs",
|
|
18
|
+
"dist/nmrium-core-plugins.mjs"
|
|
19
|
+
],
|
|
20
|
+
"imports": {
|
|
21
|
+
"#assets": "./src/assets.js"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"api-extractor": "api-extractor run --local",
|
|
25
|
+
"bundle": "npm run bundle-cjs && npm run bundle-esm && npm run bundle-types",
|
|
26
|
+
"bundle-common": "esbuild src/index.ts --bundle --packages=external --minify",
|
|
27
|
+
"bundle-cjs": "npm run bundle-common -- --format=cjs --outfile=./dist/nmrium-core-plugins.cjs",
|
|
28
|
+
"bundle-esm": "npm run bundle-common -- --format=esm --outfile=./dist/nmrium-core-plugins.mjs",
|
|
29
|
+
"bundle-types": "npm run tsc && npm run api-extractor",
|
|
30
|
+
"check-types": "tsc --noEmit",
|
|
31
|
+
"clean": "rimraf types",
|
|
32
|
+
"eslint": "eslint src --cache",
|
|
33
|
+
"eslint-fix": "npm run eslint -- --fix",
|
|
34
|
+
"dev:eslint-fix": "eslint --cache --fix $(git diff --name-only --relative) --quiet",
|
|
35
|
+
"prepack": "npm run bundle && npm run bundle-types",
|
|
36
|
+
"prettier": "prettier --check src",
|
|
37
|
+
"prettier-write": "prettier --write src",
|
|
38
|
+
"dev:prettier-write": "prettier --write $(git diff --name-only --relative)",
|
|
39
|
+
"test": "npm run test-only && npm run eslint && npm run prettier && npm run check-types",
|
|
40
|
+
"test-only": "vitest run --coverage",
|
|
41
|
+
"tsc": "tsc --project tsconfig.types.json"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@microsoft/api-extractor": "^7.52.1",
|
|
45
|
+
"@types/lodash.merge": "^4.6.9",
|
|
46
|
+
"@types/node": "^22.13.11",
|
|
47
|
+
"@vitest/coverage-istanbul": "^3.0.9",
|
|
48
|
+
"bruker-data-test": "^0.5.4",
|
|
49
|
+
"esbuild": "^0.25.1",
|
|
50
|
+
"eslint": "^9.22.0",
|
|
51
|
+
"eslint-config-cheminfo-typescript": "^18.0.0",
|
|
52
|
+
"fifo-logger": "^1.0.0",
|
|
53
|
+
"jcamp-data-test": "^0.8.3",
|
|
54
|
+
"jest-matcher-deep-close-to": "^3.0.2",
|
|
55
|
+
"msw": "^2.7.5",
|
|
56
|
+
"nmredata-data-test": "^0.4.0",
|
|
57
|
+
"prettier": "^3.5.3",
|
|
58
|
+
"rimraf": "^6.0.1",
|
|
59
|
+
"typescript": "^5.8.2",
|
|
60
|
+
"vitest": "^3.0.9"
|
|
61
|
+
},
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"@zakodium/nmrium-core": "^0.0.1",
|
|
64
|
+
"brukerconverter": "^8.0.3",
|
|
65
|
+
"convert-to-jcamp": "^5.4.11",
|
|
66
|
+
"filelist-utils": "^1.11.3",
|
|
67
|
+
"gyromagnetic-ratio": "^1.2.1",
|
|
68
|
+
"is-any-array": "^2.0.1",
|
|
69
|
+
"jcampconverter": "^11.0.1",
|
|
70
|
+
"jeol-data-test": "^0.5.2",
|
|
71
|
+
"jeolconverter": "^1.0.4",
|
|
72
|
+
"linear-sum-assignment": "^1.0.7",
|
|
73
|
+
"lodash.merge": "^4.6.2",
|
|
74
|
+
"ml-spectra-processing": "^14.11.0",
|
|
75
|
+
"nmr-processing": "^18.0.0",
|
|
76
|
+
"nmredata": "^1.0.0",
|
|
77
|
+
"openchemlib": "^8.19.0",
|
|
78
|
+
"openchemlib-utils": "^6.6.0",
|
|
79
|
+
"sdf-parser": "^7.0.4",
|
|
80
|
+
"varian-converter": "^2.0.1"
|
|
81
|
+
},
|
|
82
|
+
"volta": {
|
|
83
|
+
"extends": "../../../package.json"
|
|
84
|
+
}
|
|
85
|
+
}
|