@zakodium/nmrium-core-plugins 0.6.31 → 0.6.33
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/dist/nmrium-core-plugins.js +12 -12
- package/package.json +5 -5
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
var si=Object.defineProperty;var xt=(e,t)=>{for(var r in t)si(e,r,{get:t[r],enumerable:!0})};import{NMRiumCore as Fa}from"@zakodium/nmrium-core";import{defineNMRiumPlugin as xi}from"@zakodium/nmrium-core";import{nextPowerOfTwo as di}from"ml-spectra-processing";import{Filters1D as gi,Filters2D as yi}from"nmr-processing";import{getOneIfArray as ai}from"@zakodium/nmrium-core";function ce(e={},t={},r={}){e===null&&(e={}),typeof e=="string"&&(e={pulseSequence:e});let n=Array.isArray(e.pulseSequence)?e.pulseSequence[0]:e.pulseSequence||"";if(typeof n!="string")return e.dimension?`${e.dimension}d`:"";if(n=n.toLowerCase(),n.includes("zg")||n.includes("single_pulse_dec")||n.includes("udeft"))return"1d";if(n.includes("hsqct")||n.includes("invi")&&(n.includes("ml")||n.includes("di")))return"hsqctocsy";if(n.includes("hsqc")||n.includes("invi"))return"hsqc";if(n.includes("hmbc")||n.includes("inv4")&&n.includes("lp"))return"hmbc";if(n.includes("hmqc"))return"hmqc";if(n.includes("cosy"))return"cosy";if(n.includes("jres"))return"jres";if(n.includes("dosy"))return"dosy";if(n.includes("tocsy")||n.includes("mlev")||n.includes("dipsi"))return"tocsy";if(n.includes("noesy"))return"noesy";if(n.includes("roesy"))return"roesy";if(n.includes("dept"))return"dept";if(n.includes("jmod")||n.includes("apt"))return"aptjmod";if(n.includes("inad"))return"inadequate";if(n.includes("adeq"))return"adequate";let{prefix:i=""}=r,o=(ai(t[`${i}SPECTYP`])||"").replace(/^<(.*)>$/,"$1").toLowerCase();return o.length>0&&o!=="undefined"?o:e.dimension?`${e.dimension}d`:""}import{getOneIfArray as Dt}from"@zakodium/nmrium-core";var ci=["no","exponential","modifiedGaussian","sine","qsine","trap","user","sinc","qsinc","traf","trafs"];function li(e){return e in At}function qe(e,t){let{prefix:r="",index:n=0}=t,i=Dt(e[`${r}WDW`],n),o=ci[i?Number(i):0],s={};if(!li(o))return s;let a=At[o];if(a){let{kind:c,parameters:l}=a,m={};for(let u in l){let f=l[u],{source:g,processor:y}=f;if(g){let p=Dt(e[`${r}${g}`],n),h=Number.parseFloat(String(p));if(Number.isNaN(h))continue;m[u]=y?y(h):h}else f.value!==void 0&&(m[u]=f.value)}s[c]={apply:!0,options:m}}return s}var At={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:St},exponent:{value:1}}},qsine:{kind:"sineSquare",parameters:{offset:{source:"SSB",processor:St}}},traf:{kind:"traf",parameters:{lineBroadening:{source:"LB"}}}};function St(e){return e===0||e===1?0:1/e}var It={sineBell:Nt({offset:0})},Mt={cosy:{...It},hmbc:{...It},hsqc:{sineBell:Nt({offset:.5})}},mi={...Mt};function je(e="",t=1){let r=ui(e),n={},i=t===1?Mt[r||""]:mi[r||""];return i&&(n=structuredClone(i)),n}function Nt(e){return{apply:!0,options:e}}function ui(e){let r=e.toLowerCase().match(/cosy|hsqc|hmbc/);return r?r[0]:null}function Pt(e,t={}){let{prefix:r="",experiment:n=ce(e)}=t;return e[`${r}WDW`]?{f2:qe(e,{...t,index:0}),f1:qe(e,{...t,index:1})}:{f2:je(n,1),f1:je(n,2)}}import{Filters1D as pi}from"nmr-processing";var Be=["digitalFilter","backwardLinearPrediction","forwardLinearPrediction","apodization","zeroFilling","fft",["shiftX","phaseCorrection"],"trim","baselineCorrection"],W={};for(let e=0;e<Be.length;e++){let t=Be[e];for(let r of Array.isArray(t)?t:[t])W[r]=e}for(let e of Object.values(pi))e.name in W||(W[e.name]=Be.length);import{Filters2D as fi}from"nmr-processing";var Ue=["digitalFilter2D","blpDimension1","flpDimension1","apodizationDimension1","zeroFillingDimension1","fftDimension1","blpDimension2","flpDimension2","nusDimension2","apodizationDimension2","zeroFillingDimension2","fftDimension2","phaseCorrectionTwoDimensions",["shift2DX","shift2DY","symmetrizeCosyLike"]],X={};for(let e=0;e<Ue.length;e++){let t=Ue[e];for(let r of Array.isArray(t)?t:[t])X[r]=e}for(let e of Object.values(fi))e.name in X||(X[e.name]=Ue.length);var hi=new Set;function bi(e,t){let{filter:r,experimentalFeatures:n=!1}=t,{name:i}=r;({...gi,...yi})[i]&&(e.some(s=>s.name===i)||hi.has(i)&&!n||e.push({...r,enabled:!0}))}function Tt(e,t={}){let{data:r}=e;if(!r)return;let{autoProcessing:n,experimentalFeatures:i}=t,o=(a,c)=>bi(a,{...c,experimentalFeatures:i}),{spectra:s}=r;for(let a of s){let{data:c,info:l,meta:m,filters:u}=a,{dimension:f,isFid:g}=l;if(g){if(f===1){let y=c.re.length,{fileIdentifier:p}=m||{},{tdOff:h,digitalFilter:d}=l;if(d&&d>0&&o(u,{filter:{name:"digitalFilter",value:{digitalFilterValue:d}}}),!n)continue;p?.toLowerCase().includes("jeol")&&o(u,{filter:{name:"trim",value:{leftPercentage:10,rightPercentage:10}}}),h&&Math.abs(h)>0&&o(u,{filter:{name:"backwardLinearPrediction",value:{nbInputs:y/2}}}),o(u,{filter:{name:"apodization",value:{exponential:{apply:!0,options:{lineBroadening:1}}}}}),o(u,{filter:{name:"zeroFilling",value:{nbPoints:2*y}}}),o(u,{filter:{name:"fft",value:{}}}),o(u,{filter:{name:"phaseCorrection",value:Fi(l)}}),u.sort((b,F)=>W[b.name]-W[F.name])}else if(f===2){if(!n)continue;let y=c.re.z.length,p=c.re.z[0].length,{tdOff:h,experiment:d=""}=l,b=l.spectrumSize,{nuslist:F,NusTD:S}=m;Array.isArray(b)&&b.length>1?(F&&(b[1]=Math.max(di(S[1]),1024)),b[1]=Et(b[1],y),b[0]=Et(b[0],p)):b=[Math.max(p,1024),Math.max(y,1024)];let I=d.toLowerCase().includes("cosy");h&&Math.abs(h[0])>0&&o(u,{filter:{name:"blpDimension1",value:{nbInputs:p/2}}});let x=Pt(m,{experiment:d});o(u,{filter:{name:"apodizationDimension1",value:x.f2}}),o(u,{filter:{name:"zeroFillingDimension1",value:{nbPoints:b[0]}}}),o(u,{filter:{name:"fftDimension1",value:{}}}),m&&"nuslist"in m&&o(u,{filter:{name:"nusDimension2",value:{}}}),o(u,{filter:{name:"apodizationDimension2",value:x.f1}}),o(u,{filter:{name:"zeroFillingDimension2",value:{nbPoints:b[I?0:1]}}}),I&&o(u,{filter:{name:"symmetrizeCosyLike",value:{}}}),o(u,{filter:{name:"fftDimension2",value:{}}}),u.sort((A,M)=>X[A.name]-X[M.name])}}}}function Et(e,t,r=1024){return e<t?Math.max(t,r):e>t?Math.min(e,r):Math.max(t,r)}function Fi(e){let{phc0:t=0,phc1:r=0}=e;return Ot([t,r])?{}:{ph0:t,ph1:r}}function Ot(e){return Array.isArray(e)?e.every(t=>!t&&t===0):Ot([e])}function $e(){return xi({id:"@zakodium/nmrium-core-plugins#AutoPostProcessingPlugin",version:1,shouldSerialize:!0,migrations:[],onReadProcess:{onProcessing:Tt}})}import{defineNMRiumPlugin as Io}from"@zakodium/nmrium-core";import{FileCollection as $c}from"file-collection";var Ct=["acqus","acqu2s"],le=["procs","proc2s"];function Rt(e){return e.is1D?Di(e):e.is2D?Si(e):{checked:!1,message:"Multi-dimensional n > 2 is not supported"}}function Di(e){let t=e.isFID?["acqus"]:["acqus","procs"],r=t.every(n=>e[n]);return{checked:r,message:r?"":`File: ${e[e.isFID?"fid":"1r"]?.relativePath} is ignored, files: ${t.join(",")} are required.`}}function Si(e){let t=e.isFID?Ct:Ct.concat(le),r=t.every(n=>e[n]);return r&&e.isFID&&le.some(n=>e[n])&&!le.every(n=>e[n])&&(r=!1,t.push(...le)),{checked:r,message:r?"":`File: ${e.name} is ignored, files: ${t.join(",")} are required.`}}function ze(e,t={}){let{logger:r,processingNumbers:n,experimentNumbers:i,dataSelection:o="both",keep1D:s=!0,keep2D:a=!0,onlyFirstProcessedData:c=!0}=t,l={},m=e.files.map(g=>g.relativePath);for(let g of e){let y,p,h,d=g.relativePath.split("/"),b=d.indexOf("pdata");if(b!==-1)y=Number(d[b+1]),p=Number(d[b-1]),h=d.slice(0,-3).join("/");else if(Ii(g,m)){let S=d.indexOf(g.name);p=Number(d[S-1]),h=d.slice(0,-1).join("/")}else continue;if(Number.isNaN(p)&&(p=void 0),Number.isNaN(y)&&(y=void 0),i&&!i.includes(p))continue;l[h]||(l[h]={name:h,expno:p,processedData:{},fileCollectionItems:[]});let F=l[h];if(g.name==="vdlist"&&(F.vdlist=g),g.name==="difflist"&&(F.difflist=g),y){F.processedData||(F.processedData={}),F.processedData[y]||(F.processedData[y]={fileCollectionItems:[],name:h,expno:p,procno:y});let S=F.processedData[y];S.fileCollectionItems.push(g),g.name.match(/^(?:1r|1i|2rr|2ir|2ii|2ri|procs|proc2s|title|integrals.txt)$/)&&(S[g.name]=g),g.name==="2rr"&&(S.is2D=!0,S.isFT=!0),g.name==="1r"&&(S.is1D=!0,S.isFT=!0)}else F.fileCollectionItems.push(g),g.name.match(/^(?:ser|fid|acqus|acqu2s|nuslist)$/)&&(F[g.name]=g),g.name==="ser"&&(F.is2D=!0,F.isFID=!0),g.name==="fid"&&(F.is1D=!0,F.isFID=!0);g.name==="QuantFactorSample.xml"&&(F.quantFactorSample=g)}if(n)for(let g in l){let y=l[g].processedData,p={};for(let h in y)n.includes(Number.parseInt(h,10))&&(p[h]=y[h]);l[g].processedData=p}else if(c)for(let g in l){let y=l[g].processedData,p=Object.keys(y??{});p.sort((d,b)=>Number(d)-Number(b));let h=p[0];y&&h!==void 0&&(l[g].processedData={firstProcessedNumber:y[h]})}let u=Mi(r),f=[];for(let g in l){let y=l[g],{processedData:p,...h}=y;if(u(y,o)){let b=Object.keys(p??{});if(p&&b.length>0){let F=p[b[0]];F.procs&&(h.fileCollectionItems.push(F.procs),h.procs=F.procs),F.proc2s&&(h.fileCollectionItems.push(F.proc2s),h.proc2s=F.proc2s),F["integrals.txt"]&&(h.integrals=F["integrals.txt"])}f.push(h)}let d="ser"in h||"fid"in h;if(o==="fid"||o==="preferFID"&&d){r?.warn("Skipping FT data because it does not match the import filters");continue}for(let b in p){let F=p[b];(F["1r"]||F["2rr"])&&(h.acqus&&F.fileCollectionItems.push(h.acqus),h.acqu2s&&F.fileCollectionItems.push(h.acqu2s),h.vdlist&&(F.vdlist=h.vdlist),f.push({integrals:F["integrals.txt"],acqus:h.acqus,acqu2s:h.acqu2s,...F}))}}return s||(r?.warn("Skipping 1D data because it does not match the import filters"),f=f.filter(g=>!g.is1D)),a||(r?.warn("Skipping 2D data because it does not match the import filters"),f=f.filter(g=>!g.is2D)),Ai(f,t.logger)}function Ai(e,t){return e.filter(r=>{let{checked:n,message:i}=Rt(r);return n||t?.warn(i),n})}function Ii(e,t){return e.name.match(/^(?:ser|acqus|acqu2s|nuslist|vdlist|difflist|QuantFactorSample.xml)$/)||e.name.match(/^fid$/)&&t.includes(e.relativePath.replace(/fid$/,"acqus"))}function Mi(e){return(t,r)=>{let{processedData:n}=t,i=Object.keys(n??{}),o=n&&i.length>0&&["1r","1i","2rr"].some(m=>m in n[i[0]]),s="ser"in t||"fid"in t,l=s&&(r!=="ft"&&r!=="preferFT"||r==="preferFT"&&!o);return s&&!l&&e?.warn("Skipping RAW data because it does not match import filters"),l}}function me(e){if(e===void 0||Array.isArray(e)&&e.length===0)return{epoch:null,date:""};let t=e[0]*1e3;return{epoch:t,date:new Date(t).toUTCString()}}function ue(e,t){for(let r in t.meta)e.meta[r]===void 0&&(e.meta[r]=t.meta[r]);for(let r in t.info)e.info[r]===void 0&&(e.info[r]=t.info[r]);for(let r in e.meta)Array.isArray(e.meta[r])||(e.meta[r]=[e.meta[r]])}import{convert as Ni}from"jcampconverter";async function _(e,t){if(!e)return wt();let r=await e.text(),{keepRecordsRegExp:n=/.*/}=t,i=Ni(r,{keepRecordsRegExp:n});return i.flatten.length===0?wt():i.flatten[0]}function wt(){return{info:{},meta:{},tmp:{},spectra:[],ntuples:{}}}async function vt(e){let r=(await e.integrals?.text())?.split(/\r?\n/).slice(3).filter(Boolean)??[],n=[];for(let i=1;i<r.length;i++){let o=r[i].replace(/^\s*/,"").replaceAll(/[\s\t]+/g,";").match(/\d+;(?<from>[0-9.]+);(?<to>[0-9.]+);(?<integration>[0-9.]+)/)?.groups;if(o){let{from:s,to:a,integration:c}=o;n.push({from:Number.parseFloat(s),to:Number.parseFloat(a),integration:Number.parseFloat(c)})}}return n}function Je(e,t="utf8"){return new TextDecoder(t).decode(e)}var Pi=new TextEncoder;function Lt(e){return Pi.encode(e)}var Ei=1024*8,Ti=(()=>{let e=new Uint8Array(4),t=new Uint32Array(e.buffer);return!((t[0]=1)&e[0])})(),We={int8:globalThis.Int8Array,uint8:globalThis.Uint8Array,int16:globalThis.Int16Array,uint16:globalThis.Uint16Array,int32:globalThis.Int32Array,uint32:globalThis.Uint32Array,uint64:globalThis.BigUint64Array,int64:globalThis.BigInt64Array,float32:globalThis.Float32Array,float64:globalThis.Float64Array},R=class e{buffer;byteLength;byteOffset;length;offset;lastWrittenByte;littleEndian;_data;_mark;_marks;constructor(t=Ei,r={}){let n=!1;typeof t=="number"?t=new ArrayBuffer(t):(n=!0,this.lastWrittenByte=t.byteLength);let i=r.offset?r.offset>>>0:0,o=t.byteLength-i,s=i;(ArrayBuffer.isView(t)||t instanceof e)&&(t.byteLength!==t.buffer.byteLength&&(s=t.byteOffset+i),t=t.buffer),n?this.lastWrittenByte=o:this.lastWrittenByte=0,this.buffer=t,this.length=o,this.byteLength=o,this.byteOffset=s,this.offset=0,this.littleEndian=!0,this._data=new DataView(this.buffer,s,o),this._mark=0,this._marks=[]}available(t=1){return this.offset+t<=this.length}isLittleEndian(){return this.littleEndian}setLittleEndian(){return this.littleEndian=!0,this}isBigEndian(){return!this.littleEndian}setBigEndian(){return this.littleEndian=!1,this}skip(t=1){return this.offset+=t,this}back(t=1){return this.offset-=t,this}seek(t){return this.offset=t,this}mark(){return this._mark=this.offset,this}reset(){return this.offset=this._mark,this}pushMark(){return this._marks.push(this.offset),this}popMark(){let t=this._marks.pop();if(t===void 0)throw new Error("Mark stack empty");return this.seek(t),this}rewind(){return this.offset=0,this}ensureAvailable(t=1){if(!this.available(t)){let n=(this.offset+t)*2,i=new Uint8Array(n);i.set(new Uint8Array(this.buffer)),this.buffer=i.buffer,this.length=n,this.byteLength=n,this._data=new DataView(this.buffer)}return this}readBoolean(){return this.readUint8()!==0}readInt8(){return this._data.getInt8(this.offset++)}readUint8(){return this._data.getUint8(this.offset++)}readByte(){return this.readUint8()}readBytes(t=1){return this.readArray(t,"uint8")}readArray(t,r){let n=We[r].BYTES_PER_ELEMENT*t,i=this.byteOffset+this.offset,o=this.buffer.slice(i,i+n);if(this.littleEndian===Ti&&r!=="uint8"&&r!=="int8"){let a=new Uint8Array(this.buffer.slice(i,i+n));a.reverse();let c=new We[r](a.buffer);return this.offset+=n,c.reverse(),c}let s=new We[r](o);return this.offset+=n,s}readInt16(){let t=this._data.getInt16(this.offset,this.littleEndian);return this.offset+=2,t}readUint16(){let t=this._data.getUint16(this.offset,this.littleEndian);return this.offset+=2,t}readInt32(){let t=this._data.getInt32(this.offset,this.littleEndian);return this.offset+=4,t}readUint32(){let t=this._data.getUint32(this.offset,this.littleEndian);return this.offset+=4,t}readFloat32(){let t=this._data.getFloat32(this.offset,this.littleEndian);return this.offset+=4,t}readFloat64(){let t=this._data.getFloat64(this.offset,this.littleEndian);return this.offset+=8,t}readBigInt64(){let t=this._data.getBigInt64(this.offset,this.littleEndian);return this.offset+=8,t}readBigUint64(){let t=this._data.getBigUint64(this.offset,this.littleEndian);return this.offset+=8,t}readChar(){return String.fromCharCode(this.readInt8())}readChars(t=1){let r="";for(let n=0;n<t;n++)r+=this.readChar();return r}readUtf8(t=1){return Je(this.readBytes(t))}decodeText(t=1,r="utf8"){return Je(this.readBytes(t),r)}writeBoolean(t){return this.writeUint8(t?255:0),this}writeInt8(t){return this.ensureAvailable(1),this._data.setInt8(this.offset++,t),this._updateLastWrittenByte(),this}writeUint8(t){return this.ensureAvailable(1),this._data.setUint8(this.offset++,t),this._updateLastWrittenByte(),this}writeByte(t){return this.writeUint8(t)}writeBytes(t){this.ensureAvailable(t.length);for(let r=0;r<t.length;r++)this._data.setUint8(this.offset++,t[r]);return this._updateLastWrittenByte(),this}writeInt16(t){return this.ensureAvailable(2),this._data.setInt16(this.offset,t,this.littleEndian),this.offset+=2,this._updateLastWrittenByte(),this}writeUint16(t){return this.ensureAvailable(2),this._data.setUint16(this.offset,t,this.littleEndian),this.offset+=2,this._updateLastWrittenByte(),this}writeInt32(t){return this.ensureAvailable(4),this._data.setInt32(this.offset,t,this.littleEndian),this.offset+=4,this._updateLastWrittenByte(),this}writeUint32(t){return this.ensureAvailable(4),this._data.setUint32(this.offset,t,this.littleEndian),this.offset+=4,this._updateLastWrittenByte(),this}writeFloat32(t){return this.ensureAvailable(4),this._data.setFloat32(this.offset,t,this.littleEndian),this.offset+=4,this._updateLastWrittenByte(),this}writeFloat64(t){return this.ensureAvailable(8),this._data.setFloat64(this.offset,t,this.littleEndian),this.offset+=8,this._updateLastWrittenByte(),this}writeBigInt64(t){return this.ensureAvailable(8),this._data.setBigInt64(this.offset,t,this.littleEndian),this.offset+=8,this._updateLastWrittenByte(),this}writeBigUint64(t){return this.ensureAvailable(8),this._data.setBigUint64(this.offset,t,this.littleEndian),this.offset+=8,this._updateLastWrittenByte(),this}writeChar(t){return this.writeUint8(t.charCodeAt(0))}writeChars(t){for(let r=0;r<t.length;r++)this.writeUint8(t.charCodeAt(r));return this}writeUtf8(t){return this.writeBytes(Lt(t))}toArray(){return new Uint8Array(this.buffer,this.byteOffset,this.lastWrittenByte)}getWrittenByteLength(){return this.lastWrittenByte-this.byteOffset}_updateLastWrittenByte(){this.offset>this.lastWrittenByte&&(this.lastWrittenByte=this.offset)}};import{isAnyArray as Oi}from"is-any-array";import{matrixCreateEmpty as Ci,xSequentialFillFromStep as Ri}from"ml-spectra-processing";function kt(e){for(let t in e){let{z:r}=e[t],{minX:n,minY:i,maxX:o,maxY:s}=e[t];if(n>o){[n,o]=[o,n];for(let a of r)a.reverse()}i>s&&(r.reverse(),[i,s]=[s,i]),e[t]={...e[t],z:r,minX:n,minY:i,maxY:s,maxX:o}}}function pe(e,t){let{x:r,minMax:n,nbSubSpectra:i,template:o}=t;e.spectra||(e.spectra=[]);for(let s=0;s<i;s++){let a={};for(let c in n)a[c]=n[c].z[s];e.spectra.push({...o,data:{...a,x:r}})}}function de(e,t,r={}){let n={};for(let y in e)e[y]&&(n[y]=new R(e[y]));let i=fe(t.meta.SI),o=fe(t.meta.SW_p),s=fe(t.meta.SF),a=s,c=fe(t.shiftOffsetVal||t.meta.OFFSET);t.meta.observeFrequency=s,t.meta.brukerReference=a,t.meta.DATATYPE="NMR Spectrum";let l=Number.parseInt(t.meta.BYTORDP,10);l=l?0:1;let m=t.meta.nbSubSpectra||1;if(l)for(let y in n)n[y].setLittleEndian();else for(let y in n)n[y].setBigEndian();let u={dataType:"NMR Spectrum",nbPoints:i,firstX:c,lastX:c-o/s,xUnit:"PPM",yUnit:"Arbitrary",isXYdata:!0,isFT:!0,nucleus:t.meta.NUC1,observeFrequency:s,title:t.meta.TITLE,deltaX:-(o/s)/(i-1)},f=u.deltaX,g=Ri({from:c,step:f,size:i});if(m===1){let y={};for(let p in n){let h=n[p],d=new Float64Array(i);for(let b=0;b<i;++b)d[b]=h.readInt32();y[p]=d}t.spectra.push({...u,data:{...y,x:g}})}else{let{meta:y}=t,p=Number(y.SF[1]),h=Number(y.SW_p[1]||y.SW[1]),d=Number(y.OFFSET[1]),b=d-h/p,F={};for(let S in n)F[S]={minY:d,maxY:b,minX:g[0],maxX:g.at(-1),...wi(y,n[S])};kt(F),r.keepSpectra&&pe(t,{minMax:F,x:g,nbSubSpectra:m,template:u}),t.minMax=F}}function fe(e){return Number(Oi(e)?e[0]:e)}function wi(e,t){let r=e.SI.toReversed(),n=e.XDIM.toReversed(),i=r.map((g,y)=>Number.parseInt(String(g/n[y]),10)),[o,s]=r,[a,c]=n,l=Ci({nbRows:o,nbColumns:s}),[m,u]=[Number.MAX_SAFE_INTEGER,Number.MIN_SAFE_INTEGER],f=[];for(let g=0;g<i[0];g++)for(let y=0;y<i[1];y++){let p=y*c,h=g*a;f.push([h,p])}for(let[g,y]of f)for(let p=0;p<a;p++)for(let h=0;h<c;h++){let d=t.readInt32();m>d&&(m=d),u<d&&(u=d),l[p+g][h+y]=d}return{z:l,minZ:m,maxZ:u}}import{createStepArray as _i,xMinMaxValues as qi}from"ml-spectra-processing";var H={};xt(H,{DQD:()=>ki,QF:()=>vi,QSEQ:()=>V,QSIM:()=>Li});var vi=0,Li=1,V=2,ki=3;function ge(e,t,r){let n=Number.parseInt(t.meta.TD[0],10),i=new R(e),o=t.meta.nbSubSpectra||1,s=t.meta.AQ_mod,c=Number.parseInt(t.meta.DTYPA,10)===2,l=Number.parseFloat(t.meta.SW_h[0]),m=Number.parseFloat(t.meta.SFO1[0]);t.meta.DATATYPE="NMR FID";let u=1/(2*l),f=n*u,g=Number.parseInt(t.meta.BYTORDA,10);g=g?0:1,g?i.setLittleEndian():i.setBigEndian();let y=s===2?u:2*u,p=ji({nbSubSpectra:o,isFloat:c,aqMode:s,td:n}),h={dataType:"NMR FID",dataTable:"(X++(R..R))",nbPoints:p,firstX:0,lastX:f,nucleus:t.meta.NUC1,xUnit:"Sec",yUnit:"Arbitrary",isXYdata:!0,isFID:!0,observeFrequency:m,title:t.meta.TITLE,deltaX:y},d=_i({length:p,step:y});if(o<2){let b=qt(i,{nbPoints:p,isFloat:c,aqMode:s});t.spectra=[{data:{x:d,...b},...h}]}else{let b={minX:d[0],maxX:d.at(-1),minY:0,maxY:o,minZ:0,maxZ:0},F=s===2?{re:{z:[],...b}}:{re:{z:[],...b},im:{z:[],...b}},S={re:{min:Number.MAX_SAFE_INTEGER,max:Number.MIN_SAFE_INTEGER},im:{min:Number.MAX_SAFE_INTEGER,max:Number.MIN_SAFE_INTEGER}};for(let I=0;I<o;I++){let x=qt(i,{nbPoints:p,isFloat:c,aqMode:s});S.re=_t(x.re,S.re),S.im=_t(x.im??new Float64Array,S.im),F.re.z.push(x.re),F.im&&x.im&&F.im.z.push(x.im)}F.re={...F.re,minZ:S.re.min,maxZ:S.re.max},F.im={...F.im,minZ:S.im.min,maxZ:S.im.max},r.keepSpectra&&pe(t,{minMax:F,x:d,nbSubSpectra:o,template:h}),t.minMax=F}}function _t(e,t){let{min:r,max:n}=qi(e),{min:i,max:o}=t;return{min:Math.min(i,r),max:Math.max(o,n)}}function qt(e,t){let{nbPoints:r,isFloat:n,aqMode:i}=t,o={re:new Float64Array(r),im:null},s=n?"readFloat64":"readInt32";if(i===2)for(let a=0;a<r;a++)o.re[a]=e[s]();else{o.im=new Float64Array(r);for(let a=0;a<r;a++)o.re[a]=e[s](),o.im[a]=e[s]()}return o}function ji(e){let{nbSubSpectra:t,isFloat:r,aqMode:n,td:i}=e,o=i;if(t>1){let s=r?128:256;o=Math.trunc(Math.ceil(i/s)*s)}return n===2?o:o/2>>0}async function jt(e,t){let r={},n=[],i=e["1r"]||e["1i"]?["1r","1i"]:["fid"];function o(a,c){return a.then(l=>{r[c]=l})}for(let a of i){let c=e[a];c&&n.push(o(c.arrayBuffer(),a))}n.push(_(e.procs,t).then(a=>{r.procs=a}),_(e.acqus,t).then(a=>{r.acqus=a})),e.quantFactorSample&&n.push($i(e).then(a=>{r.ereticFactor=a})),e.integrals&&n.push(vt(e).then(a=>{r.integrals=a}));let s=Bi(e);return s&&n.push(s.text().then(a=>{r.titleFile=a})),await Promise.all(n),Ui(r)}function Bi(e){if("title"in e&&e.title)return e.title}function Ui(e){let{procs:t,acqus:r,integrals:n,ereticFactor:i,titleFile:o}=e,s={...t};ue(s,r);let a={...s.info};s.info=a;let c={...s.meta};s.meta=c;let{epoch:l,date:m}=me(c.DATE);return l!==null&&Object.assign(a,{epoch:l,date:m}),n&&Object.assign(s,{integrals:n}),i&&(a.ereticFactor=i),o&&(c.TITLE_FILE=o),e["1r"]||e["1i"]?de({re:e["1r"],im:e["1i"]},s):e.fid&&ge(e.fid,s),s}async function $i(e){let r=(await e.quantFactorSample?.text())?.match(/<Application[\w\W]+<Eretic_Factor>(?<ereticFactor>[\d.]+)/);return Number(r?.groups?.ereticFactor)}function Xe(e,t){for(let r in t.meta)r in e.meta?(Array.isArray(e.meta[r])||(e.meta[r]=[e.meta[r]]),e.meta[r].push(t.meta[r])):e.meta[r]===void 0&&(e.meta[r]=[t.meta[r]]);return e}async function Bt(e,t){let r={},n=[],i=["2rr","2ri","2ir","2ii","ser"];function o(s,a){return s.then(c=>{r[a]=c})}for(let s of i){let a=e[s];a&&n.push(o(a.arrayBuffer(),s))}if(n.push(o(_(e.procs,t),"procs"),o(_(e.proc2s,t),"proc2s"),o(_(e.acqus,t),"acqus"),o(_(e.acqu2s,t),"acqu2s")),"nuslist"in e&&e.nuslist){let s=e.nuslist;n.push(o(s.text(),"nuslist"))}return e.vdlist&&n.push(o(e.vdlist.text(),"vdlist")),e.difflist&&n.push(o(e.difflist.text(),"difflist")),await Promise.all(n),zi(r,t)}function zi(e,t){let r=Xe(e.procs,e.proc2s),n=Xe(e.acqus,e.acqu2s);ue(r,n);let{epoch:i,date:o}=me(r.meta.DATE);if(o.length>0&&(r.info={...r.info,epoch:i,date:o}),e.nuslist&&(r.info.nuslist=e.nuslist.split(/\r?\n/).filter(Boolean).map(Number.parseFloat)),e.vdlist){let p=[];for(let h of e.vdlist.split(`
|
|
2
|
-
`)){if(!h)continue;let[d,
|
|
3
|
-
`)){if(!h)continue;let[d]=h.trim().match(/\s*([\d.]+)\s*/)?.slice(1)||[];p.push(d)}r.meta.difflist=p}r.meta.SW_p||(r.meta.SW_p=r.meta.SW_h),r.meta.SF||(r.meta.SF=r.meta.SFO1);let s=["2rr","2ri","2ir","2ii"].some(p=>p in e);r.meta.nbSubSpectra=s?Number.parseInt(r.meta.SI[1],10):Number.parseInt(r.meta.TD[1],10);let a=0,c=0,l=0,m=0;if(s){let p=Number(r.meta.SF[1]),h=Number(r.meta.SW_p[1]||r.meta.SW[1]);m=Number(r.meta.OFFSET[1]),l=Number(r.meta.OFFSET[0]),a=m,c=m-h/p,r.meta.firstY=a,r.meta.lastY=c,de({rr:e["2rr"],ri:e["2ri"],ir:e["2ir"],ii:e["2ii"]},r,t)}else if(e.ser){a=0,c=r.meta.nbSubSpectra;let p=Number(r.meta.SW[0]),h=Number(r.meta.SW[1]),d=Number(r.meta.SFO1[0]),b=Number(r.meta.SFO1[1]),F=Number(r.meta.O1[0]),S=Number(r.meta.O1[1]);l=F/d+p/2,m=S/b+h/2,ge(e.ser,r,t)}if(t.keepSpectra){let{nbSubSpectra:p}=r.meta,h=(c-a)/(p-1),d=a;for(let b=0;b<p;b++)d+=h,r.spectra[b].pageValue=d}let{NUC1:u,AXNUC:f,SF:g}=r.meta,y=f||u||[];return r.info["2D_Y_NUCLEUS"]=y[1],r.info["2D_X_NUCLEUS"]=y[0],r.info["2D_Y_FRECUENCY"]=g[1],r.info["2D_X_FRECUENCY"]=g[0],r.info["2D_Y_OFFSET"]=m,r.info["2D_X_OFFSET"]=l,r.info.twoD=!0,r.twoD=!0,r}async function He(e,t={}){let r,n=!1,i=!1;if(["ser","2rr","2ri","2ir","2ii"].some(s=>s in e))n=!0,r=await Bt(e,t);else if(e["1r"]||e["1i"]||e.fid)i=!0,r=await jt(e,t);else throw new RangeError("The current files are invalid");let o={name:e.name,expno:e.expno,isFID:!!e.isFID};for(let s in e){let a=s;(typeof e[a]).match(/number|string|boolean/)&&(o[a]=e[a])}r.source=n?{...o,is2D:n}:{...o,is1D:i},t.keepFiles&&(r.source.files=e.fileCollectionItems),r.meta.DATE=Number(r.meta.DATE),r.meta.GRPDLY&&(Ve(r.meta,"DSPFVS",r.meta.DSPFVS),Ve(r.meta,"GRPDLY",r.meta.GRPDLY),Ve(r.meta,"DECIM",r.meta.DECIM));for(let s in r.meta)Array.isArray(r.meta[s])&&(r.meta[s].length===1||typeof r.meta[s][0]=="string"&&r.meta[s][0].includes("(0.."))&&(r.meta[s]=r.meta[s][0]);return r}function Ve(e,t,r){r!==void 0&&(Array.isArray(r)?e[t]=r.slice():e[t]=[r])}var B={};xt(B,{ECHO_ANTIECHO:()=>Gi,QF:()=>Ji,QSEC:()=>Wi,STATES:()=>Vi,STATES_TPPI:()=>Hi,TTPI:()=>Xi});var Ji=1,Wi=2,Xi=3,Vi=4,Hi=5,Gi=6;import{formatSpectra as bo}from"@zakodium/nmrium-core";function ye(e){let t=[];for(let r of e){if(!r)continue;let{groups:{value:n,unit:i}={}}=r.trim().match(/[$$]*\s*(?<value>[\d.]+)\s*(?<unit>[a-zA-Z]+)/)||{};t.push(Yi(n,i))}return t}function Yi(e,t){switch(t.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 $t}from"is-any-array";function U(e){if(Ki(e))return Zi(e)?e.map(Ut):Ut(e);if(typeof e=="object"&&e!==null){let t={};for(let r in e)t[r]=U(e[r]);return t}return e}function Ki(e){return $t(e)}function Ut(e){return Float64Array.from(e)}function Zi(e){return $t(e[0])}import{isAnyArray as yo}from"is-any-array";import{getOneIfArray as eo}from"@zakodium/nmrium-core";var Qi=new Map([[String(H.QSIM),"notPhaseSensitive"],["notphasesensitive","notPhaseSensitive"],[String(H.QSEQ),"QSEQ"],["qseq","QSEQ"],[String(B.TTPI),"TPPI"],["tppi","TPPI"],[String(B.STATES),"States"],["states","States"],[String(B.STATES_TPPI),"States-TPPI"],["tppi-states","States-TPPI"],["states-tppi","States-TPPI"],[String(B.ECHO_ANTIECHO),"Echo-antiecho"],["echo-antiecho","Echo-antiecho"]]);function zt(e){let t=String(e).toLowerCase().replaceAll(" ","");return Qi.get(t)}function D(e,t,r,n=!1){r===void 0||t in e&&!n||(Array.isArray(r)?e[t]=r.map(Jt):e[t]=[Jt(r)])}function Jt(e){return typeof e=="string"&&(e.startsWith("<")&&e.endsWith(">")&&(e=e.slice(1,-1)),e=e.replace(/\$.*/,"").trim()),e}function G(e){return Array.isArray(e)?e.map(Wt):Wt(e)}function Wt(e){return typeof e=="string"?Number.parseFloat(e):e}function P(e,t,r){r!==void 0&&D(e,t,G(r))}function Xt(e,t,r){let{prefix:n=""}=r,i=t[`${n}.ACQUISITIONSCHEME`]||t[`${n}FnMODE`];i&&D(e,"acquisitionScheme",zt(eo(i,1))),D(e,"acquisitionMode",t[`${n}.ACQUISITIONMODE`]),P(e,"lpNumberOfCoefficients",t[`${n}NCOEF`]),P(e,"linearPredictionBin",t[`${n}LPBIN`]),P(e,"tdOff",t[`${n}TDoff`])}import{getOneIfArray as ao}from"@zakodium/nmrium-core";import{UTCDate as to}from"@date-fns/utc";import{getOneIfArray as ro}from"@zakodium/nmrium-core";import{getTime as Ht,isValid as Gt,parse as no,parseISO as io}from"date-fns";import{removeComment as oo}from"jcampconverter";function Vt(e,t){if(t!==null&&Number.isInteger(t)){e.epoch=t;let r=new Date(t);e.date=r.toISOString(),e.localeDate=r.toLocaleString()}}function Yt(e,t,r={}){let n=t.LONGDATE??ro(t.DATE);if(!n)return;let{separator:i}=r,o=Number(n)*1e3;Vt(e,o||so(n,i))}function so(e,t){let r=oo(e,t),n=io(r,{});if(Gt(n)){let o=n.getTimezoneOffset()*60*1e3;return Ht(n)-o}let i=["dd/MM/yyyy HH:mm:ss","EEE MMM dd HH:mm:ss yyyy","dd/MM/yyyy HH:mm:ss","yyyy/MM/dd HH:mm:ss.SSS X","yyyy/MM/dd HH:mm:ssX","yyyy/MM/dd HH:mm:ss.SSS","yyyy/MM/dd HH:mm:ss","yyyy/MM/dd HH:mm","yyyy/MM/dd","yy/MM/dd"];for(let o of i){let s=no(r,o,new to,{useAdditionalDayOfYearTokens:!0});if(Gt(s))return Ht(s)}return null}function Kt(e,t,r){let{prefix:n="",separator:i}=r;(t.LONGDATE||t.DATE)&&Yt(e,t,{separator:i}),D(e,"pulseSequence",t[".PULSESEQUENCE"]||t[".PULPROG"]||t[`${n}PULPROG`]);let o=t[`${n}OWNER`];if(o&&D(e,"owner",o.replaceAll(/\$\$.*/gm,"")),D(e,"title",t.TITLE),D(e,"aqMod",t[`${n}AQ_mod`]),D(e,"windowMultiplicationMode",t[`${n}WDW`]),D(e,"experiment",ce(e,t,{prefix:n})),D(e,"solvent",t[".SOLVENTNAME"]||ao(t[`${n}SOLVENT`])),D(e,"temperature",t[`${n}TE`]||t[".TE"]),D(e,"type",t.DATATYPE),D(e,"dataClass",t[`${n}DATACLASS`]),D(e,"phc0",t[`${n}PHC0`]),D(e,"phc1",t[`${n}PHC1`]),e.type){let s=e.type[0].toUpperCase();s.includes("FID")?(e.isFid=!0,e.isComplex=!0):s.includes("SPECTRUM")&&(e.isFt=!0)}if(D(e,"firstX",t[`${n}FIRSTX`]),D(e,"lastX",t[`${n}LASTX`]),D(e,"numberOfPoints",t[`${n}NPOINTS`]),`${n}REVERSE`in t){let s=t[`${n}REVERSE`];e.reverse=(Array.isArray(s)?s:[s]).map(a=>typeof a=="string"?a.includes("yes"):a)}}function Zt(e){let{JCAMPDX:t="",ORIGIN:r=""}=e,n=String(t).toLowerCase()+String(r).toLowerCase();return"SPECTROMETER/DATASYSTEM"in e&&(n=e["SPECTROMETER/DATASYSTEM"]),(n.includes("mestre")||n.includes("nova"))&&(n="mnova"),n}import{isAnyArray as co}from"is-any-array";import{calculateRelativeFrequency as lo}from"nmr-processing";function Qt(e,t,r){let{prefix:n=""}=r;if(P(e,"originFrequency",t[`${n}SFO1`]),e.dimension===1&&P(e,"originFrequency",t[".OBSERVEFREQUENCY"]),!e.originFrequency&&e.dimension===2&&".OBSERVEFREQUENCY"in t){let i=G(t[".OBSERVEFREQUENCY"]);if(co(i)&&i.length>1){let o=t[`${n}SYMBOL`].split(","),s=o.findIndex(c=>c.includes("2")),a=o.findIndex(c=>c.includes("1"));s!==-1&&a!==-1?e.originFrequency=[i[s],i[a]]:e.originFrequency=i.slice()}else typeof i=="number"&&(e.originFrequency=lo(e.nucleus,i))}(!e.originFrequency||e.originFrequency.some(i=>Number.isNaN(i)||i===0))&&(e.originFrequency=e.dimension>1?[400,400]:[400],r.logger?.warn("Frequency could not be determined, set to 400 MHz"))}function C(e,t,r=""){return e.every(n=>`${r}${n}`in t)}import{matrixTranspose as mo}from"ml-spectra-processing";function ne(e,t){return mo(e).map(t)}function er(e,t,r){let{prefix:n=""}=r,i=t[`${n}REFERENCE_POINT`];if(!("baseFrequency"in e)&&"originFrequency"in e&&D(e,"baseFrequency",e.originFrequency),!("frequencyOffset"in e)&&i&&C(["spectralWidth","baseFrequency"],e)){let o=typeof i=="number"?i:Number(t[`${n}REFERENCE_POINT`].match(/(?<reference>[+-]?\d+(?:\.\d+)?)\s*.*/)?.groups?.reference);if(!Number.isNaN(o)){let{spectralWidth:s,baseFrequency:a}=e;D(e,"frequencyOffset",.5*s[0]*a[0]-o)}}if(!("frequencyOffset"in e)&&C(["baseFrequency","originFrequency"],e)){let{baseFrequency:o,originFrequency:s}=e;D(e,"frequencyOffset",ne([s,o],a=>(a[0]-a[1])*1e6))}!e.frequencyOffset[0]&&".SHIFTREFERENCE"in t&&uo(t,e)}function uo(e,t){let r=e[".SHIFTREFERENCE"],n=r.trim().startsWith("(")?/\((?<data>[^)]+)\)/:/(?<data>[^)]+)/,i=r.match(n);if(i.groups.data){let o=i.groups.data.split(",");if(o.length<4)return;let s=Number.parseInt(t.numberOfPoints,10),{spectralWidth:a,baseFrequency:c}=t,l=Number.parseInt(o[2],10),m=Number.parseFloat(o[3]),u;if(t.isFid){if(!C(["numberOfPoints","spectralWidth"],t))return;u=m+(s*.5-l)*a/s}else if(C(["firstX","lastX","numberOfPoints"],t)){let f=Number.parseFloat(t.firstX),g=Number.parseFloat(t.lastX),y=(g+f)/2,p=(g-f)/(s+1),h=p<0?f:g+(l-1)*p;u=(y-h)/c+m}u!==void 0&&!Number.isNaN(u)&&(t.frequencyOffset=u*c)}}import{isAnyArray as Y}from"is-any-array";function he(e){return typeof e=="number"}function be(e){let{phc0:t,phc1:r}=e;return!Y(t)&&!he(t)||!Y(r)&&!he(r)||Y(t)&&!he(t[0])||Y(r)&&!he(r[0])?{}:(Y(r)?r[0]*=-1:r*=-1,Y(t)?t[0]*=-1:t*=-1,{phc0:t,phc1:r})}function tr(e,t){let{T1NUCLEUS:r,T2NUCLEUS:n,PAGE:i}=t;e.pulseSequence=t.EXPERIMENT||t[".PULSESEQUENCE"];let o=[],{dimension:s,isComplex:a}=e;if(s===2&&e.pulseSequence==="T1"){let m=a?2:1;for(let u=0;u<i.length;u+=m){let f=i[u].replace(/T1=/,"");o.push(Number(f))}t.vdlistValues=o}e.nucleus=s>1?[n,r]:[n];let{phc0:c,phc1:l}=e;if(c&&l){let m=be({phc0:c,phc1:l});e={...e,...m}}}import{getOneIfArray as ir}from"@zakodium/nmrium-core";import{getGyromagneticRatio as po}from"gyromagnetic-ratio";function nr(e,t,r){if(e>0)return e;if(t>14||t===0)return 0;if(rr[t]){let n=rr[t];if(!n[r])throw new Error(`decim ${r} not in lookup table for dspfvs ${t}`);return n[r]}else throw new Error(`dspfvs ${t} not in lookup table`)}var rr={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}};function or(e,t,r){let{prefix:n=""}=r,i=e.nucleus[0],o=po(i);if(D(e,"probeName",t[`${n}PROBHD`]),D(e,"baseFrequency",t[`${n}BF1`]||t[`${n}SF`]),P(e,"scaleFactor",t[`${n}NC_proc`]),"scaleFactor"in e&&(e.scaleFactor=e.scaleFactor.map(a=>2**a)),!("baseFrequency"in e)&&"originFrequency"in e?D(e,"baseFrequency",e.originFrequency):e.baseFrequency=G(e.baseFrequency),o&&C(["baseFrequency","originFrequency"],e)){let a=2*Math.PI*(e.baseFrequency[0]/o)*1e6;D(e,"fieldStrength",a)}if(P(e,"spectralWidth",t[`${n}SW`]||t[`${n}QM_SPECTRAL_WIDTH`]),e.dimension===1&&t[`${n}SweepWidth`]&&e.originFrequency&&P(e,"spectralWidth",t[`${n}SweepWidth`]/e.originFrequency[0]),D(e,"numberOfPoints",t[`${n}TD`],!0),D(e,"spectrumSize",t[`${n}SI`]??e.numberOfPoints),D(e,"sampleName",t[`${n}NAME`]),t[`${n}FNTYPE`]!==void 0&&D(e,"acquisitionMode",Number.parseInt(t[`${n}FNTYPE`],10)),t[`${n}VARNAME`]?.split(",")[0]==="TIME"){let a=typeof t.LAST=="string"?t.LAST.replace(" ","").split(",")[0]:t.LAST;P(e,"acquisitionTime",a)}if(!e.acquisitionTime&&C(["numberOfPoints","spectralWidth"],e)){let{spectralWidth:a,originFrequency:c,numberOfPoints:l}=e;D(e,"acquisitionTime",(l[0]-1)/(2*a[0]*c[0]))}if(t[`${n}P`]){let a=1e6/(ir(t[`${n}P`]).split(r.separator||`
|
|
1
|
+
var si=Object.defineProperty;var xt=(e,t)=>{for(var r in t)si(e,r,{get:t[r],enumerable:!0})};import{NMRiumCore as Fa}from"@zakodium/nmrium-core";import{defineNMRiumPlugin as Di}from"@zakodium/nmrium-core";import{nextPowerOfTwo as gi}from"ml-spectra-processing";import{Filters1D as yi,Filters2D as hi}from"nmr-processing";import{matrixTranspose as ai}from"ml-spectra-processing";function $(e,t){return ai(e).map(t)}import{getOneIfArray as ci}from"@zakodium/nmrium-core";function le(e={},t={},r={}){e===null&&(e={}),typeof e=="string"&&(e={pulseSequence:e});let n=Array.isArray(e.pulseSequence)?e.pulseSequence[0]:e.pulseSequence||"";if(typeof n!="string")return e.dimension?`${e.dimension}d`:"";if(n=n.toLowerCase(),n.includes("zg")||n.includes("single_pulse_dec")||n.includes("udeft"))return"1d";if(n.includes("hsqct")||n.includes("invi")&&(n.includes("ml")||n.includes("di")))return"hsqctocsy";if(n.includes("hsqc")||n.includes("invi"))return"hsqc";if(n.includes("hmbc")||n.includes("inv4")&&n.includes("lp"))return"hmbc";if(n.includes("hmqc"))return"hmqc";if(n.includes("cosy"))return"cosy";if(n.includes("jres"))return"jres";if(n.includes("dosy"))return"dosy";if(n.includes("tocsy")||n.includes("mlev")||n.includes("dipsi"))return"tocsy";if(n.includes("noesy"))return"noesy";if(n.includes("roesy"))return"roesy";if(n.includes("dept"))return"dept";if(n.includes("jmod")||n.includes("apt"))return"aptjmod";if(n.includes("inad"))return"inadequate";if(n.includes("adeq"))return"adequate";let{prefix:i=""}=r,o=(ci(t[`${i}SPECTYP`])||"").replace(/^<(.*)>$/,"$1").toLowerCase();return o.length>0&&o!=="undefined"?o:e.dimension?`${e.dimension}d`:""}import{getOneIfArray as Dt}from"@zakodium/nmrium-core";var li=["no","exponential","modifiedGaussian","sine","qsine","trap","user","sinc","qsinc","traf","trafs"];function mi(e){return e in At}function qe(e,t){let{prefix:r="",index:n=0}=t,i=Dt(e[`${r}WDW`],n),o=li[i?Number(i):0],s={};if(!mi(o))return s;let a=At[o];if(a){let{kind:c,parameters:l}=a,m={};for(let u in l){let f=l[u],{source:g,processor:y}=f;if(g){let p=Dt(e[`${r}${g}`],n),h=Number.parseFloat(String(p));if(Number.isNaN(h))continue;m[u]=y?y(h):h}else f.value!==void 0&&(m[u]=f.value)}s[c]={apply:!0,options:m}}return s}var At={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:St},exponent:{value:1}}},qsine:{kind:"sineSquare",parameters:{offset:{source:"SSB",processor:St}}},traf:{kind:"traf",parameters:{lineBroadening:{source:"LB"}}}};function St(e){return e===0||e===1?0:1/e}var It={sineBell:Nt({offset:0})},Mt={cosy:{...It},hmbc:{...It},hsqc:{sineBell:Nt({offset:.5})}},ui={...Mt};function je(e="",t=1){let r=pi(e),n={},i=t===1?Mt[r||""]:ui[r||""];return i&&(n=structuredClone(i)),n}function Nt(e){return{apply:!0,options:e}}function pi(e){let r=e.toLowerCase().match(/cosy|hsqc|hmbc/);return r?r[0]:null}function Pt(e,t={}){let{prefix:r="",experiment:n=le(e)}=t;return e[`${r}WDW`]?{f2:qe(e,{...t,index:0}),f1:qe(e,{...t,index:1})}:{f2:je(n,1),f1:je(n,2)}}import{Filters1D as fi}from"nmr-processing";var Be=["digitalFilter","backwardLinearPrediction","forwardLinearPrediction","apodization","zeroFilling","fft",["shiftX","phaseCorrection"],"trim","baselineCorrection"],H={};for(let e=0;e<Be.length;e++){let t=Be[e];for(let r of Array.isArray(t)?t:[t])H[r]=e}for(let e of Object.values(fi))e.name in H||(H[e.name]=Be.length);import{Filters2D as di}from"nmr-processing";var Ue=["digitalFilter2D","blpDimension1","flpDimension1","apodizationDimension1","zeroFillingDimension1","fftDimension1","blpDimension2","flpDimension2","nusDimension2","apodizationDimension2","zeroFillingDimension2","fftDimension2","phaseCorrectionTwoDimensions",["shift2DX","shift2DY","symmetrizeCosyLike"]],G={};for(let e=0;e<Ue.length;e++){let t=Ue[e];for(let r of Array.isArray(t)?t:[t])G[r]=e}for(let e of Object.values(di))e.name in G||(G[e.name]=Ue.length);var bi=new Set;function Fi(e,t){let{filter:r,experimentalFeatures:n=!1}=t,{name:i}=r;({...yi,...hi})[i]&&(e.some(s=>s.name===i)||bi.has(i)&&!n||e.push({...r,enabled:!0}))}function Tt(e,t={}){let{data:r}=e;if(!r)return;let{autoProcessing:n,experimentalFeatures:i}=t,o=(a,c)=>Fi(a,{...c,experimentalFeatures:i}),{spectra:s}=r;for(let a of s){let{data:c,info:l,meta:m,filters:u}=a,{dimension:f,isFid:g}=l;if(g){if(f===1){let y=c.re.length,{fileIdentifier:p}=m||{},{tdOff:h,digitalFilter:d}=l;if(d&&d>0&&o(u,{filter:{name:"digitalFilter",value:{digitalFilterValue:d}}}),!n)continue;p?.toLowerCase().includes("jeol")&&o(u,{filter:{name:"trim",value:{leftPercentage:10,rightPercentage:10}}}),h&&Math.abs(h)>0&&o(u,{filter:{name:"backwardLinearPrediction",value:{nbInputs:y/2}}}),o(u,{filter:{name:"apodization",value:{exponential:{apply:!0,options:{lineBroadening:1}}}}}),o(u,{filter:{name:"zeroFilling",value:{nbPoints:2*y}}}),o(u,{filter:{name:"fft",value:{}}}),o(u,{filter:{name:"phaseCorrection",value:xi(l)}}),u.sort((F,b)=>H[F.name]-H[b.name])}else if(f===2){if(!n)continue;let y=c.re.z.length,p=c.re.z[0].length,{OFFSET:h}=m||{},{tdOff:d,experiment:F=""}=l,b=l.spectrumSize,{nuslist:S,NusTD:I}=m;Array.isArray(b)&&b.length>1?(S&&(b[1]=Math.max(gi(I[1]),1024)),b[1]=Et(b[1],y),b[0]=Et(b[0],p)):b=[Math.max(p,1024),Math.max(y,1024)];let x=F.toLowerCase().includes("cosy");d&&Math.abs(d[0])>0&&o(u,{filter:{name:"blpDimension1",value:{nbInputs:p/2}}});let A=Pt(m,{experiment:F});if(o(u,{filter:{name:"apodizationDimension1",value:A.f2}}),o(u,{filter:{name:"zeroFillingDimension1",value:{nbPoints:b[0]}}}),o(u,{filter:{name:"fftDimension1",value:{}}}),m&&"nuslist"in m&&o(u,{filter:{name:"nusDimension2",value:{}}}),o(u,{filter:{name:"apodizationDimension2",value:A.f1}}),o(u,{filter:{name:"zeroFillingDimension2",value:{nbPoints:b[x?0:1]}}}),x&&o(u,{filter:{name:"symmetrizeCosyLike",value:{}}}),o(u,{filter:{name:"fftDimension2",value:{}}}),h){let{spectralWidth:M,originFrequency:P,frequencyOffset:v}=l,_=$([h,M,v,P],q=>q[0]-q[1]/2-q[2]/q[3]);o(u,{filter:{name:"shift2DX",value:{shift:_[0]}}}),o(u,{filter:{name:"shift2DY",value:{shift:_[1]}}})}u.sort((M,P)=>G[M.name]-G[P.name])}}}}function Et(e,t,r=1024){return e<t?Math.max(t,r):e>t?Math.min(e,r):Math.max(t,r)}function xi(e){let{phc0:t=0,phc1:r=0}=e;return Ot([t,r])?{}:{ph0:t,ph1:r}}function Ot(e){return Array.isArray(e)?e.every(t=>!t&&t===0):Ot([e])}function $e(){return Di({id:"@zakodium/nmrium-core-plugins#AutoPostProcessingPlugin",version:1,shouldSerialize:!0,migrations:[],onReadProcess:{onProcessing:Tt}})}import{defineNMRiumPlugin as Io}from"@zakodium/nmrium-core";import{FileCollection as Wc}from"file-collection";var Ct=["acqus","acqu2s"],me=["procs","proc2s"];function Rt(e){return e.is1D?Si(e):e.is2D?Ai(e):{checked:!1,message:"Multi-dimensional n > 2 is not supported"}}function Si(e){let t=e.isFID?["acqus"]:["acqus","procs"],r=t.every(n=>e[n]);return{checked:r,message:r?"":`File: ${e[e.isFID?"fid":"1r"]?.relativePath} is ignored, files: ${t.join(",")} are required.`}}function Ai(e){let t=e.isFID?Ct:Ct.concat(me),r=t.every(n=>e[n]);return r&&e.isFID&&me.some(n=>e[n])&&!me.every(n=>e[n])&&(r=!1,t.push(...me)),{checked:r,message:r?"":`File: ${e.name} is ignored, files: ${t.join(",")} are required.`}}function ze(e,t={}){let{logger:r,processingNumbers:n,experimentNumbers:i,dataSelection:o="both",keep1D:s=!0,keep2D:a=!0,onlyFirstProcessedData:c=!0}=t,l={},m=e.files.map(g=>g.relativePath);for(let g of e){let y,p,h,d=g.relativePath.split("/"),F=d.indexOf("pdata");if(F!==-1)y=Number(d[F+1]),p=Number(d[F-1]),h=d.slice(0,-3).join("/");else if(Mi(g,m)){let S=d.indexOf(g.name);p=Number(d[S-1]),h=d.slice(0,-1).join("/")}else continue;if(Number.isNaN(p)&&(p=void 0),Number.isNaN(y)&&(y=void 0),i&&!i.includes(p))continue;l[h]||(l[h]={name:h,expno:p,processedData:{},fileCollectionItems:[]});let b=l[h];if(g.name==="vdlist"&&(b.vdlist=g),g.name==="difflist"&&(b.difflist=g),y){b.processedData||(b.processedData={}),b.processedData[y]||(b.processedData[y]={fileCollectionItems:[],name:h,expno:p,procno:y});let S=b.processedData[y];S.fileCollectionItems.push(g),g.name.match(/^(?:1r|1i|2rr|2ir|2ii|2ri|procs|proc2s|title|integrals.txt)$/)&&(S[g.name]=g),g.name==="2rr"&&(S.is2D=!0,S.isFT=!0),g.name==="1r"&&(S.is1D=!0,S.isFT=!0)}else b.fileCollectionItems.push(g),g.name.match(/^(?:ser|fid|acqus|acqu2s|nuslist)$/)&&(b[g.name]=g),g.name==="ser"&&(b.is2D=!0,b.isFID=!0),g.name==="fid"&&(b.is1D=!0,b.isFID=!0);g.name==="QuantFactorSample.xml"&&(b.quantFactorSample=g)}if(n)for(let g in l){let y=l[g].processedData,p={};for(let h in y)n.includes(Number.parseInt(h,10))&&(p[h]=y[h]);l[g].processedData=p}else if(c)for(let g in l){let y=l[g].processedData,p=Object.keys(y??{});p.sort((d,F)=>Number(d)-Number(F));let h=p[0];y&&h!==void 0&&(l[g].processedData={firstProcessedNumber:y[h]})}let u=Ni(r),f=[];for(let g in l){let y=l[g],{processedData:p,...h}=y;if(u(y,o)){let F=Object.keys(p??{});if(p&&F.length>0){let b=p[F[0]];b.procs&&(h.fileCollectionItems.push(b.procs),h.procs=b.procs),b.proc2s&&(h.fileCollectionItems.push(b.proc2s),h.proc2s=b.proc2s),b["integrals.txt"]&&(h.integrals=b["integrals.txt"])}f.push(h)}let d="ser"in h||"fid"in h;if(o==="fid"||o==="preferFID"&&d){r?.warn("Skipping FT data because it does not match the import filters");continue}for(let F in p){let b=p[F];(b["1r"]||b["2rr"])&&(h.acqus&&b.fileCollectionItems.push(h.acqus),h.acqu2s&&b.fileCollectionItems.push(h.acqu2s),h.vdlist&&(b.vdlist=h.vdlist),f.push({integrals:b["integrals.txt"],acqus:h.acqus,acqu2s:h.acqu2s,...b}))}}return s||(r?.warn("Skipping 1D data because it does not match the import filters"),f=f.filter(g=>!g.is1D)),a||(r?.warn("Skipping 2D data because it does not match the import filters"),f=f.filter(g=>!g.is2D)),Ii(f,t.logger)}function Ii(e,t){return e.filter(r=>{let{checked:n,message:i}=Rt(r);return n||t?.warn(i),n})}function Mi(e,t){return e.name.match(/^(?:ser|acqus|acqu2s|nuslist|vdlist|difflist|QuantFactorSample.xml)$/)||e.name.match(/^fid$/)&&t.includes(e.relativePath.replace(/fid$/,"acqus"))}function Ni(e){return(t,r)=>{let{processedData:n}=t,i=Object.keys(n??{}),o=n&&i.length>0&&["1r","1i","2rr"].some(m=>m in n[i[0]]),s="ser"in t||"fid"in t,l=s&&(r!=="ft"&&r!=="preferFT"||r==="preferFT"&&!o);return s&&!l&&e?.warn("Skipping RAW data because it does not match import filters"),l}}function ue(e){if(e===void 0||Array.isArray(e)&&e.length===0)return{epoch:null,date:""};let t=e[0]*1e3;return{epoch:t,date:new Date(t).toUTCString()}}function pe(e,t){for(let r in t.meta)e.meta[r]===void 0&&(e.meta[r]=t.meta[r]);for(let r in t.info)e.info[r]===void 0&&(e.info[r]=t.info[r]);for(let r in e.meta)Array.isArray(e.meta[r])||(e.meta[r]=[e.meta[r]])}import{convert as Pi}from"jcampconverter";async function B(e,t){if(!e)return wt();let r=await e.text(),{keepRecordsRegExp:n=/.*/}=t,i=Pi(r,{keepRecordsRegExp:n});return i.flatten.length===0?wt():i.flatten[0]}function wt(){return{info:{},meta:{},tmp:{},spectra:[],ntuples:{}}}async function vt(e){let r=(await e.integrals?.text())?.split(/\r?\n/).slice(3).filter(Boolean)??[],n=[];for(let i=1;i<r.length;i++){let o=r[i].replace(/^\s*/,"").replaceAll(/[\s\t]+/g,";").match(/\d+;(?<from>[0-9.]+);(?<to>[0-9.]+);(?<integration>[0-9.]+)/)?.groups;if(o){let{from:s,to:a,integration:c}=o;n.push({from:Number.parseFloat(s),to:Number.parseFloat(a),integration:Number.parseFloat(c)})}}return n}function Je(e,t="utf8"){return new TextDecoder(t).decode(e)}var Ei=new TextEncoder;function Lt(e){return Ei.encode(e)}var Ti=1024*8,Oi=(()=>{let e=new Uint8Array(4),t=new Uint32Array(e.buffer);return!((t[0]=1)&e[0])})(),We={int8:globalThis.Int8Array,uint8:globalThis.Uint8Array,int16:globalThis.Int16Array,uint16:globalThis.Uint16Array,int32:globalThis.Int32Array,uint32:globalThis.Uint32Array,uint64:globalThis.BigUint64Array,int64:globalThis.BigInt64Array,float32:globalThis.Float32Array,float64:globalThis.Float64Array},R=class e{buffer;byteLength;byteOffset;length;offset;lastWrittenByte;littleEndian;_data;_mark;_marks;constructor(t=Ti,r={}){let n=!1;typeof t=="number"?t=new ArrayBuffer(t):(n=!0,this.lastWrittenByte=t.byteLength);let i=r.offset?r.offset>>>0:0,o=t.byteLength-i,s=i;(ArrayBuffer.isView(t)||t instanceof e)&&(t.byteLength!==t.buffer.byteLength&&(s=t.byteOffset+i),t=t.buffer),n?this.lastWrittenByte=o:this.lastWrittenByte=0,this.buffer=t,this.length=o,this.byteLength=o,this.byteOffset=s,this.offset=0,this.littleEndian=!0,this._data=new DataView(this.buffer,s,o),this._mark=0,this._marks=[]}available(t=1){return this.offset+t<=this.length}isLittleEndian(){return this.littleEndian}setLittleEndian(){return this.littleEndian=!0,this}isBigEndian(){return!this.littleEndian}setBigEndian(){return this.littleEndian=!1,this}skip(t=1){return this.offset+=t,this}back(t=1){return this.offset-=t,this}seek(t){return this.offset=t,this}mark(){return this._mark=this.offset,this}reset(){return this.offset=this._mark,this}pushMark(){return this._marks.push(this.offset),this}popMark(){let t=this._marks.pop();if(t===void 0)throw new Error("Mark stack empty");return this.seek(t),this}rewind(){return this.offset=0,this}ensureAvailable(t=1){if(!this.available(t)){let n=(this.offset+t)*2,i=new Uint8Array(n);i.set(new Uint8Array(this.buffer)),this.buffer=i.buffer,this.length=n,this.byteLength=n,this._data=new DataView(this.buffer)}return this}readBoolean(){return this.readUint8()!==0}readInt8(){return this._data.getInt8(this.offset++)}readUint8(){return this._data.getUint8(this.offset++)}readByte(){return this.readUint8()}readBytes(t=1){return this.readArray(t,"uint8")}readArray(t,r){let n=We[r].BYTES_PER_ELEMENT*t,i=this.byteOffset+this.offset,o=this.buffer.slice(i,i+n);if(this.littleEndian===Oi&&r!=="uint8"&&r!=="int8"){let a=new Uint8Array(this.buffer.slice(i,i+n));a.reverse();let c=new We[r](a.buffer);return this.offset+=n,c.reverse(),c}let s=new We[r](o);return this.offset+=n,s}readInt16(){let t=this._data.getInt16(this.offset,this.littleEndian);return this.offset+=2,t}readUint16(){let t=this._data.getUint16(this.offset,this.littleEndian);return this.offset+=2,t}readInt32(){let t=this._data.getInt32(this.offset,this.littleEndian);return this.offset+=4,t}readUint32(){let t=this._data.getUint32(this.offset,this.littleEndian);return this.offset+=4,t}readFloat32(){let t=this._data.getFloat32(this.offset,this.littleEndian);return this.offset+=4,t}readFloat64(){let t=this._data.getFloat64(this.offset,this.littleEndian);return this.offset+=8,t}readBigInt64(){let t=this._data.getBigInt64(this.offset,this.littleEndian);return this.offset+=8,t}readBigUint64(){let t=this._data.getBigUint64(this.offset,this.littleEndian);return this.offset+=8,t}readChar(){return String.fromCharCode(this.readInt8())}readChars(t=1){let r="";for(let n=0;n<t;n++)r+=this.readChar();return r}readUtf8(t=1){return Je(this.readBytes(t))}decodeText(t=1,r="utf8"){return Je(this.readBytes(t),r)}writeBoolean(t){return this.writeUint8(t?255:0),this}writeInt8(t){return this.ensureAvailable(1),this._data.setInt8(this.offset++,t),this._updateLastWrittenByte(),this}writeUint8(t){return this.ensureAvailable(1),this._data.setUint8(this.offset++,t),this._updateLastWrittenByte(),this}writeByte(t){return this.writeUint8(t)}writeBytes(t){this.ensureAvailable(t.length);for(let r=0;r<t.length;r++)this._data.setUint8(this.offset++,t[r]);return this._updateLastWrittenByte(),this}writeInt16(t){return this.ensureAvailable(2),this._data.setInt16(this.offset,t,this.littleEndian),this.offset+=2,this._updateLastWrittenByte(),this}writeUint16(t){return this.ensureAvailable(2),this._data.setUint16(this.offset,t,this.littleEndian),this.offset+=2,this._updateLastWrittenByte(),this}writeInt32(t){return this.ensureAvailable(4),this._data.setInt32(this.offset,t,this.littleEndian),this.offset+=4,this._updateLastWrittenByte(),this}writeUint32(t){return this.ensureAvailable(4),this._data.setUint32(this.offset,t,this.littleEndian),this.offset+=4,this._updateLastWrittenByte(),this}writeFloat32(t){return this.ensureAvailable(4),this._data.setFloat32(this.offset,t,this.littleEndian),this.offset+=4,this._updateLastWrittenByte(),this}writeFloat64(t){return this.ensureAvailable(8),this._data.setFloat64(this.offset,t,this.littleEndian),this.offset+=8,this._updateLastWrittenByte(),this}writeBigInt64(t){return this.ensureAvailable(8),this._data.setBigInt64(this.offset,t,this.littleEndian),this.offset+=8,this._updateLastWrittenByte(),this}writeBigUint64(t){return this.ensureAvailable(8),this._data.setBigUint64(this.offset,t,this.littleEndian),this.offset+=8,this._updateLastWrittenByte(),this}writeChar(t){return this.writeUint8(t.charCodeAt(0))}writeChars(t){for(let r=0;r<t.length;r++)this.writeUint8(t.charCodeAt(r));return this}writeUtf8(t){return this.writeBytes(Lt(t))}toArray(){return new Uint8Array(this.buffer,this.byteOffset,this.lastWrittenByte)}getWrittenByteLength(){return this.lastWrittenByte-this.byteOffset}_updateLastWrittenByte(){this.offset>this.lastWrittenByte&&(this.lastWrittenByte=this.offset)}};import{isAnyArray as Ci}from"is-any-array";import{matrixCreateEmpty as Ri,xSequentialFillFromStep as wi}from"ml-spectra-processing";function kt(e){for(let t in e){let{z:r}=e[t],{minX:n,minY:i,maxX:o,maxY:s}=e[t];if(n>o){[n,o]=[o,n];for(let a of r)a.reverse()}i>s&&(r.reverse(),[i,s]=[s,i]),e[t]={...e[t],z:r,minX:n,minY:i,maxY:s,maxX:o}}}function fe(e,t){let{x:r,minMax:n,nbSubSpectra:i,template:o}=t;e.spectra||(e.spectra=[]);for(let s=0;s<i;s++){let a={};for(let c in n)a[c]=n[c].z[s];e.spectra.push({...o,data:{...a,x:r}})}}function ge(e,t,r={}){let n={};for(let y in e)e[y]&&(n[y]=new R(e[y]));let i=de(t.meta.SI),o=de(t.meta.SW_p),s=de(t.meta.SF),a=s,c=de(t.shiftOffsetVal||t.meta.OFFSET);t.meta.observeFrequency=s,t.meta.brukerReference=a,t.meta.DATATYPE="NMR Spectrum";let l=Number.parseInt(t.meta.BYTORDP,10);l=l?0:1;let m=t.meta.nbSubSpectra||1;if(l)for(let y in n)n[y].setLittleEndian();else for(let y in n)n[y].setBigEndian();let u={dataType:"NMR Spectrum",nbPoints:i,firstX:c,lastX:c-o/s,xUnit:"PPM",yUnit:"Arbitrary",isXYdata:!0,isFT:!0,nucleus:t.meta.NUC1,observeFrequency:s,title:t.meta.TITLE,deltaX:-(o/s)/(i-1)},f=u.deltaX,g=wi({from:c,step:f,size:i});if(m===1){let y={};for(let p in n){let h=n[p],d=new Float64Array(i);for(let F=0;F<i;++F)d[F]=h.readInt32();y[p]=d}t.spectra.push({...u,data:{...y,x:g}})}else{let{meta:y}=t,p=Number(y.SF[1]),h=Number(y.SW_p[1]||y.SW[1]),d=Number(y.OFFSET[1]),F=d-h/p,b={};for(let S in n)b[S]={minY:d,maxY:F,minX:g[0],maxX:g.at(-1),...vi(y,n[S])};kt(b),r.keepSpectra&&fe(t,{minMax:b,x:g,nbSubSpectra:m,template:u}),t.minMax=b}}function de(e){return Number(Ci(e)?e[0]:e)}function vi(e,t){let r=e.SI.toReversed(),n=e.XDIM.toReversed(),i=r.map((g,y)=>Number.parseInt(String(g/n[y]),10)),[o,s]=r,[a,c]=n,l=Ri({nbRows:o,nbColumns:s}),[m,u]=[Number.MAX_SAFE_INTEGER,Number.MIN_SAFE_INTEGER],f=[];for(let g=0;g<i[0];g++)for(let y=0;y<i[1];y++){let p=y*c,h=g*a;f.push([h,p])}for(let[g,y]of f)for(let p=0;p<a;p++)for(let h=0;h<c;h++){let d=t.readInt32();m>d&&(m=d),u<d&&(u=d),l[p+g][h+y]=d}return{z:l,minZ:m,maxZ:u}}import{createStepArray as qi,xMinMaxValues as ji}from"ml-spectra-processing";var K={};xt(K,{DQD:()=>_i,QF:()=>Li,QSEQ:()=>Y,QSIM:()=>ki});var Li=0,ki=1,Y=2,_i=3;function ye(e,t,r){let n=Number.parseInt(t.meta.TD[0],10),i=new R(e),o=t.meta.nbSubSpectra||1,s=t.meta.AQ_mod,c=Number.parseInt(t.meta.DTYPA,10)===2,l=Number.parseFloat(t.meta.SW_h[0]),m=Number.parseFloat(t.meta.SFO1[0]);t.meta.DATATYPE="NMR FID";let u=1/(2*l),f=n*u,g=Number.parseInt(t.meta.BYTORDA,10);g=g?0:1,g?i.setLittleEndian():i.setBigEndian();let y=s===2?u:2*u,p=Bi({nbSubSpectra:o,isFloat:c,aqMode:s,td:n}),h={dataType:"NMR FID",dataTable:"(X++(R..R))",nbPoints:p,firstX:0,lastX:f,nucleus:t.meta.NUC1,xUnit:"Sec",yUnit:"Arbitrary",isXYdata:!0,isFID:!0,observeFrequency:m,title:t.meta.TITLE,deltaX:y},d=qi({length:p,step:y});if(o<2){let F=qt(i,{nbPoints:p,isFloat:c,aqMode:s});t.spectra=[{data:{x:d,...F},...h}]}else{let F={minX:d[0],maxX:d.at(-1),minY:0,maxY:o,minZ:0,maxZ:0},b=s===2?{re:{z:[],...F}}:{re:{z:[],...F},im:{z:[],...F}},S={re:{min:Number.MAX_SAFE_INTEGER,max:Number.MIN_SAFE_INTEGER},im:{min:Number.MAX_SAFE_INTEGER,max:Number.MIN_SAFE_INTEGER}};for(let I=0;I<o;I++){let x=qt(i,{nbPoints:p,isFloat:c,aqMode:s});S.re=_t(x.re,S.re),S.im=_t(x.im??new Float64Array,S.im),b.re.z.push(x.re),b.im&&x.im&&b.im.z.push(x.im)}b.re={...b.re,minZ:S.re.min,maxZ:S.re.max},b.im={...b.im,minZ:S.im.min,maxZ:S.im.max},r.keepSpectra&&fe(t,{minMax:b,x:d,nbSubSpectra:o,template:h}),t.minMax=b}}function _t(e,t){let{min:r,max:n}=ji(e),{min:i,max:o}=t;return{min:Math.min(i,r),max:Math.max(o,n)}}function qt(e,t){let{nbPoints:r,isFloat:n,aqMode:i}=t,o={re:new Float64Array(r),im:null},s=n?"readFloat64":"readInt32";if(i===2)for(let a=0;a<r;a++)o.re[a]=e[s]();else{o.im=new Float64Array(r);for(let a=0;a<r;a++)o.re[a]=e[s](),o.im[a]=e[s]()}return o}function Bi(e){let{nbSubSpectra:t,isFloat:r,aqMode:n,td:i}=e,o=i;if(t>1){let s=r?128:256;o=Math.trunc(Math.ceil(i/s)*s)}return n===2?o:o/2>>0}async function jt(e,t){let r={},n=[],i=e["1r"]||e["1i"]?["1r","1i"]:["fid"];function o(a,c){return a.then(l=>{r[c]=l})}for(let a of i){let c=e[a];c&&n.push(o(c.arrayBuffer(),a))}n.push(B(e.procs,t).then(a=>{r.procs=a}),B(e.acqus,t).then(a=>{r.acqus=a})),e.quantFactorSample&&n.push(zi(e).then(a=>{r.ereticFactor=a})),e.integrals&&n.push(vt(e).then(a=>{r.integrals=a}));let s=Ui(e);return s&&n.push(s.text().then(a=>{r.titleFile=a})),await Promise.all(n),$i(r)}function Ui(e){if("title"in e&&e.title)return e.title}function $i(e){let{procs:t,acqus:r,integrals:n,ereticFactor:i,titleFile:o}=e,s={...t};pe(s,r);let a={...s.info};s.info=a;let c={...s.meta};s.meta=c;let{epoch:l,date:m}=ue(c.DATE);return l!==null&&Object.assign(a,{epoch:l,date:m}),n&&Object.assign(s,{integrals:n}),i&&(a.ereticFactor=i),o&&(c.TITLE_FILE=o),e["1r"]||e["1i"]?ge({re:e["1r"],im:e["1i"]},s):e.fid&&ye(e.fid,s),s}async function zi(e){let r=(await e.quantFactorSample?.text())?.match(/<Application[\w\W]+<Eretic_Factor>(?<ereticFactor>[\d.]+)/);return Number(r?.groups?.ereticFactor)}function Xe(e,t){for(let r in t.meta)r in e.meta?(Array.isArray(e.meta[r])||(e.meta[r]=[e.meta[r]]),e.meta[r].push(t.meta[r])):e.meta[r]===void 0&&(e.meta[r]=[t.meta[r]]);return e}async function Bt(e,t){let r={},n=[],i=["2rr","2ri","2ir","2ii","ser"];function o(s,a){return s.then(c=>{r[a]=c})}for(let s of i){let a=e[s];a&&n.push(o(a.arrayBuffer(),s))}if(n.push(o(B(e.procs,t),"procs"),o(B(e.proc2s,t),"proc2s"),o(B(e.acqus,t),"acqus"),o(B(e.acqu2s,t),"acqu2s")),"nuslist"in e&&e.nuslist){let s=e.nuslist;n.push(o(s.text(),"nuslist"))}return e.vdlist&&n.push(o(e.vdlist.text(),"vdlist")),e.difflist&&n.push(o(e.difflist.text(),"difflist")),await Promise.all(n),Ji(r,t)}function Ji(e,t){let r=Xe(e.procs,e.proc2s),n=Xe(e.acqus,e.acqu2s);pe(r,n);let{epoch:i,date:o}=ue(r.meta.DATE);if(o.length>0&&(r.info={...r.info,epoch:i,date:o}),e.nuslist&&(r.info.nuslist=e.nuslist.split(/\r?\n/).filter(Boolean).map(Number.parseFloat)),e.vdlist){let p=[];for(let h of e.vdlist.split(`
|
|
2
|
+
`)){if(!h)continue;let[d,F]=h.trim().match(/\s*([\d.]+)\s*([a-zA-Z]+)/)?.slice(1)||[];F&&p.push(`${d}${F}`)}r.meta.vdlist=p}if(e.difflist){let p=[];for(let h of e.difflist.split(`
|
|
3
|
+
`)){if(!h)continue;let[d]=h.trim().match(/\s*([\d.]+)\s*/)?.slice(1)||[];p.push(d)}r.meta.difflist=p}r.meta.SW_p||(r.meta.SW_p=r.meta.SW_h),r.meta.SF||(r.meta.SF=r.meta.SFO1);let s=["2rr","2ri","2ir","2ii"].some(p=>p in e);r.meta.nbSubSpectra=s?Number.parseInt(r.meta.SI[1],10):Number.parseInt(r.meta.TD[1],10);let a=0,c=0,l=0,m=0;if(s){let p=Number(r.meta.SF[1]),h=Number(r.meta.SW_p[1]||r.meta.SW[1]);m=Number(r.meta.OFFSET[1]),l=Number(r.meta.OFFSET[0]),a=m,c=m-h/p,r.meta.firstY=a,r.meta.lastY=c,ge({rr:e["2rr"],ri:e["2ri"],ir:e["2ir"],ii:e["2ii"]},r,t)}else if(e.ser){a=0,c=r.meta.nbSubSpectra;let p=Number(r.meta.SW[0]),h=Number(r.meta.SW[1]),d=Number(r.meta.SFO1[0]),F=Number(r.meta.SFO1[1]),b=Number(r.meta.O1[0]),S=Number(r.meta.O1[1]);l=b/d+p/2,m=S/F+h/2,ye(e.ser,r,t)}if(t.keepSpectra){let{nbSubSpectra:p}=r.meta,h=(c-a)/(p-1),d=a;for(let F=0;F<p;F++)d+=h,r.spectra[F].pageValue=d}let{NUC1:u,AXNUC:f,SF:g}=r.meta,y=f||u||[];return r.info["2D_Y_NUCLEUS"]=y[1],r.info["2D_X_NUCLEUS"]=y[0],r.info["2D_Y_FRECUENCY"]=g[1],r.info["2D_X_FRECUENCY"]=g[0],r.info["2D_Y_OFFSET"]=m,r.info["2D_X_OFFSET"]=l,r.info.twoD=!0,r.twoD=!0,r}async function He(e,t={}){let r,n=!1,i=!1;if(["ser","2rr","2ri","2ir","2ii"].some(s=>s in e))n=!0,r=await Bt(e,t);else if(e["1r"]||e["1i"]||e.fid)i=!0,r=await jt(e,t);else throw new RangeError("The current files are invalid");let o={name:e.name,expno:e.expno,isFID:!!e.isFID};for(let s in e){let a=s;(typeof e[a]).match(/number|string|boolean/)&&(o[a]=e[a])}r.source=n?{...o,is2D:n}:{...o,is1D:i},t.keepFiles&&(r.source.files=e.fileCollectionItems),r.meta.DATE=Number(r.meta.DATE),r.meta.GRPDLY&&(Ve(r.meta,"DSPFVS",r.meta.DSPFVS),Ve(r.meta,"GRPDLY",r.meta.GRPDLY),Ve(r.meta,"DECIM",r.meta.DECIM));for(let s in r.meta)Array.isArray(r.meta[s])&&(r.meta[s].length===1||typeof r.meta[s][0]=="string"&&r.meta[s][0].includes("(0.."))&&(r.meta[s]=r.meta[s][0]);return r}function Ve(e,t,r){r!==void 0&&(Array.isArray(r)?e[t]=r.slice():e[t]=[r])}var z={};xt(z,{ECHO_ANTIECHO:()=>Yi,QF:()=>Wi,QSEC:()=>Xi,STATES:()=>Hi,STATES_TPPI:()=>Gi,TTPI:()=>Vi});var Wi=1,Xi=2,Vi=3,Hi=4,Gi=5,Yi=6;import{formatSpectra as bo}from"@zakodium/nmrium-core";function he(e){let t=[];for(let r of e){if(!r)continue;let{groups:{value:n,unit:i}={}}=r.trim().match(/[$$]*\s*(?<value>[\d.]+)\s*(?<unit>[a-zA-Z]+)/)||{};t.push(Ki(n,i))}return t}function Ki(e,t){switch(t.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 $t}from"is-any-array";function J(e){if(Zi(e))return Qi(e)?e.map(Ut):Ut(e);if(typeof e=="object"&&e!==null){let t={};for(let r in e)t[r]=J(e[r]);return t}return e}function Zi(e){return $t(e)}function Ut(e){return Float64Array.from(e)}function Qi(e){return $t(e[0])}import{isAnyArray as yo}from"is-any-array";import{getOneIfArray as to}from"@zakodium/nmrium-core";var eo=new Map([[String(K.QSIM),"notPhaseSensitive"],["notphasesensitive","notPhaseSensitive"],[String(K.QSEQ),"QSEQ"],["qseq","QSEQ"],[String(z.TTPI),"TPPI"],["tppi","TPPI"],[String(z.STATES),"States"],["states","States"],[String(z.STATES_TPPI),"States-TPPI"],["tppi-states","States-TPPI"],["states-tppi","States-TPPI"],[String(z.ECHO_ANTIECHO),"Echo-antiecho"],["echo-antiecho","Echo-antiecho"]]);function zt(e){let t=String(e).toLowerCase().replaceAll(" ","");return eo.get(t)}function D(e,t,r,n=!1){r===void 0||t in e&&!n||(Array.isArray(r)?e[t]=r.map(Jt):e[t]=[Jt(r)])}function Jt(e){return typeof e=="string"&&(e.startsWith("<")&&e.endsWith(">")&&(e=e.slice(1,-1)),e=e.replace(/\$.*/,"").trim()),e}function Z(e){return Array.isArray(e)?e.map(Wt):Wt(e)}function Wt(e){return typeof e=="string"?Number.parseFloat(e):e}function E(e,t,r){r!==void 0&&D(e,t,Z(r))}function Xt(e,t,r){let{prefix:n=""}=r,i=t[`${n}.ACQUISITIONSCHEME`]||t[`${n}FnMODE`];i&&D(e,"acquisitionScheme",zt(to(i,1))),D(e,"acquisitionMode",t[`${n}.ACQUISITIONMODE`]),E(e,"lpNumberOfCoefficients",t[`${n}NCOEF`]),E(e,"linearPredictionBin",t[`${n}LPBIN`]),E(e,"tdOff",t[`${n}TDoff`])}import{getOneIfArray as co}from"@zakodium/nmrium-core";import{UTCDate as ro}from"@date-fns/utc";import{getOneIfArray as no}from"@zakodium/nmrium-core";import{getTime as Ht,isValid as Gt,parse as io,parseISO as oo}from"date-fns";import{removeComment as so}from"jcampconverter";function Vt(e,t){if(t!==null&&Number.isInteger(t)){e.epoch=t;let r=new Date(t);e.date=r.toISOString(),e.localeDate=r.toLocaleString()}}function Yt(e,t,r={}){let n=t.LONGDATE??no(t.DATE);if(!n)return;let{separator:i}=r,o=Number(n)*1e3;Vt(e,o||ao(n,i))}function ao(e,t){let r=so(e,t),n=oo(r,{});if(Gt(n)){let o=n.getTimezoneOffset()*60*1e3;return Ht(n)-o}let i=["dd/MM/yyyy HH:mm:ss","EEE MMM dd HH:mm:ss yyyy","dd/MM/yyyy HH:mm:ss","yyyy/MM/dd HH:mm:ss.SSS X","yyyy/MM/dd HH:mm:ssX","yyyy/MM/dd HH:mm:ss.SSS","yyyy/MM/dd HH:mm:ss","yyyy/MM/dd HH:mm","yyyy/MM/dd","yy/MM/dd"];for(let o of i){let s=io(r,o,new ro,{useAdditionalDayOfYearTokens:!0});if(Gt(s))return Ht(s)}return null}function Kt(e,t,r){let{prefix:n="",separator:i}=r;(t.LONGDATE||t.DATE)&&Yt(e,t,{separator:i}),D(e,"pulseSequence",t[".PULSESEQUENCE"]||t[".PULPROG"]||t[`${n}PULPROG`]);let o=t[`${n}OWNER`];if(o&&D(e,"owner",o.replaceAll(/\$\$.*/gm,"")),D(e,"title",t.TITLE),D(e,"aqMod",t[`${n}AQ_mod`]),D(e,"windowMultiplicationMode",t[`${n}WDW`]),D(e,"experiment",le(e,t,{prefix:n})),D(e,"solvent",t[".SOLVENTNAME"]||co(t[`${n}SOLVENT`])),D(e,"temperature",t[`${n}TE`]||t[".TE"]),D(e,"type",t.DATATYPE),D(e,"dataClass",t[`${n}DATACLASS`]),D(e,"phc0",t[`${n}PHC0`]),D(e,"phc1",t[`${n}PHC1`]),e.type){let s=e.type[0].toUpperCase();s.includes("FID")?(e.isFid=!0,e.isComplex=!0):s.includes("SPECTRUM")&&(e.isFt=!0)}if(D(e,"firstX",t[`${n}FIRSTX`]),D(e,"lastX",t[`${n}LASTX`]),D(e,"numberOfPoints",t[`${n}NPOINTS`]),`${n}REVERSE`in t){let s=t[`${n}REVERSE`];e.reverse=(Array.isArray(s)?s:[s]).map(a=>typeof a=="string"?a.includes("yes"):a)}}function Zt(e){let{JCAMPDX:t="",ORIGIN:r=""}=e,n=String(t).toLowerCase()+String(r).toLowerCase();return"SPECTROMETER/DATASYSTEM"in e&&(n=e["SPECTROMETER/DATASYSTEM"]),(n.includes("mestre")||n.includes("nova"))&&(n="mnova"),n}import{isAnyArray as lo}from"is-any-array";import{calculateRelativeFrequency as mo}from"nmr-processing";function Qt(e,t,r){let{prefix:n=""}=r;if(E(e,"originFrequency",t[`${n}SFO1`]),e.dimension===1&&E(e,"originFrequency",t[".OBSERVEFREQUENCY"]),!e.originFrequency&&e.dimension===2&&".OBSERVEFREQUENCY"in t){let i=Z(t[".OBSERVEFREQUENCY"]);if(lo(i)&&i.length>1){let o=t[`${n}SYMBOL`].split(","),s=o.findIndex(c=>c.includes("2")),a=o.findIndex(c=>c.includes("1"));s!==-1&&a!==-1?e.originFrequency=[i[s],i[a]]:e.originFrequency=i.slice()}else typeof i=="number"&&(e.originFrequency=mo(e.nucleus,i))}(!e.originFrequency||e.originFrequency.some(i=>Number.isNaN(i)||i===0))&&(e.originFrequency=e.dimension>1?[400,400]:[400],r.logger?.warn("Frequency could not be determined, set to 400 MHz"))}function C(e,t,r=""){return e.every(n=>`${r}${n}`in t)}function er(e,t,r){let{prefix:n=""}=r,i=t[`${n}REFERENCE_POINT`];if(!("baseFrequency"in e)&&"originFrequency"in e&&D(e,"baseFrequency",e.originFrequency),!("frequencyOffset"in e)&&i&&C(["spectralWidth","baseFrequency"],e)){let o=typeof i=="number"?i:Number(t[`${n}REFERENCE_POINT`].match(/(?<reference>[+-]?\d+(?:\.\d+)?)\s*.*/)?.groups?.reference);if(!Number.isNaN(o)){let{spectralWidth:s,baseFrequency:a}=e;D(e,"frequencyOffset",.5*s[0]*a[0]-o)}}if(!("frequencyOffset"in e)&&C(["baseFrequency","originFrequency"],e)){let{baseFrequency:o,originFrequency:s}=e;D(e,"frequencyOffset",$([s,o],a=>(a[0]-a[1])*1e6))}!e.frequencyOffset[0]&&".SHIFTREFERENCE"in t&&uo(t,e)}function uo(e,t){let r=e[".SHIFTREFERENCE"],n=r.trim().startsWith("(")?/\((?<data>[^)]+)\)/:/(?<data>[^)]+)/,i=r.match(n);if(i.groups.data){let o=i.groups.data.split(",");if(o.length<4)return;let s=Number.parseInt(t.numberOfPoints,10),{spectralWidth:a,baseFrequency:c}=t,l=Number.parseInt(o[2],10),m=Number.parseFloat(o[3]),u;if(t.isFid){if(!C(["numberOfPoints","spectralWidth"],t))return;u=m+(s*.5-l)*a/s}else if(C(["firstX","lastX","numberOfPoints"],t)){let f=Number.parseFloat(t.firstX),g=Number.parseFloat(t.lastX),y=(g+f)/2,p=(g-f)/(s+1),h=p<0?f:g+(l-1)*p;u=(y-h)/c+m}u!==void 0&&!Number.isNaN(u)&&(t.frequencyOffset=u*c)}}import{isAnyArray as Q}from"is-any-array";function be(e){return typeof e=="number"}function Fe(e){let{phc0:t,phc1:r}=e;return!Q(t)&&!be(t)||!Q(r)&&!be(r)||Q(t)&&!be(t[0])||Q(r)&&!be(r[0])?{}:(Q(r)?r[0]*=-1:r*=-1,Q(t)?t[0]*=-1:t*=-1,{phc0:t,phc1:r})}function tr(e,t){let{T1NUCLEUS:r,T2NUCLEUS:n,PAGE:i}=t;e.pulseSequence=t.EXPERIMENT||t[".PULSESEQUENCE"];let o=[],{dimension:s,isComplex:a}=e;if(s===2&&e.pulseSequence==="T1"){let m=a?2:1;for(let u=0;u<i.length;u+=m){let f=i[u].replace(/T1=/,"");o.push(Number(f))}t.vdlistValues=o}e.nucleus=s>1?[n,r]:[n];let{phc0:c,phc1:l}=e;if(c&&l){let m=Fe({phc0:c,phc1:l});e={...e,...m}}}import{getOneIfArray as ir}from"@zakodium/nmrium-core";import{getGyromagneticRatio as po}from"gyromagnetic-ratio";function nr(e,t,r){if(e>0)return e;if(t>14||t===0)return 0;if(rr[t]){let n=rr[t];if(!n[r])throw new Error(`decim ${r} not in lookup table for dspfvs ${t}`);return n[r]}else throw new Error(`dspfvs ${t} not in lookup table`)}var rr={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}};function or(e,t,r){let{prefix:n=""}=r,i=e.nucleus[0],o=po(i);if(D(e,"probeName",t[`${n}PROBHD`]),D(e,"baseFrequency",t[`${n}BF1`]||t[`${n}SF`]),E(e,"scaleFactor",t[`${n}NC_proc`]),"scaleFactor"in e&&(e.scaleFactor=e.scaleFactor.map(a=>2**a)),!("baseFrequency"in e)&&"originFrequency"in e?D(e,"baseFrequency",e.originFrequency):e.baseFrequency=Z(e.baseFrequency),o&&C(["baseFrequency","originFrequency"],e)){let a=2*Math.PI*(e.baseFrequency[0]/o)*1e6;D(e,"fieldStrength",a)}if(E(e,"spectralWidth",t[`${n}SW`]||t[`${n}QM_SPECTRAL_WIDTH`]),e.dimension===1&&t[`${n}SweepWidth`]&&e.originFrequency&&E(e,"spectralWidth",t[`${n}SweepWidth`]/e.originFrequency[0]),D(e,"numberOfPoints",t[`${n}TD`],!0),D(e,"spectrumSize",t[`${n}SI`]??e.numberOfPoints),D(e,"sampleName",t[`${n}NAME`]),t[`${n}FNTYPE`]!==void 0&&D(e,"acquisitionMode",Number.parseInt(t[`${n}FNTYPE`],10)),t[`${n}VARNAME`]?.split(",")[0]==="TIME"){let a=typeof t.LAST=="string"?t.LAST.replace(" ","").split(",")[0]:t.LAST;E(e,"acquisitionTime",a)}if(!e.acquisitionTime&&C(["numberOfPoints","spectralWidth"],e)){let{spectralWidth:a,originFrequency:c,numberOfPoints:l}=e;D(e,"acquisitionTime",(l[0]-1)/(2*a[0]*c[0]))}if(t[`${n}P`]){let a=1e6/(ir(t[`${n}P`]).split(r.separator||`
|
|
4
4
|
`)[1].split(" ")[1]*4);D(e,"pulseStrength90",a)}if(t[`${n}D`]){let a=ir(t[`${n}D`]).split(r.separator||`
|
|
5
|
-
`)[1].split(" ")[1];
|
|
6
|
-
`}=r;D(e,"spectralWidth",t[`${n}SweepWidth`]/e.originFrequency[0]);let o=t[`${n}.PULSESEQUENCE`].split(i),s=[];t[".OBSERVENUCLEUS"]&&s.push(t[".OBSERVENUCLEUS"]),t.INDIRECTNUCLEUS&&s.push(t.INDIRECTNUCLEUS),e.nucleus=
|
|
5
|
+
`)[1].split(" ")[1];E(e,"relaxationTime",a)}if(E(e,"numberOfScans",t[`${n}NS`]||t[`${n}QM_NSCANS`]),D(e,"groupDelay",t[`${n}GRPDLY`]),D(e,"dspfvs",t[`${n}DSPFVS`]),D(e,"decim",t[`${n}DECIM`]),e.isFid&&("groupDelay"in e||C(["dspfvs","decim"],e))){let{groupDelay:a,dspfvs:c,decim:l}=e,m=nr(a?.[0]??0,c?.[0],l?.[0]);D(e,"digitalFilter",m)}if(C(["numberOfPoints","spectralWidth"],e)){let{spectralWidth:a,numberOfPoints:c}=e,l=c.map((m,u)=>e.isFid?e.acquisitionTime[0]/(m-1):a[u]/(m-1));D(e,"increment",l)}}function W(e,t=","){if(e&&typeof e=="string")return e.split(t)}function sr(e,t,r){let{prefix:n=""}=r,i=e.dimension<2,o=e.dataClass?.[0].toUpperCase()==="NTUPLES",s=C(["LAST","FIRST","VARDIM","SYMBOL"],t,n);if(i&&(o||s)&&(D(e,"last",W(t[`${n}LAST`])),D(e,"first",W(t[`${n}FIRST`])),D(e,"varDim",W(t[`${n}VARDIM`])),D(e,"symbols",W(t[`${n}SYMBOL`])),e.symbols&&Array.isArray(e.symbols))){e.symbols.includes("R")&&e.symbols.includes("I")&&(e.isComplex=!0);let a=e.symbols.findIndex(c=>c.toLowerCase()==="x");if(E(e,"firstX",e.first[a]),E(e,"lastX",e.last[a]),E(e,"numberOfPoints",e.varDim[a]),!("spectralWidth"in e)){let{lastX:c,numberOfPoints:l,firstX:m,originFrequency:u}=e;D(e,"spectralWidth",e.isFid?$([l,c],f=>f[0]/(2*f[1])):$([c,m,u],f=>Math.abs(f[0]-f[1])/f[2]))}}}import{normalizeNucleus as fo}from"nmr-processing";function xe(e,t,r){let n=[];if(e[`${r}AXNUC`]&&(n=e[`${r}AXNUC`],Array.isArray(n)||(n=[n]),n=L(n)),n.length===0&&e[`${r}NUC1`]&&(n=e[`${r}NUC1`],Array.isArray(n)||(n=[n]),n=L(n)),n.length===0&&e[".NUCLEUS"]){let s=W(e[".NUCLEUS"]);if(e[`${r}SYMBOL`]){let a=e[`${r}SYMBOL`].split(","),c=a.findIndex(m=>m.includes("2")),l=a.findIndex(m=>m.includes("1"));c!==-1&&l!==-1&&s?n=L([s[c],s[l]]):n=L(s).toReversed()}else n=L(s)}n.length===0&&e[".OBSERVENUCLEUS"]&&(n=L([e[".OBSERVENUCLEUS"]])),n.length===0&&t.experiment&&(n=L(ar(t.experiment[0]))),go(e)&&(n=[e["2D_X_NUCLEUS"].replaceAll(/[^A-Za-z0-9]/g,""),e["2D_Y_NUCLEUS"].replaceAll(/[^A-Za-z0-9]/g,"")]);let{pulseSequence:i=[""],experiment:o}=t;return!i[0].toLowerCase().match("1d")&&o&&(o[0].match("jres")||o[0].match("dosy"))&&(n=ar(t.experiment[0])),n.map(fo)}function go(e){return e["2D_X_NUCLEUS"]&&!e["2D_X_NUCLEUS"].includes("off")&&e["2D_Y_NUCLEUS"]&&!e["2D_Y_NUCLEUS"].includes("off")}function ar(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 L(e){if(!e)return[];let t=e.map(n=>String(n).replaceAll(/[^A-Za-z0-9]/g,"").replace("NA","").replace("off","")),r=0;for(let n of t)n||r++;return r===0?t:[]}function cr(e,t,r){let{logger:n,prefix:i=""}=r;if(e.nucleus=xe(t,e,i),e.nucleus.length===0)if(n)n.warn("No nucleus detected, assuming 1H"),e.nucleus=["1H"];else throw new Error("No nucleus detected");e.dimension=e.nucleus.length}function lr(e,t,r={}){let{prefix:n="",separator:i=`
|
|
6
|
+
`}=r;D(e,"spectralWidth",t[`${n}SweepWidth`]/e.originFrequency[0]);let o=t[`${n}.PULSESEQUENCE`].split(i),s=[];t[".OBSERVENUCLEUS"]&&s.push(t[".OBSERVENUCLEUS"]),t.INDIRECTNUCLEUS&&s.push(t.INDIRECTNUCLEUS),e.nucleus=L(s),e.pulseSequence=o[0];let a=o.slice(2,-1);if(s.length>1)if(s[0]===s[1])e.spectralWidth.push(e.spectralWidth[0]);else{let c=JSON.stringify(a).match(/\$\$SW1=\s*(?<sw>[+-]?(?:[0-9]*[.])?[0-9]+)/);if(c?.groups){let{originFrequency:l}=e,m=Number.parseFloat(c.groups.sw);e.spectralWidth.push(m/l[1])}}}function De(e,t={}){let{prefix:r="",logger:n}=t,i={creator:Zt(e),dimension:0,nucleus:[],isFid:!1,isFt:!1},o=JSON.stringify(e),s=/\r\n/.exec(o)?`\r
|
|
7
7
|
`:`
|
|
8
|
-
`,a=[Kt,cr,Xt,Qt],{creator:c=""}=i;c.includes("nanalysis")?a.push(tr):c.toLocaleLowerCase().includes("oxford instruments")&&a.push(lr),c!=="mnova"&&c!=="mestre"&&a.push(or),a.push(sr,er);for(let l of a)l(i,e,{prefix:r,logger:n,separator:s});return ho(i)}function ho(e){return e.dimension===1&&(e.nucleus=[e.nucleus]),Object.fromEntries(Object.entries(e).map(([t,r])=>[t,yo(r)&&r.length===1?r[0]:r]))}var Fo={keepRecordsRegExp:/.*/,keepFiles:!0};async function
|
|
9
|
-
because it didn't match the import filters`);continue}s.push(m)}let a=[],c=s.some(fr),l=s.some(pr);for(let m of s){if(o!=="both"&&m.dataType!=="LINK"){if(fr(m)&&(o==="ft"||o==="preferFT"&&l)){n?.warn(`Skipping raw data ${r?`in ${r}`:"in the JCAMP-DX"} because it didn't match the import filters`);continue}if(pr(m)&&(o==="fid"||o==="preferFID"&&c)){n?.warn(`Skipping FFT data ${r?`in ${r}`:"in the JCAMP-DX"} because it didn't match the import filters`);continue}}a.push(m)}return a}function pr(e){return e.dataType?.toUpperCase().includes("SPECTRUM")&&e.dataClass&&!e.dataClass.toUpperCase().includes("PEAK")}function fr(e){return e.dataType?.toUpperCase().includes("FID")}function gr(e,t={}){let{logger:r,name:n=""}=t;for(let i of e){if(i.dataType==="LINK"&&gr(i.children,t))return!0;let{dataType:o=""}=i,s=o.toLowerCase();if(s.length>0){if(s.includes("spectrum")&&!s.includes("nmr"))return r?.warn(`File ${n} was ignored because it is a ${o}`),!1;if(s.includes("nmr"))return!0}}return!1}import{generateID as Fr}from"@zakodium/nmrium-core";import{parseJcampCS as Ro}from"jcampconverter";import*as wo from"openchemlib";import{isMolfileNotEmpty as Po}from"nmr-processing";import*as yr from"openchemlib";async function hr(e,t={}){let{logger:r,selector:n}=t;if(n?.files&&!n.files.includes(e.relativePath))return{molecules:[],spectra:[]};let i=await e.text(),o=K(i),s={molecules:o,spectra:[]};return o.length===0&&r?.debug(`${e.name} is an empty molfile`),s}function K(e){let t=[];if(!Po(e))return[];let n=yr.Molecule.fromMolfile(e,{customLabelPosition:"superscript"}).toMolfileV3();return t.push({molfile:n}),t}import{isMolfileNotEmpty as To}from"nmr-processing";import*as Oo from"openchemlib";import{getDiastereotopicAtomIDsFromMolfile as Co}from"openchemlib-utils";var Eo=new Set(["ndnmrspectrum","ndnmrfid","nmrspectrum","nmrfid"]);function Se(e){let{dataType:t="",dataClass:r=""}=e,n=t.replaceAll(/\s/g,"").toLowerCase(),i=r.replaceAll(/\s/g,"").toLowerCase();return Eo.has(n)&&i!=="peaktable"}function br(e,t,r={}){let{spectra:n,info:i,meta:o}=e,s=n[0].data,a=[],c={x:"delta",y:"intensity",w:"width",m:"multiplicity",a:"atom"},{logger:l,name:m,spectraData:u}=r,{CROSSREFERENCE:f}=i,g=typeof f!="string"?f:f.split(/\r?\n/).map(x=>x.trim()).filter(Boolean),y=g.find(x=>x?.toLowerCase().includes("structure"));if(y===void 0)return l&&l.warn(`There is not a structure reference for ${m} file, assignment object could not be completed`),null;let p=Number.parseInt(y?.toLowerCase().replace(/_/,"").replace(/structure:\s*blockid\s*=\s*(?<blockId>.*)/,"$<blockId>"),10);if(Number.isNaN(p)||p<1)return l&&l.warn(`Structure block_id not found for ${m} file, assignment object could not be completed`),null;let d=u?.molecules?.find(x=>x.blockId===p)?.molfile??"";if(d===""){let x=t.find(M=>M.info.BLOCKID===p),{MOLFILE:A=""}=x?.meta||{};d=A}if(!To(d))return l&&l.warn(`Empty molfile for ${m} file with structure block_id = ${p}, assignment object could not be completed`),null;let b=Co(Oo,d),F=Fe({...i,...o},{},"");for(let x=0;x<s.x.length;x++){let A={};for(let M in s){let T=s[M][x];typeof T=="string"&&T.startsWith("<")&&T.endsWith(">")&&(T=T.slice(1,-1)),A[c[M]]=T}if("atom"in A){let M=b.map[A.atom-1];F.includes("1H")?M.nbHydrogens>0?(A.diaIDs=M.hydrogenOCLIDs,A.nbHydrogens=M.nbHydrogens):(A.diaIDs=[M.oclID],A.nbHydrogens=M.nbHydrogens):(A.diaIDs=[M.oclID],A.nbHydrogens=1)}a.push(A)}let S={};for(let x of a){let{delta:A,diaIDs:M}=x,T=`${A}_${M.join("_")}`;if(S[T])S[T].atoms.push(x.atom);else{let{atom:j,...re}=x;S[T]={...re,atoms:[x.atom]}}}let I=[];for(let x of g)x.toLowerCase().includes("spectrum")&&I.push(Number(x.toLowerCase().replace(/_/,"").replace(/.*:\s*blockid=(?<blockId>.*)/,"$<blockId>")));if(I.length===0){for(let x of t)if(Se(x)){let{BLOCKID:A}=x.info;I.push(Number(A))}I.length>1&&(I=[],l&&l.warn(`There is not a spectral cross-reference for the peak assignment in the ${m} file`))}return{moleculeBlockID:p,spectraBlockIDs:I,assignments:Object.values(S),molecule:b.molecule}}function xr(e,t,r,n){for(let i of e){let{meta:o,dataClass:s="",dataType:a="",info:c}=i,l=Number.parseInt(String(c.BLOCKID),10);o.MOLFILE?_o(String(o.MOLFILE),t,l):i.jcampCS&&ko(i,t,l),vo(s,a)&&Lo(t,i,e,n),Se(i)&&r.push(i)}}function vo(e,t){return e?.toLowerCase().includes("assignments")&&t?.toLowerCase().includes("assignments")}function Lo(e,t,r,n){let i=br(t,r,{spectraData:e,logger:n.logger,name:n.name});if(e.assignmentsByBlocks||(e.assignmentsByBlocks={}),i){let{spectraBlockIDs:o}=i;for(let s of o)e.assignmentsByBlocks[s]=i}}function ko(e,t,r){t.molecules||(t.molecules=[]);let n=Ro(e,{OCL:wo}),i=K(n?.molfile||"");i.length>0&&t.molecules.push({id:Fr(),blockId:r,...i[0]})}function _o(e,t,r){t.molecules||(t.molecules=[]);let n=K(e);t.molecules.push({id:Fr(),blockId:r,...n[0]})}import{generateID as wr}from"@zakodium/nmrium-core";import{matrixMinMaxZ as Rr,reimPhaseCorrection as Ho}from"ml-spectra-processing";import{xyAutoRangesPicking as Go}from"nmr-processing";function Z(e){return e.slice(0,Math.max(0,e.lastIndexOf(".")))}function Q(e){e.sort((t,r)=>t.from-r.from);for(let t=0;t<e.length-1;t++)e[t].to>e[t+1].from&&(e[t].to=Math.max(e[t+1].to,e[t].to),e[t].signals=e[t].signals.concat(e[t+1].signals),e[t].integration+=e[t+1].integration,e.splice(t+1,1),t--);return e}import{splitPatterns as $o}from"nmr-processing";import{xMaxValue as qo}from"ml-spectra-processing";function ie(e){return e.trim().slice(1,-1).split(/,\s*/).map(t=>t.trim())}var jo={I:"id",X:"from",Y:"to",Hs:"delta",An:"integration",H:"nbAtoms",C:"multiplicity",N:"assignment","(J)":"js"},Dr=["I","X","Y","Hs","An","H","C","N","(J)"];function Sr(e){let t={headersFromParenthesis:[],headersFromComments:[],comments:[],data:[],multiplets:[]},r=e.split(/\r?\n/).filter(n=>n.trim()!=="");if(r.length===0)return t;if(r[0].startsWith("(")&&!r[0].match(/\d/)){let n=r.shift();t.headersFromParenthesis=ie(n)}return t.comments=r.filter(n=>n.startsWith("$$")).map(n=>n.replace(/^\$\$\s*/,"")),t.headersFromComments=Uo(t.comments),t.data=r.filter(n=>!n.startsWith("$$")).map(ie),t.multiplets=Bo(t),t}function Bo(e,t={}){let{logger:r}=t,n=e.data[0].map((c,l)=>l).filter(c=>e.data.every(l=>Number.isNaN(l[c])||Number.isNaN(Number(l[c]))));if(r?.trace(`Parsing JCAMP-DX assignment: stringColumnIndexes: ${n.join(",")}`),n.length===0)return r?.warn("Parsing JCAMP-DX assignment: No string columns found. Skipping parsing of assignment."),[];let i=n[0],o;if(e.headersFromParenthesis.length>0&&e.headersFromParenthesis[i]==="C")o=e.headersFromParenthesis;else if(e.headersFromComments.length>0&&e.headersFromComments[i]==="C")o=e.headersFromComments;else if(Dr[i]==="C")o=Dr;else return r?.warn("No header found for multiplicity. Skipping parsing of assignment."),[];return qo(e.data.map(c=>c.length))>o.length&&r?.warn("Some assignments are containing more values than headers"),e.data.map(c=>{let l={};for(let m=0;m<o.length;m++){let u=o[m];l[jo[u]||u]=c[m]}return l})}function Uo(e){return e.map(t=>t.split(":")[0].trim()).filter(t=>t.length>0)}function Ar(e,t={}){let{logger:r}=t,n=Sr(e),i={multiplets:[],comments:n.comments};for(let o of n.multiplets){let{id:s,from:a,to:c,delta:l,integration:m,nbAtoms:u,multiplicity:f}=o,g={id:s,js:[],multiplicity:"",...zo({from:a,to:c,delta:l,integration:m,nbAtoms:u})};if(typeof o.js=="string"){let y=o.js.split(/\s+/).map(Number.parseFloat),p=0,h=$o(f).map(F=>{let S=(F?.multiplicity||1)-1;return p+=S,{value:F.value,multiplicity:F?.multiplicity,js:y.slice(p-S,p)}}),d=h.reduce((F,S)=>F+(S.multiplicity?S.multiplicity-1:0),0);y.length!==d&&r?.warn(`The number of j values (${y.length}) is not equal to the sum of the multiplicities - 1 (${d})`);let b=[];for(let F of h){if(F.js.every(S=>S===F.js[0])){b.push(F);continue}if(F.multiplicity!==F.js.length+1){b.push(F);continue}for(let S=0;S<F.multiplicity-1;S++)b.push({value:"d",multiplicity:2,js:[F.js[S]]})}b.sort((F,S)=>S.js[0]-F.js[0]),g.js=b.map(F=>({coupling:F.js[0],multiplicity:F.value}))}typeof o.assignment=="string"&&(g.assignment=Wo(o.assignment)),typeof o.multiplicity=="string"&&(g.multiplicity=o.multiplicity),i.multiplets.push(g)}return i}function zo(e){let t={};for(let r in e){let n=e[r],i=typeof n=="number"?n:Number.parseFloat(n);Number.isNaN(i)||(t[r]=i)}return t}var Jo={quot:'"',apos:"'",comma:",",amp:"&",lpar:"(",rpar:")",lt:"<",gt:">",colon:":",semi:";"};function Wo(e){return e.replaceAll(/&(\w+);/gi,(t,r)=>Jo[r.toLowerCase()]||t)}function Ir(e){let t=e.split(/\r?\n/).filter(n=>n.trim()!==""),r=[];for(let n of t)if(n.startsWith("(")){let[i,o,s]=ie(n).map(Number.parseFloat);r.push({id:i,x:o,y:s})}return r}function Mr(e,t={}){let r={};if(!e["OBSERVED MULTIPLETS"])return[];let n=Ar(e["OBSERVED MULTIPLETS"],t);if(!n)return[];let{multiplets:i}=n;for(let o of i){let{id:s,from:a,to:c,integration:l=0,...m}=o;r[s]={from:a,to:c,integration:l,signals:[{id:s,...m}]}}if(e["OBSERVED MULTIPLETS PEAKS"]){let o=Ir(e["OBSERVED MULTIPLETS PEAKS"]),s={};for(let a of o){let{id:c,x:l,y:m}=a;s[c]||(s[c]=[]),s[c].push({x:l,y:m,width:.05})}for(let a in r)s[a]&&(r[a].signals[0].peaks=s[a])}return Q(Object.values(r))}function Nr(e,t){let n=[...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})),i=[...t.nucleus[0].matchAll(/[0-9]*(?<element>[A-Z][a-z]?)/g,"$element")][0].groups.element;return n.find(o=>o.element===i)?.count||100}function Pr(e){let t={};return".PHASE0"in e&&(t.ph0=Number.parseFloat(e[".PHASE0"]),t.ph1=Number.parseFloat(e[".PHASE1"])),t}function Ze(e){let{ph0:t,ph1:r}=e;return Number.isFinite(t)&&Number.isFinite(r)}import{generateID as Er}from"@zakodium/nmrium-core";function Tr(e,t,r){for(let n=0;n<e.length;n++){if(t.includes(n))continue;let{delta:i,multiplicity:o="",diaIDs:s}=e[n],a=i-.01,c=i+.01;r.push({from:a,to:c,integration:1,id:Er(),signals:[{id:Er(),delta:i,multiplicity:o,diaIDs:s}]})}}import{linearSumAssignment as Xo}from"linear-sum-assignment";import{xCostMatrix as Vo}from"ml-spectra-processing";function Or(e,t){let r=e.map(s=>s.delta),n=t.map(s=>s.delta),i=Vo(n,r,{fct:(s,a)=>Math.abs(s-a)}),{rowAssignments:o}=Xo(i,{maximaze:!1});return Array.from(o)}function Cr(e,t){let{assignments:r,ranges:n}=t;r?.sort((s,a)=>a.delta-s.delta);let i=[],o=[];for(let s of n){let a=0,{from:c,to:l}=s,m=[];for(let u=a;u<r.length;u++){let{delta:f}=r[u];f<=l&&f>=c?(m.push(r[u]),o.push(u)):f>l&&(a=u)}if(m.length>0){let u=s.signals,f=[],g=m.length>1&&u.length>1?Or(u,m):[0];for(let y=0;y<m.length;y++){let p=g[y],{delta:h,multiplicity:d,diaIDs:b}=m[y];p>-1?f.push({...u[p],diaIDs:b}):f.push({delta:h,multiplicity:d,diaIDs:b})}s.signals=f,i.push(s)}}Tr(r,o,i),i.sort((s,a)=>s.from-a.from),e.ranges={values:Q(i).map(s=>{let{integration:a,...c}=s;return c}),options:{sum:t.integrationSum,isSumConstant:!0,sumAuto:!0}},e.ranges.options.moleculeId=String(t.moleculeId)}function vr(e,t,r,n,i){let{logger:o}=i,s={components:Lr(e)?Zo(e,r.isFid):Ko(e)},{name:a=r.title||`jcamp_${wr()}`}=i,c={dependentVariables:[s],meta:t,info:{...r,name:Z(a)}};return Yo(e)&&Qo(c,n,t,e,r,{logger:o}),c}function Lr(e){return"minMax"in e}function Yo(e){return!Lr(e)}function Ko(e){return e.spectra.map(t=>{let r=U(t.data);return{...t,data:r}})}function Zo(e,t){let r={...e.minMax,z:U(e.minMax?.z)};return t?es(r):{rr:r}}function Qo(e,t,r,n,i,o){let{assignmentsByBlocks:s}=t,a=Pr(r);Ze(a)&&ts(e,a);let c=String(n.info.BLOCKID);if(s?.[c]){let{molecule:l,assignments:m,moleculeBlockID:u}=s[c],f=Nr(l,i),g=U(n.spectra[0].data);if(g.x[0]>g.x[1])for(let d of n.spectra)d.data.x.reverse(),d.data.y.reverse();if(Ze(a)&&n.spectra.length>1){let{re:d}=rs(n,a);g.y=d}let{x:y,y:p}=g,h=Mr(r,o)??Go({x:y,y:p},{peakPicking:{frequency:i.originFrequency},ranges:{frequency:i.originFrequency,integrationSum:f}});Cr(e,{moleculeId:u,ranges:h,assignments:m,integrationSum:f})}}function es(e){let{z:t,...r}=e,n=[],i=[];for(let a=0;a<t.length;a+=2)n.push(t[a].slice()),i.push(t[a+1].slice());let o=Rr(n),s=Rr(i);return{re:{...r,z:n,minZ:o.min,maxZ:o.max},im:{...r,z:i,minZ:s.min,maxZ:s.max}}}function ts(e,t){let{ph0:r,ph1:n}=t;e.filters||(e.filters=[]),e.filters.push({id:wr(),name:"phaseCorrection",value:{ph0:r,ph1:n,absolute:!1},enabled:!0})}function rs(e,t){let{ph0:r,ph1:n}=t,{re:i,im:o}=Ho({re:e.spectra[0].data.y,im:e.spectra[1].data.y},r*Math.PI/180,n*Math.PI/180);return{re:i,im:o}}function kr(e,t,r){let{logger:n}=r,i=[];for(let o of e)if(o.spectra&&o.spectra.length>0||o.minMax){ns(o);let s={...o.info,...o.meta},a=xe(s,{logger:n});if(a.experiment==="wobble_curve")continue;i.push(vr(o,s,a,t,r))}return i}function ns(e){let t=e.meta["BRUKER FILE EXP"];if(!t)return;let n=(Array.isArray(t)?t:[t]).find(o=>o.slice(0,10).includes("vdlist"));if(!n)return;let i=n.split(`
|
|
10
|
-
`).slice(1);e.info.vdlistValues=ye(i)}async function Ae(e,t={}){let r=await e.text(),n=_r(r,{name:e.name,...t});return ur(n,e,t)}function _r(e,t={}){let r={spectra:[],molecules:[]},{name:n,converter:i={},selector:o={},logger:s}=t,{keepRecordsRegExp:a=/.*/}=i,c={keepSpectra:!0,noContour:!0,noTrimRegExp:/\$MOLFILE/,keepRecordsRegExp:a,logger:s},l=dr(os(e),{name:n,...o,logger:s});for(let m of l)ss(m,r,c,n);if(as(r,o),r.spectra.length===0&&l.length>0){let m=r.molecules.length===0?" nor molecule":"";s?.warn(`No spectra${m} data was loaded from file ${n}`)}return is(r)}function ss(e,t,r,n){let i=[],o=[],s={molecules:[]},{logger:a}=r,c={name:n,logger:a};Ye(e,o,r),xr(o,s,i,c),t.spectra.push(...kr(i,s,c)),t.molecules.push(...s.molecules)}function as(e,t){t.index!==void 0&&(e.spectra=e.spectra.slice(t.index,t.index+1))}function ls(e,t={}){let{selector:r={},converter:n,logger:i}=t;return i?.debug(`Reading JCAMP-DX file: ${e.name}`),Ae(e,{selector:ms(r),converter:n?.jcamp,logger:i})}function ms(e={}){let{jcamp:t={},general:r={}}=e,{dataSelection:n="both"}=r;return{dataSelection:n,...t}}function Qe(){return cs({id:"@zakodium/nmrium-core-plugins#JCAMPDXLoaderPlugin",version:1,shouldSerialize:!0,migrations:[],onReadProcess:{supportedExtensions:["jcamp","jdx","dx"],onFile:ls}})}import{defineNMRiumPlugin as Es}from"@zakodium/nmrium-core";function qr(e){if(e===void 0)return{epoch:null,date:""};let t=e*1e3;return{epoch:t,date:new Date(t).toUTCString()}}var jr={0:"bigEndian",1:"littleEndian"},Br={0:"NONE",1:"GSX",2:"ALPHA",3:"ECLIPSE",4:"MASS_SPEC",5:"COMPILER",6:"OTHER_NMR",7:"UNKNOWN",8:"GEMINI",9:"UNITY",10:"ASPECT",11:"UX",12:"FELIX",13:"LAMBDA",14:"GE_1280",15:"GE_OMEGA",16:"CHEMAGNETICS",17:"CDFF",18:"GALACTIC",19:"TRIAD",20:"GENERIC_NMR",21:"GAMMA",22:"JCAMP_DX",23:"AMX",24:"DMX",25:"ECA",26:"ALICE",27:"NMR_PIPE",28:"SIMPSON"},Ur={0:"64Bit Float",1:"32Bit Float",2:"Reserved",3:"Reserved"},$r={1:"One_D",2:"Two_D",3:"Three_D",4:"Four_D",5:"Five_D",6:"Six_D",7:"Seven_D",8:"Eight_D",9:"not for NMR data formats",10:"not for NMR data formats",11:"not for NMR data formats",12:"Small_Two_D",13:"Small_Three_D",14:"Small_Four_D"},zr={0:"None",1:"Real",2:"TPPI",3:"Complex",4:"Real_Complex",5:"Envelope"},Jr={"-8":"Yotta","-6":"Exa","-7":"Zetta","-5":"Pecta","-4":"Tera","-3":"Giga","-2":"Mega","-1":"Kilo",0:"None",1:"Milli",2:"Micro",3:"Nano",4:"Pico",5:"Femto",6:"Atto",7:"Zepto"},Wr={Yotta:24,Exa:21,Zetta:18,Pecta:15,Tera:12,Giga:9,Mega:6,Kilo:3,None:0,Milli:-3,Micro:-6,Nano:-9,Pico:-12,Femto:-15,Atto:-18,Zepto:-21},Xr={0:"None",1:"Abundance",2:"Ampere",3:"Candela",4:"Celsius",5:"Coulomb",6:"Degree",7:"Electronvolt",8:"Farad",9:"Sievert",10:"Gram",11:"Gray",12:"Henry",13:"Hertz",14:"Kelvin",15:"Joule",16:"Liter",17:"Lumen",18:"Lux",19:"Meter",20:"Mole",21:"Newton",22:"Ohm",23:"Pascal",24:"Percent",25:"Point",26:"Ppm",27:"Radian",28:"Second",29:"Siemens",30:"Steradian",31:"Tesla",32:"Volt",33:"Watt",34:"Weber",35:"Decibel",36:"Dalton",37:"Thompson",38:"Ugeneric",39:"LPercent ",40:"PPT",41:"PPB ",42:"Index"},et={0:"Ranged",1:"Listed",2:"Sparse",3:"Listed"};function w(e,t){return e.paramArray.find(r=>r.name===t)}function Vr(e,t){let r=e.paramArray.find(p=>p.name==="orders"),n=e.paramArray.find(p=>p.name==="factors"),i=e.paramArray.find(p=>p.name==="x_sweep"),o=e.paramArray.find(p=>p.name==="x_acq_time"),s=e.paramArray.find(p=>p.name==="x_points");if(!r||!n||!i||!o||!s){t?.error("There is not all parameters to calculate the number of point of digital filter");return}let a=r.value,c=Number.parseInt(a.slice(0,1),10),l=a.slice(1).length/c,m=0,u=new Int8Array(c),f=1,g=0;for(let p=0;p<c;p++)u[p]=Number.parseInt(n.value.slice(g,g+1),10),g+=1;for(let p=0;p<c;p++){let h=1;for(let d=p;d<c;d++)h*=u[d];m+=(Number.parseInt(a.slice(f,f+l),10)-1)/h,f+=l}return m/=2,m/i.value/o.value*(s.value-1)}function E(e,t){let r=w(e,t);if(r===void 0)return{magnitude:"NA",unit:"NA"};let n=r.unit[0],i=n.base,o=Wr[n.prefix];return{magnitude:r.value*10**o,unit:i}}function tt(e){let t=e.readBytes(4),r=1990+(t[0]>>1),n=(t[0]<<3&8)+(t[1]>>5),i=t[2]&31;return{year:r,month:n,day:i}}function Ie(e,t){let r=[];for(let n=0;n<t;n++){let i=e.readByte(),o=i>>4,s=Jr[o],a=i&15,c=e.readInt8(),l=Xr[c];r.push({prefix:s,power:a,base:l})}return r}function z(e,t){let r=[];for(let n=0;n<t;n++){let i=e.readChar();i!=="\0"&&r.push(i)}return r.join("")}function rt(e,t){let r=[];for(let n=0;n<t;n++){let i=e.readChar();i!==" "&&r.push(i)}return r.join("")}function N(e,t,r){let n=[];for(let i=0;i<t;i++)switch(r){case"readUint32":n.push(e.readUint32());break;case"readFloat64":n.push(e.readFloat64());break;case"readFloat32":n.push(e.readFloat32());break;case"readUint8":n.push(e.readUint8());break;default:break}return n}function Hr(e,t){let r=[];for(let n=0;n<t;n++)r.push(e.readBoolean());return r}function Gr(e,t,r){let n=1,i=0;for(let o of t.dataAxisType)o==="Real_Complex"&&i===0&&(n+=1,i+=1),o==="Complex"&&(n*=2);if(t.dataType!=="32Bit Float"&&t.dataType!=="64Bit Float"){r?.error("Only 32Bit Float and 64Bit Float data types are implemented yet");return}if(t.dataFormat==="One_D"){if(n!==1&&n!==2){r?.error("One_D data must have one or two data sections");return}return ps(e,t,n)}else if(t.dataFormat==="Two_D"){if(n===2)return fs(e,t);if(n===4)return ds(e,t);r?.error("Two_D data must have two or four data sections");return}else{r?.error("Only One_D and two_D data formats are implemented yet");return}}function ps(e,t,r){return r===1?{re:nt(e,t)}:{re:nt(e,t),im:nt(e,t)}}function nt(e,t){return t.dataType==="32Bit Float"?N(e,t.dataPoints[0],"readFloat32"):N(e,t.dataPoints[0],"readFloat64")}var L=32;function fs(e,t){let r=t.dataPoints[0],i=t.dataPoints[1]/L,o=r/L;return{re:ee(e,t,i,o),im:ee(e,t,i,o)}}function ds(e,t){let r=t.dataPoints[0],i=t.dataPoints[1]/L,o=r/L;return{re:{re:ee(e,t,i,o),im:ee(e,t,i,o)},im:{re:ee(e,t,i,o),im:ee(e,t,i,o)}}}function ee(e,t,r,n){let i=[];for(let o=0;o<r;o++){let s=[];for(let a=0;a<n;a++)for(let c=0;c<L;c++)a===0?t.dataType==="32Bit Float"?s[c]=N(e,L,"readFloat32"):t.dataType==="64Bit Float"&&(s[c]=N(e,L,"readFloat64")):t.dataType==="32Bit Float"?s[c]=s[c].concat(N(e,L,"readFloat32")):t.dataType==="64Bit Float"&&(s[c]=s[c].concat(N(e,L,"readFloat64")));i=i.concat(s)}return i}function Yr(e){let t=e.readChars(8),r=e.readInt8(),n=jr[r],i=e.readUint8(),o=e.readUint16(),s=e.readUint8(),a=e.readByte().toString(2).split("").map(O=>!!Number(O)),c=e.readByte(),l=c>>6,m=Ur[l],u=c&63,f=$r[u],g=e.readInt8(),y=Br[g],p=N(e,8,"readUint8"),h=N(e,8,"readUint8").map(O=>zr[O]),d=Ie(e,8),b=z(e,124),F=[];for(let O of N(e,4,"readUint8")){let ae=O>>4,_e=O&15;F.push(et[ae],et[_e])}let S=N(e,8,"readUint32"),I=N(e,8,"readUint32"),x=N(e,8,"readUint32"),A=N(e,8,"readFloat64"),M=N(e,8,"readFloat64"),T=tt(e),j=tt(e),re=z(e,16),Le=z(e,128),oe=z(e,128),se=z(e,128),J=[];for(let O=0;O<8;O++)J.push(z(e,32));let ke=N(e,8,"readFloat64"),k=N(e,8,"readFloat64"),Jn=Hr(e,8);e.skip(3);let Wn=!!(e.readByte()>>7),Xn=e.readUint32(),Vn=e.readUint32(),Hn=e.readUint32(),Gn=e.readUint32(),Yn=N(e,8,"readUint32"),Kn=N(e,8,"readUint32"),Zn=e.readUint32(),Qn=e.readUint32()<<32|e.readUint32(),ei=e.readUint32()<<32|e.readUint32(),ti=e.readUint32(),ri=e.readUint32()<<32|e.readUint32(),ni=e.readUint32(),ii=e.readUint32()<<32|e.readUint32(),oi=N(e,8,"readUint8"),bt=[];for(let O=0;O<2;O++){let ae=[],_e=e.readInt16();for(let Ft=0;Ft<5;Ft++)ae.push(e.readInt16());bt.push({scaler:_e,unit:ae})}return{fileIdentifier:t,endian:n,majorVersion:i,minorVersion:o,dataDimensionNumber:s,dataDimensionExist:a,dataType:m,dataFormat:f,dataInstrument:y,translate:p,dataAxisType:h,dataUnits:d,title:b,dataAxisRanged:F,dataPoints:S,dataOffsetStart:I,dataOffsetStop:x,dataAxisStart:A,dataAxisStop:M,creationTime:T,revisionTime:j,nodeName:re,site:Le,author:oe,comment:se,dataAxisTitles:J,baseFreq:ke,zeroPoint:k,reversed:Jn,annotationOK:Wn,historyUsed:Xn,historyLength:Vn,paramStart:Hn,paramLength:Gn,ListStart:Yn,ListLength:Kn,dataStart:Zn,dataLength:Qn,contextStart:ei,contextLength:ti,annoteStart:ri,annoteLength:ni,totalSize:ii,unitLocation:oi,compoundUnit:bt}}var gs={0:"String",1:"Integer",2:"Float",3:"Complex",4:"Infinity"};function Kr(e){let t=e.readUint32(),r=e.readUint32(),n=e.readUint32(),i=e.readUint32(),o=[];for(let s=0;s<n+1;s++){e.skip(4);let a=e.readInt16(),c=Ie(e,5);e.skip(16);let l=e.readInt32(),m=gs[l];e.seek(e.offset-20);let u;switch(m){case"String":u=rt(e,16);break;case"Integer":u=e.readInt32(),e.skip(12);break;case"Float":u=e.readFloat64(),e.skip(8);break;case"Complex":u={Real:e.readFloat64(),Imag:e.readFloat64()};break;case"Infinity":u=e.readInt32(),e.skip(12);break;default:e.skip(16);break}e.skip(4);let f=rt(e,28);o.push({name:f.toLowerCase(),scaler:a,unit:c,value:u,valueType:m})}return{parameterSize:t,lowIndex:r,highIndex:n,totalSize:i,paramArray:o}}function Zr(e,t){let r=new R(e);r.setBigEndian();let n=Yr(r);n.endian==="littleEndian"&&r.setLittleEndian(),r.seek(n.paramStart);let i=Kr(r);r.seek(n.dataStart);let o=Gr(r,n,t),s=[],a=[],c=[],l=[],m=[],u=[],f=[],g=[],y=[],p=[];if(n.dataFormat==="One_D"||n.dataFormat==="Two_D"){let d=qr(w(i,"actual_start_time")?.value);d.date&&(a.push(d.date),c.push(d.epoch)),s.push(w(i,"x_domain")?.value),l.push(E(i,"x_acq_time")),m.push(E(i,"x_sweep")),u.push(E(i,"x_sweep_clipped")),f.push(E(i,"x_resolution")),g.push(E(i,"x_freq")),y.push(E(i,"x_offset")),p.push(n.dataUnits[0].base)}return n.dataFormat==="Two_D"&&(s.push(w(i,"y_domain")?.value),l.push(E(i,"y_acq_time")),m.push(E(i,"y_sweep")),f.push(E(i,"y_resolution")),g.push(E(i,"y_freq")),y.push(E(i,"y_offset")),p.push(n.dataUnits[1].base)),{info:{sampleName:w(i,"sample_id")?.value,creationTime:n.creationTime,revisionTime:n.revisionTime,author:n.author,comment:n.comment,solvent:w(i,"solvent")?.value,temperature:E(i,"temp_get"),probeName:w(i,"probe_id")?.value,fieldStrength:E(i,"field_strength"),experiment:w(i,"experiment")?.value,dimension:n.dataDimensionNumber,nucleus:s,date:a,epoch:c,pulseStrength90:E(i,"x90"),numberOfScans:w(i,"scans")?.value,relaxationTime:E(i,"relaxation_delay"),dataPoints:n.dataPoints.slice(0,n.dataDimensionNumber),dataOffsetStart:n.dataOffsetStart,dataOffsetStop:n.dataOffsetStop,dataUnits:p,dataSections:o?Object.keys(o):void 0,originFrequency:g,frequencyOffset:y,acquisitionTime:l,spectralWidth:m,spectralWidthClipped:u,dataAxisStart:n.dataAxisStart,dataAxisStop:n.dataAxisStop,resolution:f,decimationRate:w(i,"decimation_rate")?.value,paramList:JSON.stringify(i.paramArray.map(d=>d.name)),digitalFilter:Vr(i,t)},headers:n,parameters:i,data:o}}import{formatSpectra as Fs}from"@zakodium/nmrium-core";import{getGyromagneticRatio as xs}from"gyromagnetic-ratio";import{isAnyArray as Ds}from"is-any-array";import Ss from"lodash.merge";import{normalizeNucleus as As}from"nmr-processing";import{isAnyArray as te}from"is-any-array";var Qr={0:"uint8",1:"uint16",2:"uint32",3:"uint64",4:"int8",5:"int16",6:"int32",7:"int64",8:"float32",9:"float64",10:"complex64",11:"complex128"},en={0:"scalar",1:"vector",2:"matrix",3:"symetricMatrix",4:"pixel"};function tn(e,t,r={}){let{quantityType:n=0,encoding:i="none",name:o="",unit:s="",quantityName:a="",sparseSampling:c={},from:l=[0],to:m=[-1]}=r;if(te(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 u=ot(e,l,m),{componentLabels:f=u.componentLabels}=r;return{type:"internal",quantityType:en[n],numericType:Qr[t],encoding:i,name:o,unit:s,quantityName:a,componentLabels:f,sparseSampling:c,description:r.description||"",application:r.application||"",components:u.components,dataLength:u.dataLength}}function ys(e){return te(e.re)&&te(e.im)}function hs(e){return!te(e.re[0])}function ot(e,t,r){let n=[],i=[],o=[];if(ys(e))if(hs(e)){n[0]=it(t[0],r[0],e.re.length);let s=new Float64Array(n[0]);for(let a=0;a<n[0];a+=2){let c=a+t[0]*2;s[a]=e.re[c/2],s[a+1]=e.im[c/2]}o.push(s),i.push("complex")}else if(te(e.re[0])){n[0]=bs(t[1],r[1],e.re.length),n[1]=it(t[0],r[0],e.re[0].length);for(let s=0;s<n[0];s++){let a=new Float64Array(n[1]);for(let c=0;c<n[1];c+=2){let l=c+t[0]*2;a[c]=e.re[s][l/2],a[c+1]=e.im[s][l/2]}o.push(a)}}else throw new Error("check your object");else if(te(e.re.re)){n[0]=it(t[1],r[1],e.re.re.length);let s=ot(e.re,t,r).components,a=ot(e.im,t,r).components;for(let c=0;c<n[0]/2;c++)o.push(s[c],a[c])}else throw new Error("check the dimension or the type of data in your array");return{dataLength:n,componentLabels:i,components:o}}function bs(e,t,r){return t-e+1<r?t-e+1:r}function it(e,t,r){return t-e+1<r?(t-e+1)*2:r*2}async function nn(e,t={}){let r=await e.arrayBuffer(),{name:n=Z(e.name)}=t,i={spectra:[],molecules:[]},s=Ns(r)[0],{metadata:a,...c}=s.description,l=0,m=c.dimension===1?"1d":"2d",u="NMR SPECTRUM",f=c.dimension===1?c.nucleus[0]:c.nucleus,g=c.spectralWidthClipped[0],y;s.dependentVariables&&(c.dimension===1?y=Is(s):c.dimension===2&&(y=Ms(s)));for(let h in c)Array.isArray(c[h])&&c[h].length===1&&(c[h]=c[h][0]);let p={data:y,info:{...c,acquisitionMode:l,experiment:m,type:u,nucleus:f,spectralWidthClipped:g,name:n},meta:a,selector:{files:[e.relativePath]}};return i.spectra=[p],Fs(i)}function Is(e){let t=e.dimensions[0],r=e.dependentVariables,n=t.quantityName,i=t.count,o=t.increment.magnitude,s=t.originOffset.magnitude,a=t.coordinatesOffset.magnitude,c=r[0].components[0],l=new Float64Array(i),m=new Float64Array(i);for(let p=c.length-1,h=0;p>0;p-=2)l[h]=c[p-1],m[h++]=c[p];let u={},[f,g]=[0,0];switch(n){case"frequency":g=0+a/s*1e6,f=o/s*1e6,u.re=l,u.im=m;break;case"time":g=s,f=o,u.re=l.reverse(),u.im=m.reverse().map(p=>-p);break;default:break}let y=[];for(let p=0;p<i;p++)y.push(g+p*f);return u.x=y,u}function Ms(e){let t=e.dimensions,r=e.dependentVariables,n=t[0].quantityName,i=[],o=[],s=Number.MIN_SAFE_INTEGER,a=Number.MAX_SAFE_INTEGER,c=Number.MAX_SAFE_INTEGER,l=Number.MIN_SAFE_INTEGER;for(let f of r[0].components){let g=new Float64Array(f.length/2),y=new Float64Array(f.length/2);for(let p=f.length-1,h=0;p>0;p-=2){let d=f[p-1],b=f[p];d>s&&(s=d),d<a&&(a=d),b>l&&(l=b),b<c&&(c=b),g[h]=d,y[h++]=b}if(n==="frequency")i.push(g),o.push(y);else{let p=g.length,h=new Float64Array(y.length);for(let d=0,b=p-1;d<p;d++)h[d]=-y[b--];i.push(g.reverse()),o.push(h)}}let m={re:{z:i,minZ:a,maxZ:s},im:{z:o,minZ:c,maxZ:l}},u=["X","Y"];for(let f=0;f<u.length;f++){let g=t[f].count,y=t[f].increment.magnitude,p=t[f].originOffset.magnitude,h=t[f].coordinatesOffset.magnitude,d=u[f];for(let b of["re","im"])n==="frequency"?(m[b][`min${d}`]=0+h/p*1e6,m[b][`max${d}`]=g*(y/p)*1e6):(m[b][`min${d}`]=p,m[b][`max${d}`]=g*y)}return m}function Ns(e){let t=Zr(e),r=t.info,n=t.headers,{paramArray:i,...o}=t.parameters,{dimension:s}=r,a={};for(let d of i){let{name:b,value:F}=d;a[b]=on(F,s)}let c=t.data,l={title:`title: ${n.title} / comment: ${n.comment} / author:${n.author} / site: ${n.site}`,nucleus:r.nucleus.map(As),sampleName:r.sampleName,date:r.date,epoch:r.epoch,localeDate:new Date(r.epoch[0]).toLocaleString(),author:r.author,solvent:r.solvent,temperature:r.temperature.magnitude,probeName:r.probeName||"",fieldStrength:r.fieldStrength.magnitude},m=l.nucleus.map(xs);l.baseFrequency=m.map(d=>r.fieldStrength.magnitude*d/(2*Math.PI*1e6)),l.pulseSequence=r.experiment,l.temperature=r.temperature?.unit?.toLowerCase()==="celsius"?273.15+r.temperature.magnitude:r.temperature.magnitude,l.digitalFilter=r.digitalFilter,l.pulseStrength90=1/(4*r.pulseStrength90.magnitude),l.numberOfScans=r.numberOfScans,l.relaxationTime=r.relaxationTime.magnitude,l.isComplex=r.dataSections?r.dataSections.includes("im"):!1,l.isFid=r.dataUnits[0]==="Second",l.isFt=r.dataUnits[0]==="Ppm",l.dimension=r.dimension,l.originFrequency=r.originFrequency.map(d=>d.magnitude/1e6).slice(0,s),l.numberOfPoints=r.dataPoints.slice(0,1),l.frequencyOffset=r.frequencyOffset.map((d,b)=>d.magnitude*l.baseFrequency[b]).slice(0,s),l.acquisitionTime=r.acquisitionTime.map(d=>d.magnitude).slice(0,s),l.spectralWidth=r.spectralWidth.map((d,b)=>d.magnitude/r.originFrequency[b].magnitude*1e6).slice(0,s),l.spectralWidthClipped=r.spectralWidthClipped.map((d,b)=>d.magnitude/l.baseFrequency[b]*1e6).slice(0,s);let u=[],f={},g;for(let d=0;d<r.dimension;d++){if(g={magnitude:r.acquisitionTime[d].magnitude/(r.dataPoints[d]-1),unit:"s"},r.dataUnits[d]==="Second")f.quantityName="time",f.originOffset={magnitude:0,unit:"s"},d===0?f.coordinatesOffset={magnitude:r.digitalFilter*g.magnitude,unit:"s"}:f.coordinatesOffset={magnitude:0,unit:"s"},f.reciprocal={originOffset:{magnitude:r.originFrequency[d].magnitude,unit:"Hz"},quantityName:"frequency",coordinatesOffset:{magnitude:r.frequencyOffset[d].magnitude*r.originFrequency[d].magnitude/1e6,unit:"Hz"}};else if(r.dataUnits[d]==="Ppm"){f.quantityName="frequency";let b=r.originFrequency[d].magnitude;f.originOffset={magnitude:b,unit:"Hz"};let F=r.dataOffsetStart[d],I=r.dataOffsetStop[d]-F+1;g={magnitude:Ps(r,d)/(I-1),unit:"Hz"};let M=r.dataAxisStop[d]*b/1e6;f.coordinatesOffset={magnitude:M,unit:"Hz"},I!==r.dataPoints[d]&&(r.dataPoints[d]=I)}d===0?f.description="direct dimension":f.description="indirect dimension",u.push({label:n.dataAxisTitles[d],count:r.dataPoints[d],increment:g,type:"linear",description:String(f.description)||"",application:f.application||{},coordinatesOffset:f.coordinatesOffset||0,originOffset:f.originOffset||0,quantityName:String(f.quantityName)||"",reciprocal:f.reciprocal||{},period:f.period||0,complexFFT:f.complexFFT||!1})}let y=[tn(c,11,{unit:"none",quantityName:"relative intensity",from:r.dataOffsetStart,to:r.dataOffsetStop})],p={...l};return delete p.paramList,p.metadata={...rn(n,s),...rn(o,s),...Ss({},a)},[{timeStamp:Date.now(),description:p,dimensions:u,dependentVariables:y}]}function Ps(e,t){let{spectralWidth:r,spectralWidthClipped:n}=e;return n[t].magnitude!=="NA"?n[t].magnitude:r[t].magnitude}function rn(e,t){let r={};for(let n in e)r[n]=on(e[n],t);return r}function on(e,t){return Ds(e)?t>1?e.slice(0,t):e[0]:e}function Ts(e,t={}){let{logger:r}=t;return r?.debug(`Reading JEOL file: ${e.name}`),nn(e,{name:e.name,logger:r})}function st(){return Es({id:"@zakodium/nmrium-core-plugins#JEOLLoaderPlugin",version:1,shouldSerialize:!0,migrations:[],onReadProcess:{supportedExtensions:["jdf"],onFile:Ts}})}import{defineNMRiumPlugin as Os}from"@zakodium/nmrium-core";function Cs(e,t={}){let{logger:r,selector:n}=t;return r?.debug(`Reading molfile file: ${e.name}`),hr(e,{logger:r,selector:n})}function at(){return Os({id:"@zakodium/nmrium-core-plugins#MolfileLoaderPlugin",version:1,shouldSerialize:!0,migrations:[],onReadProcess:{supportedExtensions:["mol"],onFile:Cs}})}import{defineNMRiumPlugin as na}from"@zakodium/nmrium-core";import{FileCollection as If}from"file-collection";import{Molecule as xn}from"openchemlib";import{getShortestPaths as Rs}from"openchemlib-utils";function sn(e,t){let{molecule:r,map:n}=t;r.addImplicitHydrogens();let i=Rs(r,{toLabel:"H",maxLength:1});for(let s in e){let a=e[s],c=a.atoms;if(c.length!==0){if(a.position=[],c[0].toLowerCase().includes("h")){let l=Number(c[0].toLowerCase().replace("h",""))-1;l=n.indexOf(l);let m=i[l].find(u=>u&&u.length>1);a.position=i[m[0]].filter(u=>u&&u.length>1).map(u=>u.at(-1))}else if(c[0].toLowerCase().match(/\w/s))for(let l of c){let m=n.indexOf(Number(l)-1);a.position.push(m)}}}let o=r.getDiastereotopicAtomIDs();for(let s in e){let a=[];if("position"in e[s])for(let c of e[s].position)a.includes(o[c])||a.push(o[c]);e[s].diaIDs=a}return e}async function an(e,t){let{fileCollection:r,root:n}=t,i=e.data.filter(s=>s.value.spectrum_location),o=[];for(let s of i){if(!s){new Error(`There is not spectrum for ${e}`);return}let a=s.value.spectrum_location;if(a.match(/file:/s)){let c=n+a.replace(/file:[./]*/s,""),l=c.match(/[ser|fid]/s)?/([.*/]*\w+\/[0-9]+\/).*/:/(.*\w+\/[0-9]+\/)pdata\/.*/,m=c.replace(l,"$1"),u=c.replace(/.*\/[0-9]+\/pdata\/([0-9]+)\/.*/,"$1"),f=r.filter(g=>{if(g.relativePath.match("pdata")&&u!==g.relativePath.replace(/.*\/[0-9]+\/pdata\/([0-9]+)\/.*/,"$1"))return!1;let y=g.relativePath.replace(/([.*/]*\w+\/[0-9]+\/).*/,"$1");return!(m!==y&&!["ser","fid"].some(p=>c===`${y}${p}`))});o.push({type:"brukerFiles",fileCollection:f})}else a.match("http")&&o.push({type:"url",value:a})}return o}async function cn(e,t){let{fileCollection:r,root:n}=t,i=e.data.find(c=>c.value.jcamp_location);if(!i){new Error(`There is not spectrum for ${e}`);return}let o=i.value.jcamp_location,s=n+o.replace(/file:/s,""),a=r.filter(c=>c.relativePath===s);if(a.files.length===0){new Error(`There is not jcamp with path: ${s}`);return}return[{name:s,type:"jcamp",fileCollection:a}]}function ln(e={}){let t={};for(let r of e.data||[]){let{label:n,atoms:i,shift:o}=r.value;t[n]={shift:o,atoms:i}}return t}function mn(e){let t=e.match(/([0-9])\w_/s)?.[1];if(t==="1")return e.slice(3).replaceAll(/(?<nucleus>[0-9]+\w+)#\w+/g,"$<nucleus>");if(t==="2"){let r=[],n=e.slice(12).split("_");for(let i=0;i<n.length;i+=2)r.push(n[i].replaceAll(/(?<nucleus>[0-9]+\w+)#\w+/g,"$<nucleus>"))}return[]}var ws=["delta","nbAtoms","multiplicity","jCoupling"];function un(e,t){let r={};for(let s of ws){let a=e[s];a&&(r[s]=a)}let{nbAtoms:n,integration:i}=e;if(r.integration=i?Number(i):n?Number(n):null,e.assignment)for(let s of e.assignment){let a=t[s];r.diaIDs||(r.diaIDs=[]),a?.diaIDs&&r.diaIDs.push(...a.diaIDs)}let o=!1;if(r.jCoupling&&(o=r.jCoupling.some(s=>Object.keys(s).includes("label"))),o){for(let s of r.jCoupling)if(s.label){let a=t[s.label];a?.diaIDs&&(s.diaIDs=a.diaIDs)}}return r.delta&&(r.delta=Number.parseFloat(r.delta)),r}var vs=["intensity","volume","activeCoupling"],Ls={x:["f1Width","f1Coupling"],y:["f2Width","f2Coupling"]};function pn(e,t){let r={};for(let n of vs)e[n]&&(r[n]=e[n]);for(let n in e.delta){r[n]||(r[n]={});let i=e.delta[n];for(let o of i)r[n].diaIDs||(r[n].diaIDs=[]),t[o]?(r[n].diaIDs.push(...t[o].diaIDs),r[n].delta=Number.parseFloat(t[o].shift)):r[n].delta=Number.parseFloat(o);for(let o of Ls[n])if(e[o]){let s=o.toLowerCase().replace(/f\w(\w+)/,"$1");r[n][s]=e[o]}}return r}async function fn(e,t){let{moleculeAndMap:r}=t,n={molecules:[{molfile:r.molecule.toMolfile()}],spectra:[]},i=n.spectra,o=n.molecules;e.SMILES?.data.length>0&&(o[0].smiles=e.SMILES.data[0].value);let s=ln(e.ASSIGNMENT);s=sn(s,r);for(let a in e){let c=a.toLowerCase();if(!c.match(/[1|2]d_/s))continue;let l=e[a].data.find(d=>d.value.larmor),m=e[a].data.find(d=>d.value.pulseprogram),u=mn(a),f=c.replace(/([1|2]d)_.*/,"$1"),g=f==="2d"?pn:un,y={source:{jcampURL:null},nucleus:u,frequency:l?.value.larmor,experiment:m?m.value.pulseprogram.trim():f,headComment:e[a].headComment},p=e[a].data.filter(d=>d.value.delta);y.signals=p.map(d=>{let b=g(d.value,s);return b.comment=d.comment,b});let h=await ks(e[a],t);if(!h.jcamp&&!h.bruker)i.push(y);else for(let d in h)h[d]&&i.push({...y,source:{...y.source,file:h[d]}})}return n}async function ks(e,t){return{jcamp:await cn(e,t),bruker:await an(e,t)}}function Me(e,t={}){let{include:r,exclude:n,filter:i,modifiers:o={},forEach:s={},dynamicTyping:a=!0,mixedEOL:c=!1}=t;if(typeof e!="string")throw new TypeError('Parameter "sdf" must be a string');let l=`
|
|
8
|
+
`,a=[Kt,cr,Xt,Qt],{creator:c=""}=i;c.includes("nanalysis")?a.push(tr):c.toLocaleLowerCase().includes("oxford instruments")&&a.push(lr),c!=="mnova"&&c!=="mestre"&&a.push(or),a.push(sr,er);for(let l of a)l(i,e,{prefix:r,logger:n,separator:s});return ho(i)}function ho(e){return e.dimension===1&&(e.nucleus=[e.nucleus]),Object.fromEntries(Object.entries(e).map(([t,r])=>[t,yo(r)&&r.length===1?r[0]:r]))}var Fo={keepRecordsRegExp:/.*/,keepFiles:!0};async function Se(e,t={}){let r={spectra:[],molecules:[]},{converter:n={},selector:i={},logger:o}=t,s=ze(e,{logger:o,...Do(i)}),a=[];for(let l of s)a.push(He(l,{...Fo,...n,keepFiles:!0}).then(m=>xo(m,t)));let c=await Promise.allSettled(a);for(let l=0;l<c.length;l++){let m=c[l];if(m.status==="fulfilled"){let u=Fe(m.value.info);r.spectra.push({...m.value,info:{...m.value.info,...u}})}else if(m.reason){let u=s[l].name;o?.warn(`Bruker data: ${u}, fails with: ${m.reason}`);continue}}return o&&o[r.spectra.length>0?"info":"debug"](`Loaded ${r.spectra.length} spectra from Bruker files`),bo(r)}function xo(e,t={}){let{logger:r}=t,n={...e.info,...e.meta},i=De(n,{logger:r}),o={},{isFid:s}=i;if(So(e)){let f=e.minMax;for(let g in f){let y=f[g];y&&(y.z=J(y.z))}o.components=e.minMax}else i.dimension===1&&(o.components=e.spectra);let{source:a}=e,{expno:c,name:l,files:m}=a;n.vdlist&&(n.vdlistValues=he(n.vdlist));let u={dependentVariables:[o],meta:n,info:{...i,experimentNumber:c,name:l}};return m&&(u.selector={files:m.map(f=>f.relativePath)}),Ao(u,e),u}function Do(e){let{general:t={},bruker:r={}}=e,{processingNumbers:n,experimentNumbers:i,...o}=r;return{...t,...o,processingNumbers:mr(n),experimentNumbers:mr(i)}}function mr(e){if(e)return e.split(/[^\d]+/).filter(Boolean).map(t=>Number.parseInt(t,10))}function So(e){let{info:t}=e;return t.twoD}function Ao(e,t){if(!("integrals"in t))return;let{integrals:r=[]}=t;e.integrals={values:r.map(n=>{let{from:i,to:o,integration:s}=n;return{from:i,to:o,integral:s,kind:"signal"}})}}function Mo(e,t){let{selector:r,converter:n,logger:i}=t??{};return Se(e,{converter:n?.bruker,selector:r,logger:i})}function Ge(){return Io({id:"@zakodium/nmrium-core-plugins#BrukerLoaderPlugin",version:1,shouldSerialize:!0,migrations:[],onReadProcess:{onFiles:Mo}})}import{defineNMRiumPlugin as cs}from"@zakodium/nmrium-core";import{formatSpectra as is}from"@zakodium/nmrium-core";import{createTree as os}from"jcampconverter";function ur(e,t,r={}){let{selector:n={}}=r;for(let i=0;i<e.spectra.length;i++){let o=e.spectra[i];o.selector={files:[t.relativePath],jcamp:{index:i,...n}}}return e}import{convert as No}from"jcampconverter";function Ye(e,t,r){let{dataType:n,children:i}=e,o=n==="LINK"&&i?i:[e];for(let s of o){if(s.dataType==="LINK"){Ye(s,t,r);continue}let a=No(s.jcamp,r);t.push(...a.flatten)}}function dr(e,t={}){let r=[],n=gr(e,t);for(let s of n?e:[])s.dataType==="LINK"?s.children=Ke(s.children,t):s=Ke([s],t)[0],r.push(s);let{name:i,logger:o}=t;return e.length===0&&o?.warn(`There is no data ${i?`in ${i}`:"in the JCAMP-DX"}`),r}function Ke(e=[],t={}){let{name:r,logger:n,tree:i=[],dataSelection:o="both"}=t,s=[];for(let m of e){let{dataType:u,dataClass:f}=m;if(u==="LINK")m.children=Ke(m.children,t);else if(i.some(g=>{let{dataClass:y=f,dataType:p=u}=g;return f===y&&u===p})){n?.warn(`Skipping ${f} and ${u} ${r?`in ${r}`:"in the JCAMP-DX"},
|
|
9
|
+
because it didn't match the import filters`);continue}s.push(m)}let a=[],c=s.some(fr),l=s.some(pr);for(let m of s){if(o!=="both"&&m.dataType!=="LINK"){if(fr(m)&&(o==="ft"||o==="preferFT"&&l)){n?.warn(`Skipping raw data ${r?`in ${r}`:"in the JCAMP-DX"} because it didn't match the import filters`);continue}if(pr(m)&&(o==="fid"||o==="preferFID"&&c)){n?.warn(`Skipping FFT data ${r?`in ${r}`:"in the JCAMP-DX"} because it didn't match the import filters`);continue}}a.push(m)}return a}function pr(e){return e.dataType?.toUpperCase().includes("SPECTRUM")&&e.dataClass&&!e.dataClass.toUpperCase().includes("PEAK")}function fr(e){return e.dataType?.toUpperCase().includes("FID")}function gr(e,t={}){let{logger:r,name:n=""}=t;for(let i of e){if(i.dataType==="LINK"&&gr(i.children,t))return!0;let{dataType:o=""}=i,s=o.toLowerCase();if(s.length>0){if(s.includes("spectrum")&&!s.includes("nmr"))return r?.warn(`File ${n} was ignored because it is a ${o}`),!1;if(s.includes("nmr"))return!0}}return!1}import{generateID as Fr}from"@zakodium/nmrium-core";import{parseJcampCS as Ro}from"jcampconverter";import*as wo from"openchemlib";import{isMolfileNotEmpty as Po}from"nmr-processing";import*as yr from"openchemlib";async function hr(e,t={}){let{logger:r,selector:n}=t;if(n?.files&&!n.files.includes(e.relativePath))return{molecules:[],spectra:[]};let i=await e.text(),o=ee(i),s={molecules:o,spectra:[]};return o.length===0&&r?.debug(`${e.name} is an empty molfile`),s}function ee(e){let t=[];if(!Po(e))return[];let n=yr.Molecule.fromMolfile(e,{customLabelPosition:"superscript"}).toMolfileV3();return t.push({molfile:n}),t}import{isMolfileNotEmpty as To}from"nmr-processing";import*as Oo from"openchemlib";import{getDiastereotopicAtomIDsFromMolfile as Co}from"openchemlib-utils";var Eo=new Set(["ndnmrspectrum","ndnmrfid","nmrspectrum","nmrfid"]);function Ae(e){let{dataType:t="",dataClass:r=""}=e,n=t.replaceAll(/\s/g,"").toLowerCase(),i=r.replaceAll(/\s/g,"").toLowerCase();return Eo.has(n)&&i!=="peaktable"}function br(e,t,r={}){let{spectra:n,info:i,meta:o}=e,s=n[0].data,a=[],c={x:"delta",y:"intensity",w:"width",m:"multiplicity",a:"atom"},{logger:l,name:m,spectraData:u}=r,{CROSSREFERENCE:f}=i,g=typeof f!="string"?f:f.split(/\r?\n/).map(x=>x.trim()).filter(Boolean),y=g.find(x=>x?.toLowerCase().includes("structure"));if(y===void 0)return l&&l.warn(`There is not a structure reference for ${m} file, assignment object could not be completed`),null;let p=Number.parseInt(y?.toLowerCase().replace(/_/,"").replace(/structure:\s*blockid\s*=\s*(?<blockId>.*)/,"$<blockId>"),10);if(Number.isNaN(p)||p<1)return l&&l.warn(`Structure block_id not found for ${m} file, assignment object could not be completed`),null;let d=u?.molecules?.find(x=>x.blockId===p)?.molfile??"";if(d===""){let x=t.find(M=>M.info.BLOCKID===p),{MOLFILE:A=""}=x?.meta||{};d=A}if(!To(d))return l&&l.warn(`Empty molfile for ${m} file with structure block_id = ${p}, assignment object could not be completed`),null;let F=Co(Oo,d),b=xe({...i,...o},{},"");for(let x=0;x<s.x.length;x++){let A={};for(let M in s){let P=s[M][x];typeof P=="string"&&P.startsWith("<")&&P.endsWith(">")&&(P=P.slice(1,-1)),A[c[M]]=P}if("atom"in A){let M=F.map[A.atom-1];b.includes("1H")?M.nbHydrogens>0?(A.diaIDs=M.hydrogenOCLIDs,A.nbHydrogens=M.nbHydrogens):(A.diaIDs=[M.oclID],A.nbHydrogens=M.nbHydrogens):(A.diaIDs=[M.oclID],A.nbHydrogens=1)}a.push(A)}let S={};for(let x of a){let{delta:A,diaIDs:M}=x,P=`${A}_${M.join("_")}`;if(S[P])S[P].atoms.push(x.atom);else{let{atom:v,..._}=x;S[P]={..._,atoms:[x.atom]}}}let I=[];for(let x of g)x.toLowerCase().includes("spectrum")&&I.push(Number(x.toLowerCase().replace(/_/,"").replace(/.*:\s*blockid=(?<blockId>.*)/,"$<blockId>")));if(I.length===0){for(let x of t)if(Ae(x)){let{BLOCKID:A}=x.info;I.push(Number(A))}I.length>1&&(I=[],l&&l.warn(`There is not a spectral cross-reference for the peak assignment in the ${m} file`))}return{moleculeBlockID:p,spectraBlockIDs:I,assignments:Object.values(S),molecule:F.molecule}}function xr(e,t,r,n){for(let i of e){let{meta:o,dataClass:s="",dataType:a="",info:c}=i,l=Number.parseInt(String(c.BLOCKID),10);o.MOLFILE?_o(String(o.MOLFILE),t,l):i.jcampCS&&ko(i,t,l),vo(s,a)&&Lo(t,i,e,n),Ae(i)&&r.push(i)}}function vo(e,t){return e?.toLowerCase().includes("assignments")&&t?.toLowerCase().includes("assignments")}function Lo(e,t,r,n){let i=br(t,r,{spectraData:e,logger:n.logger,name:n.name});if(e.assignmentsByBlocks||(e.assignmentsByBlocks={}),i){let{spectraBlockIDs:o}=i;for(let s of o)e.assignmentsByBlocks[s]=i}}function ko(e,t,r){t.molecules||(t.molecules=[]);let n=Ro(e,{OCL:wo}),i=ee(n?.molfile||"");i.length>0&&t.molecules.push({id:Fr(),blockId:r,...i[0]})}function _o(e,t,r){t.molecules||(t.molecules=[]);let n=ee(e);t.molecules.push({id:Fr(),blockId:r,...n[0]})}import{generateID as wr}from"@zakodium/nmrium-core";import{matrixMinMaxZ as Rr,reimPhaseCorrection as Ho}from"ml-spectra-processing";import{xyAutoRangesPicking as Go}from"nmr-processing";function te(e){return e.slice(0,Math.max(0,e.lastIndexOf(".")))}function re(e){e.sort((t,r)=>t.from-r.from);for(let t=0;t<e.length-1;t++)e[t].to>e[t+1].from&&(e[t].to=Math.max(e[t+1].to,e[t].to),e[t].signals=e[t].signals.concat(e[t+1].signals),e[t].integration+=e[t+1].integration,e.splice(t+1,1),t--);return e}import{splitPatterns as $o}from"nmr-processing";import{xMaxValue as qo}from"ml-spectra-processing";function oe(e){return e.trim().slice(1,-1).split(/,\s*/).map(t=>t.trim())}var jo={I:"id",X:"from",Y:"to",Hs:"delta",An:"integration",H:"nbAtoms",C:"multiplicity",N:"assignment","(J)":"js"},Dr=["I","X","Y","Hs","An","H","C","N","(J)"];function Sr(e){let t={headersFromParenthesis:[],headersFromComments:[],comments:[],data:[],multiplets:[]},r=e.split(/\r?\n/).filter(n=>n.trim()!=="");if(r.length===0)return t;if(r[0].startsWith("(")&&!r[0].match(/\d/)){let n=r.shift();t.headersFromParenthesis=oe(n)}return t.comments=r.filter(n=>n.startsWith("$$")).map(n=>n.replace(/^\$\$\s*/,"")),t.headersFromComments=Uo(t.comments),t.data=r.filter(n=>!n.startsWith("$$")).map(oe),t.multiplets=Bo(t),t}function Bo(e,t={}){let{logger:r}=t,n=e.data[0].map((c,l)=>l).filter(c=>e.data.every(l=>Number.isNaN(l[c])||Number.isNaN(Number(l[c]))));if(r?.trace(`Parsing JCAMP-DX assignment: stringColumnIndexes: ${n.join(",")}`),n.length===0)return r?.warn("Parsing JCAMP-DX assignment: No string columns found. Skipping parsing of assignment."),[];let i=n[0],o;if(e.headersFromParenthesis.length>0&&e.headersFromParenthesis[i]==="C")o=e.headersFromParenthesis;else if(e.headersFromComments.length>0&&e.headersFromComments[i]==="C")o=e.headersFromComments;else if(Dr[i]==="C")o=Dr;else return r?.warn("No header found for multiplicity. Skipping parsing of assignment."),[];return qo(e.data.map(c=>c.length))>o.length&&r?.warn("Some assignments are containing more values than headers"),e.data.map(c=>{let l={};for(let m=0;m<o.length;m++){let u=o[m];l[jo[u]||u]=c[m]}return l})}function Uo(e){return e.map(t=>t.split(":")[0].trim()).filter(t=>t.length>0)}function Ar(e,t={}){let{logger:r}=t,n=Sr(e),i={multiplets:[],comments:n.comments};for(let o of n.multiplets){let{id:s,from:a,to:c,delta:l,integration:m,nbAtoms:u,multiplicity:f}=o,g={id:s,js:[],multiplicity:"",...zo({from:a,to:c,delta:l,integration:m,nbAtoms:u})};if(typeof o.js=="string"){let y=o.js.split(/\s+/).map(Number.parseFloat),p=0,h=$o(f).map(b=>{let S=(b?.multiplicity||1)-1;return p+=S,{value:b.value,multiplicity:b?.multiplicity,js:y.slice(p-S,p)}}),d=h.reduce((b,S)=>b+(S.multiplicity?S.multiplicity-1:0),0);y.length!==d&&r?.warn(`The number of j values (${y.length}) is not equal to the sum of the multiplicities - 1 (${d})`);let F=[];for(let b of h){if(b.js.every(S=>S===b.js[0])){F.push(b);continue}if(b.multiplicity!==b.js.length+1){F.push(b);continue}for(let S=0;S<b.multiplicity-1;S++)F.push({value:"d",multiplicity:2,js:[b.js[S]]})}F.sort((b,S)=>S.js[0]-b.js[0]),g.js=F.map(b=>({coupling:b.js[0],multiplicity:b.value}))}typeof o.assignment=="string"&&(g.assignment=Wo(o.assignment)),typeof o.multiplicity=="string"&&(g.multiplicity=o.multiplicity),i.multiplets.push(g)}return i}function zo(e){let t={};for(let r in e){let n=e[r],i=typeof n=="number"?n:Number.parseFloat(n);Number.isNaN(i)||(t[r]=i)}return t}var Jo={quot:'"',apos:"'",comma:",",amp:"&",lpar:"(",rpar:")",lt:"<",gt:">",colon:":",semi:";"};function Wo(e){return e.replaceAll(/&(\w+);/gi,(t,r)=>Jo[r.toLowerCase()]||t)}function Ir(e){let t=e.split(/\r?\n/).filter(n=>n.trim()!==""),r=[];for(let n of t)if(n.startsWith("(")){let[i,o,s]=oe(n).map(Number.parseFloat);r.push({id:i,x:o,y:s})}return r}function Mr(e,t={}){let r={};if(!e["OBSERVED MULTIPLETS"])return[];let n=Ar(e["OBSERVED MULTIPLETS"],t);if(!n)return[];let{multiplets:i}=n;for(let o of i){let{id:s,from:a,to:c,integration:l=0,...m}=o;r[s]={from:a,to:c,integration:l,signals:[{id:s,...m}]}}if(e["OBSERVED MULTIPLETS PEAKS"]){let o=Ir(e["OBSERVED MULTIPLETS PEAKS"]),s={};for(let a of o){let{id:c,x:l,y:m}=a;s[c]||(s[c]=[]),s[c].push({x:l,y:m,width:.05})}for(let a in r)s[a]&&(r[a].signals[0].peaks=s[a])}return re(Object.values(r))}function Nr(e,t){let n=[...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})),i=[...t.nucleus[0].matchAll(/[0-9]*(?<element>[A-Z][a-z]?)/g,"$element")][0].groups.element;return n.find(o=>o.element===i)?.count||100}function Pr(e){let t={};return".PHASE0"in e&&(t.ph0=Number.parseFloat(e[".PHASE0"]),t.ph1=Number.parseFloat(e[".PHASE1"])),t}function Ze(e){let{ph0:t,ph1:r}=e;return Number.isFinite(t)&&Number.isFinite(r)}import{generateID as Er}from"@zakodium/nmrium-core";function Tr(e,t,r){for(let n=0;n<e.length;n++){if(t.includes(n))continue;let{delta:i,multiplicity:o="",diaIDs:s}=e[n],a=i-.01,c=i+.01;r.push({from:a,to:c,integration:1,id:Er(),signals:[{id:Er(),delta:i,multiplicity:o,diaIDs:s}]})}}import{linearSumAssignment as Xo}from"linear-sum-assignment";import{xCostMatrix as Vo}from"ml-spectra-processing";function Or(e,t){let r=e.map(s=>s.delta),n=t.map(s=>s.delta),i=Vo(n,r,{fct:(s,a)=>Math.abs(s-a)}),{rowAssignments:o}=Xo(i,{maximaze:!1});return Array.from(o)}function Cr(e,t){let{assignments:r,ranges:n}=t;r?.sort((s,a)=>a.delta-s.delta);let i=[],o=[];for(let s of n){let a=0,{from:c,to:l}=s,m=[];for(let u=a;u<r.length;u++){let{delta:f}=r[u];f<=l&&f>=c?(m.push(r[u]),o.push(u)):f>l&&(a=u)}if(m.length>0){let u=s.signals,f=[],g=m.length>1&&u.length>1?Or(u,m):[0];for(let y=0;y<m.length;y++){let p=g[y],{delta:h,multiplicity:d,diaIDs:F}=m[y];p>-1?f.push({...u[p],diaIDs:F}):f.push({delta:h,multiplicity:d,diaIDs:F})}s.signals=f,i.push(s)}}Tr(r,o,i),i.sort((s,a)=>s.from-a.from),e.ranges={values:re(i).map(s=>{let{integration:a,...c}=s;return c}),options:{sum:t.integrationSum,isSumConstant:!0,sumAuto:!0}},e.ranges.options.moleculeId=String(t.moleculeId)}function vr(e,t,r,n,i){let{logger:o}=i,s={components:Lr(e)?Zo(e,r.isFid):Ko(e)},{name:a=r.title||`jcamp_${wr()}`}=i,c={dependentVariables:[s],meta:t,info:{...r,name:te(a)}};return Yo(e)&&Qo(c,n,t,e,r,{logger:o}),c}function Lr(e){return"minMax"in e}function Yo(e){return!Lr(e)}function Ko(e){return e.spectra.map(t=>{let r=J(t.data);return{...t,data:r}})}function Zo(e,t){let r={...e.minMax,z:J(e.minMax?.z)};return t?es(r):{rr:r}}function Qo(e,t,r,n,i,o){let{assignmentsByBlocks:s}=t,a=Pr(r);Ze(a)&&ts(e,a);let c=String(n.info.BLOCKID);if(s?.[c]){let{molecule:l,assignments:m,moleculeBlockID:u}=s[c],f=Nr(l,i),g=J(n.spectra[0].data);if(g.x[0]>g.x[1])for(let d of n.spectra)d.data.x.reverse(),d.data.y.reverse();if(Ze(a)&&n.spectra.length>1){let{re:d}=rs(n,a);g.y=d}let{x:y,y:p}=g,h=Mr(r,o)??Go({x:y,y:p},{peakPicking:{frequency:i.originFrequency},ranges:{frequency:i.originFrequency,integrationSum:f}});Cr(e,{moleculeId:u,ranges:h,assignments:m,integrationSum:f})}}function es(e){let{z:t,...r}=e,n=[],i=[];for(let a=0;a<t.length;a+=2)n.push(t[a].slice()),i.push(t[a+1].slice());let o=Rr(n),s=Rr(i);return{re:{...r,z:n,minZ:o.min,maxZ:o.max},im:{...r,z:i,minZ:s.min,maxZ:s.max}}}function ts(e,t){let{ph0:r,ph1:n}=t;e.filters||(e.filters=[]),e.filters.push({id:wr(),name:"phaseCorrection",value:{ph0:r,ph1:n,absolute:!1},enabled:!0})}function rs(e,t){let{ph0:r,ph1:n}=t,{re:i,im:o}=Ho({re:e.spectra[0].data.y,im:e.spectra[1].data.y},r*Math.PI/180,n*Math.PI/180);return{re:i,im:o}}function kr(e,t,r){let{logger:n}=r,i=[];for(let o of e)if(o.spectra&&o.spectra.length>0||o.minMax){ns(o);let s={...o.info,...o.meta},a=De(s,{logger:n});if(a.experiment==="wobble_curve")continue;i.push(vr(o,s,a,t,r))}return i}function ns(e){let t=e.meta["BRUKER FILE EXP"];if(!t)return;let n=(Array.isArray(t)?t:[t]).find(o=>o.slice(0,10).includes("vdlist"));if(!n)return;let i=n.split(`
|
|
10
|
+
`).slice(1);e.info.vdlistValues=he(i)}async function Ie(e,t={}){let r=await e.text(),n=_r(r,{name:e.name,...t});return ur(n,e,t)}function _r(e,t={}){let r={spectra:[],molecules:[]},{name:n,converter:i={},selector:o={},logger:s}=t,{keepRecordsRegExp:a=/.*/}=i,c={keepSpectra:!0,noContour:!0,noTrimRegExp:/\$MOLFILE/,keepRecordsRegExp:a,logger:s},l=dr(os(e),{name:n,...o,logger:s});for(let m of l)ss(m,r,c,n);if(as(r,o),r.spectra.length===0&&l.length>0){let m=r.molecules.length===0?" nor molecule":"";s?.warn(`No spectra${m} data was loaded from file ${n}`)}return is(r)}function ss(e,t,r,n){let i=[],o=[],s={molecules:[]},{logger:a}=r,c={name:n,logger:a};Ye(e,o,r),xr(o,s,i,c),t.spectra.push(...kr(i,s,c)),t.molecules.push(...s.molecules)}function as(e,t){t.index!==void 0&&(e.spectra=e.spectra.slice(t.index,t.index+1))}function ls(e,t={}){let{selector:r={},converter:n,logger:i}=t;return i?.debug(`Reading JCAMP-DX file: ${e.name}`),Ie(e,{selector:ms(r),converter:n?.jcamp,logger:i})}function ms(e={}){let{jcamp:t={},general:r={}}=e,{dataSelection:n="both"}=r;return{dataSelection:n,...t}}function Qe(){return cs({id:"@zakodium/nmrium-core-plugins#JCAMPDXLoaderPlugin",version:1,shouldSerialize:!0,migrations:[],onReadProcess:{supportedExtensions:["jcamp","jdx","dx"],onFile:ls}})}import{defineNMRiumPlugin as Es}from"@zakodium/nmrium-core";function qr(e){if(e===void 0)return{epoch:null,date:""};let t=e*1e3;return{epoch:t,date:new Date(t).toUTCString()}}var jr={0:"bigEndian",1:"littleEndian"},Br={0:"NONE",1:"GSX",2:"ALPHA",3:"ECLIPSE",4:"MASS_SPEC",5:"COMPILER",6:"OTHER_NMR",7:"UNKNOWN",8:"GEMINI",9:"UNITY",10:"ASPECT",11:"UX",12:"FELIX",13:"LAMBDA",14:"GE_1280",15:"GE_OMEGA",16:"CHEMAGNETICS",17:"CDFF",18:"GALACTIC",19:"TRIAD",20:"GENERIC_NMR",21:"GAMMA",22:"JCAMP_DX",23:"AMX",24:"DMX",25:"ECA",26:"ALICE",27:"NMR_PIPE",28:"SIMPSON"},Ur={0:"64Bit Float",1:"32Bit Float",2:"Reserved",3:"Reserved"},$r={1:"One_D",2:"Two_D",3:"Three_D",4:"Four_D",5:"Five_D",6:"Six_D",7:"Seven_D",8:"Eight_D",9:"not for NMR data formats",10:"not for NMR data formats",11:"not for NMR data formats",12:"Small_Two_D",13:"Small_Three_D",14:"Small_Four_D"},zr={0:"None",1:"Real",2:"TPPI",3:"Complex",4:"Real_Complex",5:"Envelope"},Jr={"-8":"Yotta","-6":"Exa","-7":"Zetta","-5":"Pecta","-4":"Tera","-3":"Giga","-2":"Mega","-1":"Kilo",0:"None",1:"Milli",2:"Micro",3:"Nano",4:"Pico",5:"Femto",6:"Atto",7:"Zepto"},Wr={Yotta:24,Exa:21,Zetta:18,Pecta:15,Tera:12,Giga:9,Mega:6,Kilo:3,None:0,Milli:-3,Micro:-6,Nano:-9,Pico:-12,Femto:-15,Atto:-18,Zepto:-21},Xr={0:"None",1:"Abundance",2:"Ampere",3:"Candela",4:"Celsius",5:"Coulomb",6:"Degree",7:"Electronvolt",8:"Farad",9:"Sievert",10:"Gram",11:"Gray",12:"Henry",13:"Hertz",14:"Kelvin",15:"Joule",16:"Liter",17:"Lumen",18:"Lux",19:"Meter",20:"Mole",21:"Newton",22:"Ohm",23:"Pascal",24:"Percent",25:"Point",26:"Ppm",27:"Radian",28:"Second",29:"Siemens",30:"Steradian",31:"Tesla",32:"Volt",33:"Watt",34:"Weber",35:"Decibel",36:"Dalton",37:"Thompson",38:"Ugeneric",39:"LPercent ",40:"PPT",41:"PPB ",42:"Index"},et={0:"Ranged",1:"Listed",2:"Sparse",3:"Listed"};function w(e,t){return e.paramArray.find(r=>r.name===t)}function Vr(e,t){let r=e.paramArray.find(p=>p.name==="orders"),n=e.paramArray.find(p=>p.name==="factors"),i=e.paramArray.find(p=>p.name==="x_sweep"),o=e.paramArray.find(p=>p.name==="x_acq_time"),s=e.paramArray.find(p=>p.name==="x_points");if(!r||!n||!i||!o||!s){t?.error("There is not all parameters to calculate the number of point of digital filter");return}let a=r.value,c=Number.parseInt(a.slice(0,1),10),l=a.slice(1).length/c,m=0,u=new Int8Array(c),f=1,g=0;for(let p=0;p<c;p++)u[p]=Number.parseInt(n.value.slice(g,g+1),10),g+=1;for(let p=0;p<c;p++){let h=1;for(let d=p;d<c;d++)h*=u[d];m+=(Number.parseInt(a.slice(f,f+l),10)-1)/h,f+=l}return m/=2,m/i.value/o.value*(s.value-1)}function T(e,t){let r=w(e,t);if(r===void 0)return{magnitude:"NA",unit:"NA"};let n=r.unit[0],i=n.base,o=Wr[n.prefix];return{magnitude:r.value*10**o,unit:i}}function tt(e){let t=e.readBytes(4),r=1990+(t[0]>>1),n=(t[0]<<3&8)+(t[1]>>5),i=t[2]&31;return{year:r,month:n,day:i}}function Me(e,t){let r=[];for(let n=0;n<t;n++){let i=e.readByte(),o=i>>4,s=Jr[o],a=i&15,c=e.readInt8(),l=Xr[c];r.push({prefix:s,power:a,base:l})}return r}function X(e,t){let r=[];for(let n=0;n<t;n++){let i=e.readChar();i!=="\0"&&r.push(i)}return r.join("")}function rt(e,t){let r=[];for(let n=0;n<t;n++){let i=e.readChar();i!==" "&&r.push(i)}return r.join("")}function N(e,t,r){let n=[];for(let i=0;i<t;i++)switch(r){case"readUint32":n.push(e.readUint32());break;case"readFloat64":n.push(e.readFloat64());break;case"readFloat32":n.push(e.readFloat32());break;case"readUint8":n.push(e.readUint8());break;default:break}return n}function Hr(e,t){let r=[];for(let n=0;n<t;n++)r.push(e.readBoolean());return r}function Gr(e,t,r){let n=1,i=0;for(let o of t.dataAxisType)o==="Real_Complex"&&i===0&&(n+=1,i+=1),o==="Complex"&&(n*=2);if(t.dataType!=="32Bit Float"&&t.dataType!=="64Bit Float"){r?.error("Only 32Bit Float and 64Bit Float data types are implemented yet");return}if(t.dataFormat==="One_D"){if(n!==1&&n!==2){r?.error("One_D data must have one or two data sections");return}return ps(e,t,n)}else if(t.dataFormat==="Two_D"){if(n===2)return fs(e,t);if(n===4)return ds(e,t);r?.error("Two_D data must have two or four data sections");return}else{r?.error("Only One_D and two_D data formats are implemented yet");return}}function ps(e,t,r){return r===1?{re:nt(e,t)}:{re:nt(e,t),im:nt(e,t)}}function nt(e,t){return t.dataType==="32Bit Float"?N(e,t.dataPoints[0],"readFloat32"):N(e,t.dataPoints[0],"readFloat64")}var k=32;function fs(e,t){let r=t.dataPoints[0],i=t.dataPoints[1]/k,o=r/k;return{re:ne(e,t,i,o),im:ne(e,t,i,o)}}function ds(e,t){let r=t.dataPoints[0],i=t.dataPoints[1]/k,o=r/k;return{re:{re:ne(e,t,i,o),im:ne(e,t,i,o)},im:{re:ne(e,t,i,o),im:ne(e,t,i,o)}}}function ne(e,t,r,n){let i=[];for(let o=0;o<r;o++){let s=[];for(let a=0;a<n;a++)for(let c=0;c<k;c++)a===0?t.dataType==="32Bit Float"?s[c]=N(e,k,"readFloat32"):t.dataType==="64Bit Float"&&(s[c]=N(e,k,"readFloat64")):t.dataType==="32Bit Float"?s[c]=s[c].concat(N(e,k,"readFloat32")):t.dataType==="64Bit Float"&&(s[c]=s[c].concat(N(e,k,"readFloat64")));i=i.concat(s)}return i}function Yr(e){let t=e.readChars(8),r=e.readInt8(),n=jr[r],i=e.readUint8(),o=e.readUint16(),s=e.readUint8(),a=e.readByte().toString(2).split("").map(O=>!!Number(O)),c=e.readByte(),l=c>>6,m=Ur[l],u=c&63,f=$r[u],g=e.readInt8(),y=Br[g],p=N(e,8,"readUint8"),h=N(e,8,"readUint8").map(O=>zr[O]),d=Me(e,8),F=X(e,124),b=[];for(let O of N(e,4,"readUint8")){let ce=O>>4,_e=O&15;b.push(et[ce],et[_e])}let S=N(e,8,"readUint32"),I=N(e,8,"readUint32"),x=N(e,8,"readUint32"),A=N(e,8,"readFloat64"),M=N(e,8,"readFloat64"),P=tt(e),v=tt(e),_=X(e,16),q=X(e,128),se=X(e,128),ae=X(e,128),V=[];for(let O=0;O<8;O++)V.push(X(e,32));let ke=N(e,8,"readFloat64"),j=N(e,8,"readFloat64"),Jn=Hr(e,8);e.skip(3);let Wn=!!(e.readByte()>>7),Xn=e.readUint32(),Vn=e.readUint32(),Hn=e.readUint32(),Gn=e.readUint32(),Yn=N(e,8,"readUint32"),Kn=N(e,8,"readUint32"),Zn=e.readUint32(),Qn=e.readUint32()<<32|e.readUint32(),ei=e.readUint32()<<32|e.readUint32(),ti=e.readUint32(),ri=e.readUint32()<<32|e.readUint32(),ni=e.readUint32(),ii=e.readUint32()<<32|e.readUint32(),oi=N(e,8,"readUint8"),bt=[];for(let O=0;O<2;O++){let ce=[],_e=e.readInt16();for(let Ft=0;Ft<5;Ft++)ce.push(e.readInt16());bt.push({scaler:_e,unit:ce})}return{fileIdentifier:t,endian:n,majorVersion:i,minorVersion:o,dataDimensionNumber:s,dataDimensionExist:a,dataType:m,dataFormat:f,dataInstrument:y,translate:p,dataAxisType:h,dataUnits:d,title:F,dataAxisRanged:b,dataPoints:S,dataOffsetStart:I,dataOffsetStop:x,dataAxisStart:A,dataAxisStop:M,creationTime:P,revisionTime:v,nodeName:_,site:q,author:se,comment:ae,dataAxisTitles:V,baseFreq:ke,zeroPoint:j,reversed:Jn,annotationOK:Wn,historyUsed:Xn,historyLength:Vn,paramStart:Hn,paramLength:Gn,ListStart:Yn,ListLength:Kn,dataStart:Zn,dataLength:Qn,contextStart:ei,contextLength:ti,annoteStart:ri,annoteLength:ni,totalSize:ii,unitLocation:oi,compoundUnit:bt}}var gs={0:"String",1:"Integer",2:"Float",3:"Complex",4:"Infinity"};function Kr(e){let t=e.readUint32(),r=e.readUint32(),n=e.readUint32(),i=e.readUint32(),o=[];for(let s=0;s<n+1;s++){e.skip(4);let a=e.readInt16(),c=Me(e,5);e.skip(16);let l=e.readInt32(),m=gs[l];e.seek(e.offset-20);let u;switch(m){case"String":u=rt(e,16);break;case"Integer":u=e.readInt32(),e.skip(12);break;case"Float":u=e.readFloat64(),e.skip(8);break;case"Complex":u={Real:e.readFloat64(),Imag:e.readFloat64()};break;case"Infinity":u=e.readInt32(),e.skip(12);break;default:e.skip(16);break}e.skip(4);let f=rt(e,28);o.push({name:f.toLowerCase(),scaler:a,unit:c,value:u,valueType:m})}return{parameterSize:t,lowIndex:r,highIndex:n,totalSize:i,paramArray:o}}function Zr(e,t){let r=new R(e);r.setBigEndian();let n=Yr(r);n.endian==="littleEndian"&&r.setLittleEndian(),r.seek(n.paramStart);let i=Kr(r);r.seek(n.dataStart);let o=Gr(r,n,t),s=[],a=[],c=[],l=[],m=[],u=[],f=[],g=[],y=[],p=[];if(n.dataFormat==="One_D"||n.dataFormat==="Two_D"){let d=qr(w(i,"actual_start_time")?.value);d.date&&(a.push(d.date),c.push(d.epoch)),s.push(w(i,"x_domain")?.value),l.push(T(i,"x_acq_time")),m.push(T(i,"x_sweep")),u.push(T(i,"x_sweep_clipped")),f.push(T(i,"x_resolution")),g.push(T(i,"x_freq")),y.push(T(i,"x_offset")),p.push(n.dataUnits[0].base)}return n.dataFormat==="Two_D"&&(s.push(w(i,"y_domain")?.value),l.push(T(i,"y_acq_time")),m.push(T(i,"y_sweep")),f.push(T(i,"y_resolution")),g.push(T(i,"y_freq")),y.push(T(i,"y_offset")),p.push(n.dataUnits[1].base)),{info:{sampleName:w(i,"sample_id")?.value,creationTime:n.creationTime,revisionTime:n.revisionTime,author:n.author,comment:n.comment,solvent:w(i,"solvent")?.value,temperature:T(i,"temp_get"),probeName:w(i,"probe_id")?.value,fieldStrength:T(i,"field_strength"),experiment:w(i,"experiment")?.value,dimension:n.dataDimensionNumber,nucleus:s,date:a,epoch:c,pulseStrength90:T(i,"x90"),numberOfScans:w(i,"scans")?.value,relaxationTime:T(i,"relaxation_delay"),dataPoints:n.dataPoints.slice(0,n.dataDimensionNumber),dataOffsetStart:n.dataOffsetStart,dataOffsetStop:n.dataOffsetStop,dataUnits:p,dataSections:o?Object.keys(o):void 0,originFrequency:g,frequencyOffset:y,acquisitionTime:l,spectralWidth:m,spectralWidthClipped:u,dataAxisStart:n.dataAxisStart,dataAxisStop:n.dataAxisStop,resolution:f,decimationRate:w(i,"decimation_rate")?.value,paramList:JSON.stringify(i.paramArray.map(d=>d.name)),digitalFilter:Vr(i,t)},headers:n,parameters:i,data:o}}import{formatSpectra as Fs}from"@zakodium/nmrium-core";import{getGyromagneticRatio as xs}from"gyromagnetic-ratio";import{isAnyArray as Ds}from"is-any-array";import Ss from"lodash.merge";import{normalizeNucleus as As}from"nmr-processing";import{isAnyArray as ie}from"is-any-array";var Qr={0:"uint8",1:"uint16",2:"uint32",3:"uint64",4:"int8",5:"int16",6:"int32",7:"int64",8:"float32",9:"float64",10:"complex64",11:"complex128"},en={0:"scalar",1:"vector",2:"matrix",3:"symetricMatrix",4:"pixel"};function tn(e,t,r={}){let{quantityType:n=0,encoding:i="none",name:o="",unit:s="",quantityName:a="",sparseSampling:c={},from:l=[0],to:m=[-1]}=r;if(ie(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 u=ot(e,l,m),{componentLabels:f=u.componentLabels}=r;return{type:"internal",quantityType:en[n],numericType:Qr[t],encoding:i,name:o,unit:s,quantityName:a,componentLabels:f,sparseSampling:c,description:r.description||"",application:r.application||"",components:u.components,dataLength:u.dataLength}}function ys(e){return ie(e.re)&&ie(e.im)}function hs(e){return!ie(e.re[0])}function ot(e,t,r){let n=[],i=[],o=[];if(ys(e))if(hs(e)){n[0]=it(t[0],r[0],e.re.length);let s=new Float64Array(n[0]);for(let a=0;a<n[0];a+=2){let c=a+t[0]*2;s[a]=e.re[c/2],s[a+1]=e.im[c/2]}o.push(s),i.push("complex")}else if(ie(e.re[0])){n[0]=bs(t[1],r[1],e.re.length),n[1]=it(t[0],r[0],e.re[0].length);for(let s=0;s<n[0];s++){let a=new Float64Array(n[1]);for(let c=0;c<n[1];c+=2){let l=c+t[0]*2;a[c]=e.re[s][l/2],a[c+1]=e.im[s][l/2]}o.push(a)}}else throw new Error("check your object");else if(ie(e.re.re)){n[0]=it(t[1],r[1],e.re.re.length);let s=ot(e.re,t,r).components,a=ot(e.im,t,r).components;for(let c=0;c<n[0]/2;c++)o.push(s[c],a[c])}else throw new Error("check the dimension or the type of data in your array");return{dataLength:n,componentLabels:i,components:o}}function bs(e,t,r){return t-e+1<r?t-e+1:r}function it(e,t,r){return t-e+1<r?(t-e+1)*2:r*2}async function nn(e,t={}){let r=await e.arrayBuffer(),{name:n=te(e.name)}=t,i={spectra:[],molecules:[]},s=Ns(r)[0],{metadata:a,...c}=s.description,l=0,m=c.dimension===1?"1d":"2d",u="NMR SPECTRUM",f=c.dimension===1?c.nucleus[0]:c.nucleus,g=c.spectralWidthClipped[0],y;s.dependentVariables&&(c.dimension===1?y=Is(s):c.dimension===2&&(y=Ms(s)));for(let h in c)Array.isArray(c[h])&&c[h].length===1&&(c[h]=c[h][0]);let p={data:y,info:{...c,acquisitionMode:l,experiment:m,type:u,nucleus:f,spectralWidthClipped:g,name:n},meta:a,selector:{files:[e.relativePath]}};return i.spectra=[p],Fs(i)}function Is(e){let t=e.dimensions[0],r=e.dependentVariables,n=t.quantityName,i=t.count,o=t.increment.magnitude,s=t.originOffset.magnitude,a=t.coordinatesOffset.magnitude,c=r[0].components[0],l=new Float64Array(i),m=new Float64Array(i);for(let p=c.length-1,h=0;p>0;p-=2)l[h]=c[p-1],m[h++]=c[p];let u={},[f,g]=[0,0];switch(n){case"frequency":g=0+a/s*1e6,f=o/s*1e6,u.re=l,u.im=m;break;case"time":g=s,f=o,u.re=l.reverse(),u.im=m.reverse().map(p=>-p);break;default:break}let y=[];for(let p=0;p<i;p++)y.push(g+p*f);return u.x=y,u}function Ms(e){let t=e.dimensions,r=e.dependentVariables,n=t[0].quantityName,i=[],o=[],s=Number.MIN_SAFE_INTEGER,a=Number.MAX_SAFE_INTEGER,c=Number.MAX_SAFE_INTEGER,l=Number.MIN_SAFE_INTEGER;for(let f of r[0].components){let g=new Float64Array(f.length/2),y=new Float64Array(f.length/2);for(let p=f.length-1,h=0;p>0;p-=2){let d=f[p-1],F=f[p];d>s&&(s=d),d<a&&(a=d),F>l&&(l=F),F<c&&(c=F),g[h]=d,y[h++]=F}if(n==="frequency")i.push(g),o.push(y);else{let p=g.length,h=new Float64Array(y.length);for(let d=0,F=p-1;d<p;d++)h[d]=-y[F--];i.push(g.reverse()),o.push(h)}}let m={re:{z:i,minZ:a,maxZ:s},im:{z:o,minZ:c,maxZ:l}},u=["X","Y"];for(let f=0;f<u.length;f++){let g=t[f].count,y=t[f].increment.magnitude,p=t[f].originOffset.magnitude,h=t[f].coordinatesOffset.magnitude,d=u[f];for(let F of["re","im"])n==="frequency"?(m[F][`min${d}`]=0+h/p*1e6,m[F][`max${d}`]=g*(y/p)*1e6):(m[F][`min${d}`]=p,m[F][`max${d}`]=g*y)}return m}function Ns(e){let t=Zr(e),r=t.info,n=t.headers,{paramArray:i,...o}=t.parameters,{dimension:s}=r,a={};for(let d of i){let{name:F,value:b}=d;a[F]=on(b,s)}let c=t.data,l={title:`title: ${n.title} / comment: ${n.comment} / author:${n.author} / site: ${n.site}`,nucleus:r.nucleus.map(As),sampleName:r.sampleName,date:r.date,epoch:r.epoch,localeDate:new Date(r.epoch[0]).toLocaleString(),author:r.author,solvent:r.solvent,temperature:r.temperature.magnitude,probeName:r.probeName||"",fieldStrength:r.fieldStrength.magnitude},m=l.nucleus.map(xs);l.baseFrequency=m.map(d=>r.fieldStrength.magnitude*d/(2*Math.PI*1e6)),l.pulseSequence=r.experiment,l.temperature=r.temperature?.unit?.toLowerCase()==="celsius"?273.15+r.temperature.magnitude:r.temperature.magnitude,l.digitalFilter=r.digitalFilter,l.pulseStrength90=1/(4*r.pulseStrength90.magnitude),l.numberOfScans=r.numberOfScans,l.relaxationTime=r.relaxationTime.magnitude,l.isComplex=r.dataSections?r.dataSections.includes("im"):!1,l.isFid=r.dataUnits[0]==="Second",l.isFt=r.dataUnits[0]==="Ppm",l.dimension=r.dimension,l.originFrequency=r.originFrequency.map(d=>d.magnitude/1e6).slice(0,s),l.numberOfPoints=r.dataPoints.slice(0,1),l.frequencyOffset=r.frequencyOffset.map((d,F)=>d.magnitude*l.baseFrequency[F]).slice(0,s),l.acquisitionTime=r.acquisitionTime.map(d=>d.magnitude).slice(0,s),l.spectralWidth=r.spectralWidth.map((d,F)=>d.magnitude/r.originFrequency[F].magnitude*1e6).slice(0,s),l.spectralWidthClipped=r.spectralWidthClipped.map((d,F)=>d.magnitude/l.baseFrequency[F]*1e6).slice(0,s);let u=[],f={},g;for(let d=0;d<r.dimension;d++){if(g={magnitude:r.acquisitionTime[d].magnitude/(r.dataPoints[d]-1),unit:"s"},r.dataUnits[d]==="Second")f.quantityName="time",f.originOffset={magnitude:0,unit:"s"},d===0?f.coordinatesOffset={magnitude:r.digitalFilter*g.magnitude,unit:"s"}:f.coordinatesOffset={magnitude:0,unit:"s"},f.reciprocal={originOffset:{magnitude:r.originFrequency[d].magnitude,unit:"Hz"},quantityName:"frequency",coordinatesOffset:{magnitude:r.frequencyOffset[d].magnitude*r.originFrequency[d].magnitude/1e6,unit:"Hz"}};else if(r.dataUnits[d]==="Ppm"){f.quantityName="frequency";let F=r.originFrequency[d].magnitude;f.originOffset={magnitude:F,unit:"Hz"};let b=r.dataOffsetStart[d],I=r.dataOffsetStop[d]-b+1;g={magnitude:Ps(r,d)/(I-1),unit:"Hz"};let M=r.dataAxisStop[d]*F/1e6;f.coordinatesOffset={magnitude:M,unit:"Hz"},I!==r.dataPoints[d]&&(r.dataPoints[d]=I)}d===0?f.description="direct dimension":f.description="indirect dimension",u.push({label:n.dataAxisTitles[d],count:r.dataPoints[d],increment:g,type:"linear",description:String(f.description)||"",application:f.application||{},coordinatesOffset:f.coordinatesOffset||0,originOffset:f.originOffset||0,quantityName:String(f.quantityName)||"",reciprocal:f.reciprocal||{},period:f.period||0,complexFFT:f.complexFFT||!1})}let y=[tn(c,11,{unit:"none",quantityName:"relative intensity",from:r.dataOffsetStart,to:r.dataOffsetStop})],p={...l};return delete p.paramList,p.metadata={...rn(n,s),...rn(o,s),...Ss({},a)},[{timeStamp:Date.now(),description:p,dimensions:u,dependentVariables:y}]}function Ps(e,t){let{spectralWidth:r,spectralWidthClipped:n}=e;return n[t].magnitude!=="NA"?n[t].magnitude:r[t].magnitude}function rn(e,t){let r={};for(let n in e)r[n]=on(e[n],t);return r}function on(e,t){return Ds(e)?t>1?e.slice(0,t):e[0]:e}function Ts(e,t={}){let{logger:r}=t;return r?.debug(`Reading JEOL file: ${e.name}`),nn(e,{name:e.name,logger:r})}function st(){return Es({id:"@zakodium/nmrium-core-plugins#JEOLLoaderPlugin",version:1,shouldSerialize:!0,migrations:[],onReadProcess:{supportedExtensions:["jdf"],onFile:Ts}})}import{defineNMRiumPlugin as Os}from"@zakodium/nmrium-core";function Cs(e,t={}){let{logger:r,selector:n}=t;return r?.debug(`Reading molfile file: ${e.name}`),hr(e,{logger:r,selector:n})}function at(){return Os({id:"@zakodium/nmrium-core-plugins#MolfileLoaderPlugin",version:1,shouldSerialize:!0,migrations:[],onReadProcess:{supportedExtensions:["mol"],onFile:Cs}})}import{defineNMRiumPlugin as na}from"@zakodium/nmrium-core";import{FileCollection as Mf}from"file-collection";import{Molecule as xn}from"openchemlib";import{getShortestPaths as Rs}from"openchemlib-utils";function sn(e,t){let{molecule:r,map:n}=t;r.addImplicitHydrogens();let i=Rs(r,{toLabel:"H",maxLength:1});for(let s in e){let a=e[s],c=a.atoms;if(c.length!==0){if(a.position=[],c[0].toLowerCase().includes("h")){let l=Number(c[0].toLowerCase().replace("h",""))-1;l=n.indexOf(l);let m=i[l].find(u=>u&&u.length>1);a.position=i[m[0]].filter(u=>u&&u.length>1).map(u=>u.at(-1))}else if(c[0].toLowerCase().match(/\w/s))for(let l of c){let m=n.indexOf(Number(l)-1);a.position.push(m)}}}let o=r.getDiastereotopicAtomIDs();for(let s in e){let a=[];if("position"in e[s])for(let c of e[s].position)a.includes(o[c])||a.push(o[c]);e[s].diaIDs=a}return e}async function an(e,t){let{fileCollection:r,root:n}=t,i=e.data.filter(s=>s.value.spectrum_location),o=[];for(let s of i){if(!s){new Error(`There is not spectrum for ${e}`);return}let a=s.value.spectrum_location;if(a.match(/file:/s)){let c=n+a.replace(/file:[./]*/s,""),l=c.match(/[ser|fid]/s)?/([.*/]*\w+\/[0-9]+\/).*/:/(.*\w+\/[0-9]+\/)pdata\/.*/,m=c.replace(l,"$1"),u=c.replace(/.*\/[0-9]+\/pdata\/([0-9]+)\/.*/,"$1"),f=r.filter(g=>{if(g.relativePath.match("pdata")&&u!==g.relativePath.replace(/.*\/[0-9]+\/pdata\/([0-9]+)\/.*/,"$1"))return!1;let y=g.relativePath.replace(/([.*/]*\w+\/[0-9]+\/).*/,"$1");return!(m!==y&&!["ser","fid"].some(p=>c===`${y}${p}`))});o.push({type:"brukerFiles",fileCollection:f})}else a.match("http")&&o.push({type:"url",value:a})}return o}async function cn(e,t){let{fileCollection:r,root:n}=t,i=e.data.find(c=>c.value.jcamp_location);if(!i){new Error(`There is not spectrum for ${e}`);return}let o=i.value.jcamp_location,s=n+o.replace(/file:/s,""),a=r.filter(c=>c.relativePath===s);if(a.files.length===0){new Error(`There is not jcamp with path: ${s}`);return}return[{name:s,type:"jcamp",fileCollection:a}]}function ln(e={}){let t={};for(let r of e.data||[]){let{label:n,atoms:i,shift:o}=r.value;t[n]={shift:o,atoms:i}}return t}function mn(e){let t=e.match(/([0-9])\w_/s)?.[1];if(t==="1")return e.slice(3).replaceAll(/(?<nucleus>[0-9]+\w+)#\w+/g,"$<nucleus>");if(t==="2"){let r=[],n=e.slice(12).split("_");for(let i=0;i<n.length;i+=2)r.push(n[i].replaceAll(/(?<nucleus>[0-9]+\w+)#\w+/g,"$<nucleus>"))}return[]}var ws=["delta","nbAtoms","multiplicity","jCoupling"];function un(e,t){let r={};for(let s of ws){let a=e[s];a&&(r[s]=a)}let{nbAtoms:n,integration:i}=e;if(r.integration=i?Number(i):n?Number(n):null,e.assignment)for(let s of e.assignment){let a=t[s];r.diaIDs||(r.diaIDs=[]),a?.diaIDs&&r.diaIDs.push(...a.diaIDs)}let o=!1;if(r.jCoupling&&(o=r.jCoupling.some(s=>Object.keys(s).includes("label"))),o){for(let s of r.jCoupling)if(s.label){let a=t[s.label];a?.diaIDs&&(s.diaIDs=a.diaIDs)}}return r.delta&&(r.delta=Number.parseFloat(r.delta)),r}var vs=["intensity","volume","activeCoupling"],Ls={x:["f1Width","f1Coupling"],y:["f2Width","f2Coupling"]};function pn(e,t){let r={};for(let n of vs)e[n]&&(r[n]=e[n]);for(let n in e.delta){r[n]||(r[n]={});let i=e.delta[n];for(let o of i)r[n].diaIDs||(r[n].diaIDs=[]),t[o]?(r[n].diaIDs.push(...t[o].diaIDs),r[n].delta=Number.parseFloat(t[o].shift)):r[n].delta=Number.parseFloat(o);for(let o of Ls[n])if(e[o]){let s=o.toLowerCase().replace(/f\w(\w+)/,"$1");r[n][s]=e[o]}}return r}async function fn(e,t){let{moleculeAndMap:r}=t,n={molecules:[{molfile:r.molecule.toMolfile()}],spectra:[]},i=n.spectra,o=n.molecules;e.SMILES?.data.length>0&&(o[0].smiles=e.SMILES.data[0].value);let s=ln(e.ASSIGNMENT);s=sn(s,r);for(let a in e){let c=a.toLowerCase();if(!c.match(/[1|2]d_/s))continue;let l=e[a].data.find(d=>d.value.larmor),m=e[a].data.find(d=>d.value.pulseprogram),u=mn(a),f=c.replace(/([1|2]d)_.*/,"$1"),g=f==="2d"?pn:un,y={source:{jcampURL:null},nucleus:u,frequency:l?.value.larmor,experiment:m?m.value.pulseprogram.trim():f,headComment:e[a].headComment},p=e[a].data.filter(d=>d.value.delta);y.signals=p.map(d=>{let F=g(d.value,s);return F.comment=d.comment,F});let h=await ks(e[a],t);if(!h.jcamp&&!h.bruker)i.push(y);else for(let d in h)h[d]&&i.push({...y,source:{...y.source,file:h[d]}})}return n}async function ks(e,t){return{jcamp:await cn(e,t),bruker:await an(e,t)}}function Ne(e,t={}){let{include:r,exclude:n,filter:i,modifiers:o={},forEach:s={},dynamicTyping:a=!0,mixedEOL:c=!1}=t;if(typeof e!="string")throw new TypeError('Parameter "sdf" must be a string');let l=`
|
|
11
11
|
`;if(c)e=e.replaceAll(`\r
|
|
12
12
|
`,`
|
|
13
13
|
`),e=e.replaceAll("\r",`
|
|
14
14
|
`);else{let y=new Set(e.slice(0,1e3));y.has(`\r
|
|
15
15
|
`)?l=`\r
|
|
16
|
-
`:y.has("\r")&&(l="\r")}let m=e.split(new RegExp(String.raw`${l}\$\$\$\$.*${l}`)),u=[],f={},g=Date.now();for(let y of m){let p=y.split(`${l}>`);if(p.length>0&&p[0].length>5){let h={molfile:p[0]+l},d=[];for(let
|
|
16
|
+
`:y.has("\r")&&(l="\r")}let m=e.split(new RegExp(String.raw`${l}\$\$\$\$.*${l}`)),u=[],f={},g=Date.now();for(let y of m){let p=y.split(`${l}>`);if(p.length>0&&p[0].length>5){let h={molfile:p[0]+l},d=[];for(let F=1;F<p.length;F++){let b=p[F].split(l),S=b[0].indexOf("<"),I=b[0].indexOf(">"),x=b[0].slice(S+1,I);if(d.push(x),f[x]||(f[x]={label:x,counter:0,nbLines:"",isNumeric:a,keep:!1},!n?.includes(x)&&(!r||r.includes(x))&&(f[x].keep=!0,o[x]&&(f[x].modifier=o[x]),s[x]&&(f[x].forEach=s[x]))),f[x].keep){for(let A=1;A<b.length-1;A++)h[x]?h[x]+=l+b[A]:h[x]=b[A];if(f[x].modifier){let A=f[x].modifier(h[x]);A==null?delete h[x]:h[x]=A}f[x].isNumeric&&(!Number.isFinite(+h[x])||h[x].match(/^0[0-9]/))&&(f[x].isNumeric=!1)}}if(!i||i(h)){u.push(h);for(let F of d)f[F].counter++}}}for(let y in f){let p=f[y];if(p.isNumeric){p.minValue=1/0,p.maxValue=-1/0;for(let h of u)if(h[y]){let d=Number.parseFloat(h[y]);h[y]=d,d>p.maxValue&&(p.maxValue=d),d<p.minValue&&(p.minValue=d)}}}for(let y in f)f[y].always=f[y].counter===u.length;return{time:Date.now()-g,molecules:u,labels:Object.keys(f),statistics:Object.values(f)}}function ct(e){let t={};for(let{key:r,value:n}of e)t[r]=n;return t}function Pe(e){let t=[];e=e.replaceAll(/,([0-9])/g,":$1");for(let r of e.split(":")){let n,i="",o=r.indexOf("(");o===-1?(n=Number(r),t.push({coupling:n})):(n=Number(r.slice(0,o)),i=r.slice(o+1,-1),t.push({coupling:n,label:i}))}return t}function dn(e){let t={};e=e.replaceAll(" ",""),e=e.replaceAll(/[l=] /g,""),e=e.replaceAll(/,(\w=)/g,":$1");let r=e.split(":");for(let[n,i]of r.entries()){let o=i.toLowerCase(),s=o.replace(/^.*=/,""),a=o.replace(/[=].*/,"");Number.parseFloat(a)&&n===0?t.delta=s:t[_s(a)]=qs(s,a)}return t}function _s(e){switch(e){case"j":return"jCoupling";case"s":return"multiplicity";case"l":return"assignment";case"n":return"nbAtoms";case"e":case"i":return"integration";default:return""}}function qs(e,t){switch(t){case"l":return js(e);case"j":return Pe(e);default:return e}}function js(e){return e.replaceAll(/\s*/g,"").split(",")}var Bs=["y","x"];function gn(e){e=e.replaceAll(" ",""),e=e.replaceAll(/[l=] /g,""),e=e.replaceAll(/,(\w+=)/g,":$1");let t=e.split(":"),r=Us(t[0]);for(let n=1;n<t.length;n++){let{value:i,key:o}=yn(t[n]);r[zs(o)]=$s(i,o)}return r}function Us(e){let{value:t}=yn(e),r={delta:{}},n=t.split("/");for(let i=0;i<n.length;i++){let o=n[i].replaceAll(/[(|)]/g,"").split(",");r.delta[Bs[i]]=Array.isArray(o)?o:[o]}return r}function yn(e){let t=e.toLowerCase();return{value:t.replace(/^.*=/,""),key:t.replace(/[=].*/,"")}}function $s(e,t){switch(t){case"ja":case"j1":case"j2":return Pe(e);default:return e}}function zs(e){switch(e){case"ja":return"activeCoupling";case"j1":return"f1Coupling";case"j2":return"f2Coupling";case"i":return"intensity";case"s":return"volume";case"w1":return"f1Width";case"w2":return"f2Width";default:return e}}function bn(e,t){let r=Js(t),n=e.match(/[=]/g);return!n&&!e.match(",")?t.toLowerCase().match(/2d/)?r(e):e:t.toLowerCase().match(/[1|2]d/)&&n&&!e.match(",")?Fn(e):r(e)}function Js(e){let t=e.toLowerCase();switch(t.match(/1d/)&&(t="1d"),t.match(/2d/)&&(t="2d"),t){case"id":return Fn;case"1d":return dn;case"2d":return gn;case"assignment":case"signals":return hn;case"j":return hn;case"smiles":case"inchi":case"version":case"solvent":case"temperature":case"level":default:return r=>r}}function Fn(e){let t=e.replace(/^.*=/,""),r=e.replace(/[=].*/,"").toLowerCase();return ct([{key:r,value:t}])}function hn(e){let t=e.replaceAll(" ","").split(",");return ct([{key:"label",value:t[0].toLowerCase()},{key:"shift",value:t.slice(1,2)},{key:"atoms",value:t.slice(2)}])}async function lt(e){let t=[];for(let r of e.files){let n=r.relativePath.split("/");if(/^[^.].+sdf|nmredata$/.exec(r.name)){let i=await r.text();if(!i.match("NMREDATA"))continue;let o=Ne(i,{mixedEOL:!0}),s=n.slice(0,-1).join("/");t.push({...o,filename:r.name,filePath:r.relativePath,root:s!==""?`${s}/`:""})}}return t}function Dn(e){let{sdf:t,fileCollection:r}=e,{molecule:n}=e,i=mt(t);n??=xn.fromMolfile(i.molecules[0].molfile),n.addImplicitHydrogens();let o=xn.fromMolfileWithAtomMap(n.toMolfile()),s=Ws(i);return fn(s,{moleculeAndMap:o,root:i.root,fileCollection:r})}function Ws(e){let t=mt(e),r={name:t.filename},n=Xs(t);for(let i of Object.keys(n)){r[i]||(r[i]={data:[]});let o=r[i],s=n[i].split(`
|
|
17
17
|
`);for(let a of s){let c=a.replaceAll(/;.*/g,"").replaceAll("\r",""),l=a.match(";")?a.replaceAll(/.*;+(.*)/g,"$1"):"";if(c.length===0){o.headComment||(o.headComment=[]),o.headComment.push(l);continue}let m=bn(c,i);o.data.push({comment:l,value:m})}}return r}function Xs(e){let t=mt(e),r=Number.parseFloat(t.molecules[0].NMREDATA_VERSION),n={};for(let i of t.labels)if(i.toLowerCase().match("nmredata")){if(!t.molecules[0]?.[i])continue;let o=i.replace(/NMREDATA_/,""),s=String(t.molecules[0][i]);s=r>1?s.replaceAll(/\n*/g,""):s,s=s.replaceAll(/\\\n*/g,`
|
|
18
|
-
`),n[o]=s}return n}function mt(e,t={}){if(typeof e=="string"){let{filename:r="nmredata.sdf",root:n=""}=t;return{...
|
|
19
|
-
${i.concat(o).join(",")}`);return e.offset=t,e.isBigEndian()?"BE":"LE"}var
|
|
20
|
-
`,index:i=0}=r;this.eol=n,this.index=i,this.lines=t.split(this.eol),this.length=this.lines.length}readLine(){if(this.index>=this.length)throw new Error(`Last index is ${this.length-1}. Current index ${this.index}.`);return this.lines[this.index++]}readLines(t){let r=this.lines.slice(this.index,this.index+t);return this.index+=t,r}},
|
|
18
|
+
`),n[o]=s}return n}function mt(e,t={}){if(typeof e=="string"){let{filename:r="nmredata.sdf",root:n=""}=t;return{...Ne(e,{mixedEOL:!0}),root:n,filename:r,filePath:r}}return e}import{generateID as In}from"@zakodium/nmrium-core";import{generateID as Sn}from"@zakodium/nmrium-core";import{xyIntegration as Vs}from"ml-spectra-processing";function An(e,t){let{x:r,re:n}=t.data;return e.map(i=>{let o=Vs({x:r,y:n},{from:i.from,to:i.to}),s=[];for(let a of i.signals||[]){let{kind:c=null,id:l,js:m=[],diaIDs:u=[],...f}=a;s.push({...f,kind:c||"signal",js:m,id:l||Sn(),diaIDs:u})}return{...i,id:i.id||Sn(),absolute:o,signals:s}})}function Mn(e,t){let r=[],{baseFrequency:n=500}=t.info;for(let i of e){let{delta:o,diaIDs:s=[],multiplicity:a="",integration:c=0}=i,l=i.jCoupling||[],m=Hs({delta:o,js:l,frequency:n});if(l&&a&&l.length===a.length){l.sort((u,f)=>f.coupling-u.coupling);for(let u=0;u<l.length;u++)l[u].multiplicity=a[u]}r.push({id:In(),...m,integration:c,signals:[{id:In(),js:l,delta:o,diaIDs:s,multiplicity:a}]})}t.ranges.values=An(re(r),t)}function Hs(e){let{delta:t,js:r=[],frequency:n}=e,i=.5;for(let o of r)i+=o.coupling;return i/=n,{from:t-i,to:t+i}}import{generateID as Nn}from"@zakodium/nmrium-core";var Gs=["x","y"],Ys={x:0,y:0};function Pn(e,t,r={}){let n=[],{shift:i=Ys}=r,{originFrequency:o=[400,400]}=t.info,s={x:o[0],y:o[1]};for(let a of e){let c={x:{},y:{},id:Nn(),kind:"signal"},l={id:Nn(),kind:"signal",peaks:[]},m={x:10,y:10};for(let u of Gs){let{coupling:f=[],delta:g,diaIDs:y=[]}=a[u];for(let p of f)m[u]+=p.coupling;if(a.activeCoupling){let{activeCoupling:p=[]}=a;for(let h of p)m[u]+=h.coupling}m[u]/=s[u],c[u]={from:g-m[u],to:g+m[u]},l[u]={delta:g,diaIDs:y,originalDelta:g-i[u]}}n.push({...c,signals:[l]})}t.zones.values=n}function En(e){return Ks(e.data)}function Ks(e){return"rr"in e||!("x"in e)&&"re"in e}async function Tn(e,t,r={}){let n={spectra:[],molecules:[]},i=await Zs(e,t,r);if(i.spectra.length>0){let{spectra:o,molecules:s,usedFiles:a}=i;n.spectra.push(...o),n.molecules.push(...s);let c=e.files.length;for(let l=c-1;l>=0;l--){let m=e.files[l].relativePath;!m.match(/acqu.*/s)&&a.includes(m)&&e.files.splice(l,1)}}return n}async function Zs(e,t,r){let n=[],i=await lt(e),o={spectra:[],molecules:[]};if(i.length===0)return{...o,usedFiles:n};let s=[];for(let c of i){let l=Dn({sdf:c,fileCollection:e}).then(m=>{let{spectra:u,molecules:f=[]}=m;return n.push(c.root+c.filename),o.molecules.push(...f),Qs(u,t,r)});s.push(l)}let a=await Promise.allSettled(s);for(let c of a)c.status==="fulfilled"?(o.spectra.push(...c.value.spectra),n.push(...c.value.usedFiles)):c.reason&&r?.logger?.error(c.reason);return{...o,usedFiles:n}}async function Qs(e,t,r){let n=[],i=[],o={spectra:[],molecules:[]};for(let s of e){let a=ea(s.source,t,r).then(c=>{let{spectra:l,files:m}=c;n.push(...m);for(let u of l)En(u)?Pn(s.signals,u):Mn(s.signals,u);o.spectra.push(...l)});i.push(a)}return await Promise.allSettled(i),{...o,usedFiles:n}}async function ea(e,t,r={}){let{file:n,jcampURL:i}=e,{converter:o}=r;if(i){let c=await ta(i,t,o?.jcamp);if(c)return{...c,files:[]}}let s=[];for(let c of n||[])s.push(ra(c,r).then(l=>({...l,files:c.fileCollection.files.map(m=>m.relativePath)})));let a=await Promise.allSettled(s);for(let c of a){if(c.status==="fulfilled")return c.value;c.reason&&r?.logger?.error(c.reason)}return{spectra:[],molecules:[],files:[]}}async function ta(e,t,r={}){let n={entries:[{relativePath:e}]},i={name:te(e||""),xy:!0,noContours:!0,...r},[{data:o}]=await t.readFromWebSource(n,i);return o}async function ra(e,t={}){let{converter:r,selector:n}=t;switch(e.type){case"jcamp":return Ie(e.fileCollection.files[0],{name:e?.fileCollection.files[0].name||"",converter:r?.jcamp,selector:n?.jcamp,logger:t.logger});case"brukerFiles":return Se(e.fileCollection,{converter:r?.bruker,selector:n});default:throw new Error("There is not a supported source")}}function ut(e){return na({id:"@zakodium/nmrium-core-plugins#NMReDATALoaderPlugin",version:1,shouldSerialize:!0,migrations:[],onReadProcess:{onFiles(t,r){return Tn(t,e,r)}}})}import{defineNMRiumPlugin as sa}from"@zakodium/nmrium-core";import{parse as ia}from"sdf-parser";function On(e,t={}){let{mixedEOL:r}=t,{molecules:n}=ia(e,{mixedEOL:r}),i=[];for(let[o,{molfile:s}]of n.entries()){let a=ee(s).entries();for(let[c,l]of a)l.selector={sdfIndex:o,molfileIndex:c},i.push(l)}return i}async function Cn(e,t={}){let{logger:r,mixedEOL:n,selector:i}=t;if(i?.files&&!i.files.includes(e.relativePath))return{molecules:[],spectra:[]};let o=await e.text(),s=On(o,{mixedEOL:n,selector:i});for(let c of s)c.selector={...c.selector,files:[e.relativePath]};let a={molecules:oa(s,i),spectra:[]};return r&&r[s.length>0?"info":"debug"](`Loaded ${a.molecules.length} molecules from the ${e.name} file`),a}function oa(e,t){if(!t)return e;let{sdfIndex:r,molfileIndex:n}=t;return e.filter(i=>(typeof r=="number"?r===i.selector?.sdfIndex:!0)&&(typeof n=="number"?n===i.selector?.molfileIndex:!0))}function aa(e,t={}){let{logger:r,selector:n}=t;return r?.debug(`Reading sdf file: ${e.name}`),Cn(e,{logger:r,selector:n})}function pt(){return sa({id:"@zakodium/nmrium-core-plugins#SDFLoaderPlugin",version:1,shouldSerialize:!0,migrations:[],onReadProcess:{supportedExtensions:["sdf"],onFile:aa}})}import{defineNMRiumPlugin as la}from"@zakodium/nmrium-core";import{Molecule as ca}from"openchemlib";function Rn(e,t){let r=t?.smilesIndex,n=[],i=e.split(/\r?\n/).filter(Boolean);for(let[o,s]of i.entries()){if(typeof r=="number"&&r!==o)continue;let c=ca.fromSmiles(s).toMolfile();n.push({molfile:c,selector:{smilesIndex:o}})}return n}async function wn(e,t={}){let{logger:r,selector:n}=t;if(n?.files&&!n.files.includes(e.relativePath))return{molecules:[],spectra:[]};let i=await e.text(),o=Rn(i,n);for(let a of o)a.selector={...a.selector,files:[e.relativePath]};let s={molecules:o,spectra:[]};return r?.info(`Found ${o.length} molecules from the ${e.name} file`),s}function ft(){return la({id:"@zakodium/nmrium-core-plugins#SMILESLoaderPlugin",version:1,shouldSerialize:!0,migrations:[],onReadProcess:{supportedExtensions:["smi","smiles"],onFile:wn}})}import{defineNMRiumPlugin as ha}from"@zakodium/nmrium-core";import{formatSpectra as da}from"@zakodium/nmrium-core";import{createFromToArray as ua}from"ml-spectra-processing/utils";function vn(e){e.setLittleEndian();let t=e.offset,r=96;e.offset=r/8;let n=e.readInt32(),i=[2,4],o=[2**25,2**26];if(!i.includes(n))if(o.includes(n))e.setBigEndian();else throw new Error(`Unexpected value of eBytes (${n}). Expect one of
|
|
19
|
+
${i.concat(o).join(",")}`);return e.offset=t,e.isBigEndian()?"BE":"LE"}var Ee=class{storesData;isSpectrum;isInt32;isFloat32;isComplex;isHypercomplex;isBaselineCorrected;constructor(t){if(this.storesData=(t&1)!==0,!this.storesData)throw new Error("No data stored in file. Exiting...");if(this.isSpectrum=(t&2)!==0,this.isSpectrum)throw new Error("Script only analyzes FIDs. Found spectrum.");if(this.isInt32=(t&4)!==0,this.isFloat32=(t&8)!==0,this.isComplex=(t&16)!==0,this.isHypercomplex=(t&32)!==0,this.isHypercomplex)throw new Error("Script does not analyze hypercomplex data (yet).");this.isBaselineCorrected=(t&64)!==0}},Te=class extends Ee{moreBlocks;npComplex;nfComplex;niComplex;ni2Complex;constructor(t){super(t),this.moreBlocks=(t&128)!==0,this.npComplex=(t&256)!==0,this.nfComplex=(t&512)!==0,this.niComplex=(t&1024)!==0,this.ni2Complex=(t&2048)!==0}},Oe=class extends Ee{isAcqPar;isSecondFT;isTransformed;is3D;isNp;isNf;isNi;isNi2;constructor(t){super(t),this.isAcqPar=(t&128)!==0,this.isSecondFT=(t&256)!==0,this.isTransformed=(t&512)!==0,this.is3D=(t&1024)!==0,this.isNp=(t&2048)!==0,this.isNf=(t&4096)!==0,this.isNi=(t&8192)!==0,this.isNi2=(t&16384)!==0}},Ce=class{lines;length;index;eol;constructor(t,r={}){let{eol:n=`
|
|
20
|
+
`,index:i=0}=r;this.eol=n,this.index=i,this.lines=t.split(this.eol),this.length=this.lines.length}readLine(){if(this.index>=this.length)throw new Error(`Last index is ${this.length-1}. Current index ${this.index}.`);return this.lines[this.index++]}readLines(t){let r=this.lines.slice(this.index,this.index+t);return this.index+=t,r}},Re=class{softwareVersion;typeOfFile;vendorIdStatus;constructor(t){this.softwareVersion=t&2**6-1,this.typeOfFile={fidFile:(t&64)!==0,dataFile:(t&128)!==0,data3DFile:(t&256)!==0},this.vendorIdStatus={isVar:(t&0)!==0,isQOne:(t&2048)!==0,isMakeFid:(t&4096)!==0,isJeol:(t&8192)!==0,isBru:(t&16384)!==0,isMag:(t&6144)!==0,isOx:(t&10240)!==0,ipVers:(t&63)!==0,ipFileId:(t&1984)!==0,ipVendorId:(t&30720)!==0}}},we=class{npPhMode;npAvMode;npPwrMode;nfPhMode;nfAvMode;nfPwrMode;niPhMode;niAvMode;niPwrMode;ni2PhMode;ni2AvMode;ni2PwrMode;niPaMode;ni2PaMode;constructor(t){this.npPhMode=(t&1)!==0,this.npAvMode=(t&2)!==0,this.npPwrMode=(t&4)!==0,this.nfPhMode=(t&16)!==0,this.nfAvMode=(t&32)!==0,this.nfPwrMode=(t&64)!==0,this.niPhMode=(t&256)!==0,this.niAvMode=(t&512)!==0,this.niPwrMode=(t&1024)!==0,this.ni2PhMode=(t&8)!==0,this.ni2AvMode=(t&256)!==0,this.ni2PwrMode=(t&8192)!==0,this.niPaMode=(t&16384)!==0,this.ni2PaMode=(t&32768)!==0}};var ve=class{scale;status;index;mode;ctCount;lpVal;rpVal;lvl;tlt;data;constructor(t,r,n){n&&(t.offset=n),this.scale=t.readInt16(),this.status=new Te(t.readInt16()),this.index=t.readInt16(),this.mode=new we(t.readInt16()),this.ctCount=t.readInt32(),this.lpVal=t.readFloat32(),this.rpVal=t.readFloat32(),this.lvl=t.readFloat32(),this.tlt=t.readFloat32(),this.data=ma(t,r)}};function ma(e,t){let{np:r,nTraces:n,status:{isFloat32:i,isInt32:o}}=t;return i?dt(e,n,r,"readFloat32"):o?dt(e,n,r,"readInt32"):dt(e,n,r,"readInt16")}function dt(e,t,r,n){let i=[],o;n==="readFloat32"?o={re:new Float32Array(r/2),im:new Float32Array(r/2)}:n==="readInt32"?o={re:new Int32Array(r/2),im:new Int32Array(r/2)}:o={re:new Int16Array(r/2),im:new Int16Array(r/2)};for(let s=0;s<t;s++){for(let a=0;a<r;a+=2)o.re[a>>>1]=e[n](),o.im[a>>>1]=e[n]();i[s]=o}return i}var Le=class{nBlocks;nTraces;np;eBytes;tBytes;bBytes;version;status;nBlockHeaders;constructor(t){t.offset=0,this.nBlocks=t.readInt32(),this.nTraces=t.readInt32(),this.np=t.readInt32(),this.eBytes=t.readInt32(),this.tBytes=t.readInt32(),this.bBytes=t.readInt32(),this.version=new Re(t.readInt16()),this.status=new Oe(t.readInt16()),this.nBlockHeaders=t.readInt32()}};var gt=class{name;subType;basicType;maxValue;minValue;stepSize;gGroup;dGroup;protection;active;intptr;constructor(t){let r=t.split(" ");this.name=r[0],this.subType=Number.parseInt(r[1],10),this.basicType=Number.parseInt(r[2],10),this.maxValue=Number.parseFloat(r[3]),this.minValue=Number.parseFloat(r[4]),this.stepSize=Number.parseFloat(r[5]),this.gGroup=Number.parseInt(r[6],10),this.dGroup=Number.parseInt(r[7],10),this.protection=Number.parseInt(r[8],10),this.active=Number.parseInt(r[9],10),this.intptr=Number.parseInt(r[10],10)}};function Ln(e){let t=[],r=new Ce(e.readChars(e.length));for(;r.index<r.length-1;){let n=[],i=[],o=new gt(r.readLine()),s=r.readLine();if(o.basicType!==0){if(o.basicType===1)n=s.split(" ").slice(1).map(m=>Number.parseFloat(m));else if(o.basicType===2){n=s.split('"').slice(1,2);let l=Number.parseInt(s.split(" ")[0],10);for(;l>1;)n.push(r.readLine().split('"')[1]),l--}}let a=r.readLine(),c=Number.parseInt(a.split(" ")[0],10);c!==0&&(o.basicType===1?i=a.split(" ").slice(1):o.basicType===2&&(i=a.split('"').filter((l,m)=>m%2===1))),t.push({...o,values:n,enumerable:c,enumerables:i})}return t}async function kn(e){let t={};function r(c,l){return c.then(m=>{t[l]=m})}let n=[];for(let c of e)switch(c.name.toLowerCase()){case"fid":{n.push(r(c.arrayBuffer(),"fidB"));break}case"procpar":{n.push(r(c.arrayBuffer(),"procparB"));break}default:break}if(await Promise.all(n),!t.fidB||!t.procparB)throw new RangeError("fid and procpar must exist.");let i=new R(t.fidB);vn(i);let o=new Le(i);if(o.nBlocks!==1)throw new Error("We currently do not support 2D varian spectra ");let s=Ln(new R(t.procparB)),a;for(let c of s)if(c.name==="at"){a=c.values[0];break}if(typeof a!="number")throw new Error("acquisition time parameter must exist and be a number.");{let c=ua({from:0,to:a,length:o.np/2,distribution:"uniform"}),l=new ve(i,o);return{meta:o,fid:l,procpar:s,x:c}}}import{isAnyArray as ga}from"is-any-array";import{xMultiply as ya}from"ml-spectra-processing";import{normalizeNucleus as pa}from"nmr-processing";function _n(e,t){let{meta:r,procpar:n}=e,i={};for(let F of n)i[F.name]=F.values;let o={},s={},{np:a,solvent:c,sfrq:l,reffrq:m,temp:u,rp:f,sw:g,rfl:y,rfp:p}=i;D(o,"numberOfPoints",a&&Number(U(a))/2),D(o,"solvent",U(c)),D(o,"originFrequency",U(l)),D(o,"baseFrequency",U(m)),(Number.isNaN(o.originFrequency)||o.originFrequency===0)&&(o.originFrequency=400,t?.warn("The frequency could not be determined and was set to 400MHz")),D(o,"temperature",U(u)),D(o,"phc0",f&&Number(f[0])),D(s,"rfl",y&&Number(U(y))),D(s,"rfp",p&&Number(U(p))),D(s,"sw",g&&Number(U(g)));for(let F in s){let b=s[F];Array.isArray(b)&&b.length===1&&(s[F]=b[0])}if(!("baseFrequency"in o)&&"originFrequency"in o){let F=Number.parseFloat(o.originFrequency);if(["sw","rfl","rfp"].every(b=>b in s)){let{sw:b=1,rfl:S=1,rfp:I=1}=fa(s,["sw","rfl","rfp"]);D(o,"baseFrequency",F-(b/2-S+I)/1e6)}else D(o,"baseFrequency",F)}let{baseFrequency:h,originFrequency:d}=o;D(o,"frequencyOffset",(d-h)*1e6),D(o,"spectralWidth",g&&Number(g[0])/o.baseFrequency);for(let F in o)o[F].length===1&&(o[F]=o[F][0]);return i.tn&&(o.nucleus=i.tn.map(pa)),o.dimension=1,o.isFid=!r.status.isSpectrum,{info:o,meta:{...s,...qn(r),...i}}}function U(e){return e&&(Array.isArray(e)?e[0]:e)}function fa(e,t){let r={};for(let n of t){let i=e[n];i&&typeof i=="number"&&(r[n]=i)}return r}function qn(e){let t={};for(let r of Object.keys(e)){let n=e[r];typeof n=="object"&&n!==null&&n.constructor&&n.constructor!==Object?t[r]=qn(n):t[r]=n}return t}function jn(e){let t={},r=new Set(e.files.map(n=>n.relativePath));for(let n of e){let i=n.name.toLowerCase();if(i.match(/^(?:fid|procpar|text|log)$/)){if(i.match(/^(?:fid|text|log)$/)){let a=n.relativePath.replace(/(?:fid|text|log)$/,"procpar");if(!r.has(a))continue}let o=n.relativePath.split("/"),s=o.slice(0,-1).join("/");t[s]||(t[s]={name:o.at(-2),files:[]}),t[s].files.push(n)}}return Object.values(t)}async function Bn(e,t={}){let{logger:r,selector:n}=t,i=jn(e);r&&r.debug(`Found ${Object.keys(i).length} varian experiments`);let o=[],s={spectra:[],molecules:[]};e:for(let c of i){let{name:l,files:m}=c;if(n?.files){let f=m;if(f.length===0)continue;let g=new Set(n.files);for(let y of f)if(!g.has(y.relativePath))continue e}let u=kn(m).then(f=>{let{info:g,meta:y}=_n(f),p=f.fid.data[0],h=ga(p.im),d={data:{...p,x:f.x},meta:y,info:{isComplex:h,name:l,...g},display:{name:l}};if(g.isFid&&h){let{im:F}=d.data;ya(F,-1,{output:F})}d.selector={files:m.map(F=>F.relativePath)},s.spectra.push(d)});o.push(u)}let a=await Promise.allSettled(o);for(let c=0;c<a.length;c++){let l=a[c];if(l.status==="rejected"&&l.reason){let m=i[c].name;r?.warn(`Varian data: ${m}, fails with: ${l.reason}`)}}return s.spectra.length>0&&r?.info(`Loaded ${s.spectra.length} spectra from Varian files`),da(s)}function ba(e,t){let{logger:r}=t??{};return Bn(e,{logger:r})}function yt(){return ha({id:"@zakodium/nmrium-core-plugins#VarianLoaderPlugin",version:1,shouldSerialize:!0,migrations:[],onReadProcess:{onFiles:ba}})}function xa(e,t=[]){return[ut(e),yt(),Ge(),Qe(),at(),pt(),ft(),st(),$e()].concat(t)}function Da(e=[]){let t=new Fa;return t.registerPlugins(xa(t,e)),t}import{getOneIfArray as $n}from"@zakodium/nmrium-core";import{from1DNMRVariables as Sa}from"convert-to-jcamp";function Un(e,t){return e.filters.find(r=>r.name===t)}function Aa(e,t={}){let{onlyReal:r=!1}=t,{info:n,meta:i,data:o}=e,{owner:s,title:a,isFid:c,spectralWidth:l,baseFrequency:m,originFrequency:u,nucleus:f,solvent:g,scaleFactor:y,frequencyOffset:p,decim:h,dspfvs:d,digitalFilter:F}=n,b=$n(m||u),{x:S,re:I,im:x}=o,A=new Float64Array(I),M=!r&&x?new Float64Array(x):void 0,P=Un(e,"fft")?.enabled,v={owner:s,isFid:c,title:a,nucleus:f,solvent:g,scaleFactor:y,spectralWidth:l,frequencyOffset:p,originFrequency:u,baseFrequency:b,dataType:!c||P?"NMR SPECTRUM":"NMR FID",dataClass:!r&&x?"NTUPLES":"XYDATA"};if(c){let ae=e.filters.find(V=>V.name==="digitalFilter");if(ae&&!P){let{value:{digitalFilterValue:V},enabled:ke}=ae;if(ke){let j=Math.floor(V);A.set(I.slice(I.length-j)),A.set(I.slice(0,I.length-j),j),x&&M&&(M.set(x.slice(x.length-j)),M.set(x.slice(0,x.length-j),j))}}ht(v,"decim",h),ht(v,"dspfvs",d),ht(v,"digitalFilter",F)}let _=Ia(i,zn),q={xyEncoding:"DIFDUP",nmrInfo:v,meta:_},se={x:{data:S,label:n.isFid?"TIME":"FREQUENCY",units:n.isFid?"second":"HZ",symbol:"X"},r:{data:A,label:`${n.isFid?"FID":"SPECTRUM"}/REAL`,units:"ARBITRARY UNITS",symbol:"R"}};return M&&(se.i={data:M,label:`${n.isFid?"FID":"SPECTRUM"}/IMAG`,units:"ARBITRARY UNITS",symbol:"I"}),Sa(se,q)}function ht(e,t,r){r!==void 0&&(e[t]=$n(r))}var zn=["title","decim","dspfvs","grpdly","bf1","sw","offset",".solvent","owner","firsty","page","vardim","symbol","symbols","varform","vartype","datatype","dataclass",".observefrequency",".observenucleus","ncproc"];function Ia(e,t=zn){let r=new Set(t);return Object.fromEntries(Object.entries(e).filter(([n])=>!r.has(n.toLocaleLowerCase().replaceAll(/[\s|_]*/g,""))))}export{$e as autoPostProcessing,Ge as brukerLoader,Da as default,Da as init,Qe as jcampDXLoader,st as jeolLoader,at as molfileLoader,ut as nmreDATALoader,_r as processJCAMPDX,On as readSDF,Rn as readSMILES,xa as recommended,pt as sdfLoader,ft as smilesLoader,Aa as spectrum1DToJCAMPDX,yt as varianLoader};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zakodium/nmrium-core-plugins",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.33",
|
|
4
4
|
"description": "Recommended plugins for NMRium, loaders of common formats like bruker or jcamp, and some post-processing plugins",
|
|
5
5
|
"author": "Zakodium Sàrl",
|
|
6
6
|
"license": "CC-BY-NC-SA-4.0",
|
|
@@ -58,13 +58,13 @@
|
|
|
58
58
|
"linear-sum-assignment": "^1.0.9",
|
|
59
59
|
"lodash.merge": "^4.6.2",
|
|
60
60
|
"ml-spectra-processing": "^14.18.2",
|
|
61
|
-
"nmr-processing": "^22.
|
|
62
|
-
"openchemlib": "^9.
|
|
63
|
-
"openchemlib-utils": "^8.
|
|
61
|
+
"nmr-processing": "^22.4.0",
|
|
62
|
+
"openchemlib": "^9.19.0",
|
|
63
|
+
"openchemlib-utils": "^8.12.1",
|
|
64
64
|
"sdf-parser": "^7.0.4"
|
|
65
65
|
},
|
|
66
66
|
"volta": {
|
|
67
67
|
"extends": "../../../package.json"
|
|
68
68
|
},
|
|
69
|
-
"gitHead": "
|
|
69
|
+
"gitHead": "f553b21c64f408bb591c37e2baa09d35cf66440c"
|
|
70
70
|
}
|