jcampconverter 12.2.2 → 12.2.4

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.
@@ -8,4 +8,4 @@ import{ensureString as me}from"ensure-string";var $=/\s*\$\$.*/;function E(e,m=/
8
8
  ##`).split(`
9
9
  ##`);t.logger?.trace({profiling:!0},"Split to LDRS"),u[0]&&(u[0]=u[0].replace(/^[\r\n ]*##/,""));for(let c of u){let b=c.indexOf("="),p=b>0?c.slice(0,Math.max(0,b)):c,r=b>0?p.match(t.noTrimRegExp)?c.slice(Math.max(0,b+1)):c.slice(Math.max(0,b+1)).trim():"",a=p.replaceAll(/[_ -]/g,"").toUpperCase();if(a==="DATATABLE"){let d=r.indexOf(`
10
10
  `);if(d===-1&&(d=r.indexOf("\r")),d>0){let g=r.slice(0,Math.max(0,d)).split(/[ ,;\t]+/);K(n,s,g[0]),s.datatable=g[0],g[1]?.includes("PEAKS")?a="PEAKTABLE":g[1]&&(g[1].indexOf("XYDATA")||g[0].indexOf("++")>0)&&(a="XYDATA",s.nbPoints&&s.lastX!==void 0&&s.firstX!==void 0&&(s.deltaX=(s.lastX-s.firstX)/(s.nbPoints-1)))}}if(a==="XYDATA"){t.wantXY&&(j(s),r.match(/.*\+\+.*/)?(s.nbPoints&&s.lastX!==void 0&&s.firstX!==void 0&&(s.deltaX=(s.lastX-s.firstX)/(s.nbPoints-1)),V(s,r,t)):w(s,r,t),n?.spectra.push(s),s={data:{}});continue}else if(a==="PEAKTABLE"){t.wantXY&&(j(s),w(s,r,t),n?.spectra.push(s),s={data:{}});continue}if(a==="PEAKASSIGNMENTS"){t.wantXY&&(r.match(/.*[^A-Z]*.*/)&&B(s,r),n?.spectra.push(s),s={data:{}});continue}if(t.removeComments&&(r=r.split(/\r?\n/).map(d=>d.replace(/ *\$\$.*$/,"")).join(`
11
- `)),a==="TITLE"){let d=n;d.children||(d.children=[]),n={spectra:[],ntuples:{},info:{},meta:{},tmp:{}},d.children.push(n),f.push(d),o.push(n),n.title=r}else a==="DATATYPE"?(n.dataType=r,r.match(/^nd|\snd\s/i)&&(n.twoD=!0)):a==="NTUPLES"?r.match(/^nd|\snd\s/i)&&(n.twoD=!0):a==="DATACLASS"?n.dataClass=r:a==="JCAMPDX"?n.jcampDX=E(r):a==="JCAMPCS"?n.jcampCS=E(r):a==="XUNITS"?s.xUnits=r:a==="YUNITS"?s.yUnits=r:a==="FIRSTX"?s.firstX=Number(r):a==="LASTX"?s.lastX=Number(r):a==="FIRSTY"?s.firstY=Number(r):a==="LASTY"?s.lastY=Number(r):a==="NPOINTS"?s.nbPoints=Number(r):a==="XFACTOR"?s.xFactor=Number(r):a==="YFACTOR"?s.yFactor=Number(r):a==="MAXX"?s.maxX=Number(r):a==="MINX"?s.minX=Number(r):a==="MAXY"?s.maxY=Number(r):a==="MINY"?s.minY=Number(r):a==="DELTAX"?s.deltaX=Number(r):a===".OBSERVEFREQUENCY"||a==="$SFO1"?s.observeFrequency||(s.observeFrequency=Number(r)):a===".OBSERVENUCLEUS"?s.xType||(n.xType=r.replaceAll(/[^a-zA-Z0-9]/g,"")):a==="$OFFSET"?(n.shiftOffsetNum=0,s.shiftOffsetVal||(s.shiftOffsetVal=Number(r))):a==="$REFERENCEPOINT"||(a==="VARNAME"?n.ntuples.varname=r.split(R):a==="SYMBOL"?n.ntuples.symbol=r.split(R):a==="VARTYPE"?n.ntuples.vartype=r.split(R):a==="VARFORM"?n.ntuples.varform=r.split(R):a==="VARDIM"?n.ntuples.vardim=O(r.split(R)):a==="UNITS"?n.ntuples.units=r.split(R):a==="FACTOR"?n.ntuples.factor=O(r.split(R)):a==="FIRST"?n.ntuples.first=O(r.split(R)):a==="LAST"?n.ntuples.last=O(r.split(R)):a==="MIN"?n.ntuples.min=O(r.split(R)):a==="MAX"?n.ntuples.max=O(r.split(R)):a===".NUCLEUS"?n.ntuples&&(n.ntuples.nucleus=r.split(R).map(d=>d.replaceAll(/[^a-zA-Z0-9]/g,""))):a==="PAGE"?(s.page=r.trim(),s.pageValue=Number(r.replace(/^.*=/,"")),s.pageSymbol=s.page.replace(/[=].*/,"")):a==="RETENTIONTIME"?s.pageValue=Number(r):re(a)?s[k(a)]=r:a==="SAMPLEDESCRIPTION"?s.sampleDescription=r:a.startsWith("$NUC")?!n.tmp[a]&&!r.includes("off")&&(n.tmp[a]=r.replaceAll(/[<>]/g,"")):a==="END"&&(n=f.pop()));if(n?.info&&n.meta&&a.match(t.keepRecordsRegExp)){let d,g;p.startsWith("$")?(g=t.canonicMetadataLabels?a.slice(1):p.slice(1),d=n.meta):(g=t.canonicDataLabels?a:p,d=n.info),t.dynamicTyping&&(r=be(r)),d[g]?(Array.isArray(d[g])||(d[g]=[d[g]]),d[g].push(r)):d[g]=r}}if(t.logger?.trace({profiling:!0},"Finished parsing"),q(o,l,t),t.logger?.trace({profiling:!0},"Total time"),l.entries=i.children||[],l.flatten=o,t.logger){t.logger.debug("Finished jcamp conversion");for(let c of l.flatten)t.logger.debug(`${c.dataType} - ${c.title}`)}return l}function gt(e,m){let{logger:t,OCL:o}=m;if(!e.info.ATOMLIST||!e.info.BONDLIST){t?.warn("No ATOMLIST or BONDLIST in the JCAMP-CS entry");return}Te(e,t);let l=xe(e.info.ATOMLIST),i=Ae(e.info.BONDLIST),n=Ne(e.info.CHARGE,t),f=Se(e.info.XYRASTER,t),s=Ce(e.info.STEREOCENTER,t),u=ye(o,{atoms:l,bonds:i,charges:n,xyRasters:f,stereocenters:s},t);return{molecule:u,molfile:u.toMolfile()}}function ye(e,m,t){let{atoms:o,bonds:l,charges:i,xyRasters:n,stereocenters:f}=m,s={S:e.Molecule.cBondTypeSingle,D:e.Molecule.cBondTypeDouble,T:e.Molecule.cBondTypeTriple,Q:e.Molecule.cBondTypeQuadruple},u={},c=new e.Molecule(o.length,l.length);for(let p of o){let r=e.Molecule.getAtomicNoFromLabel(p.element);r||(t?.error(`Atomic number of ${p.element} could not be determined`),r=e.Molecule.getAtomicNoFromLabel("X")),u[p.atomNumber]=c.addAtom(r),c.setAtomMapNo(u[p.atomNumber],p.atomNumber,!1)}for(let p of l){if(u[p.atomNumber1]===void 0){t?.error(`A bond goes from atomNumber ${p.atomNumber1} that does not exists`);continue}if(u[p.atomNumber2]===void 0){t?.error(`A bond goes to atomNumber ${p.atomNumber2} that does not exists`);continue}let r=c.addBond(u[p.atomNumber1],u[p.atomNumber2]);c.setBondType(r,s[p.bondType])}for(let p of i){if(u[p.atomNumber]===void 0){t?.error(`A charge goes to atomNumber ${p.atomNumber} that does not exists`);continue}c.setAtomCharge(u[p.atomNumber],p.value)}let b=n.length===0||f.length>0;for(let p of n){if(u[p.atomNumber]===void 0){t?.error(`A XYRASTER goes to atomNumber ${p.atomNumber} that does not exists`);continue}c.setAtomX(u[p.atomNumber],p.x),c.setAtomY(u[p.atomNumber],p.y),c.setAtomZ(u[p.atomNumber],p.z)}c.ensureHelperArrays(e.Molecule.cHelperParities);for(let p of f){let{atomNumber:r,type:a}=p,d=u[r];if(d===void 0){t?.error(`A stereocenter goes to atomNumber ${r} that does not exists`);continue}if(!c.isAtomStereoCenter(d)){t?.warn(`Want to set chirality of atom number ${r} but it is not a stereocenter`);continue}if(c.getAtomParity(d)!==e.Molecule.cAtomParityUnknown){t?.debug(`Atom number ${r} already has a parity defined based on 3D coordinates`);continue}let x=a==="P"?e.Molecule.cAtomParity1:e.Molecule.cAtomParity2;c.setAtomParity(u[r],x,!1)}return c.ensureHelperArrays(e.Molecule.cHelperParities),b&&c.inventCoordinates(),c}function xe(e){let m=P(e),t=[];for(let o of m){let[l,i,n]=o.trim().split(/\s+/);t.push({atomNumber:Number(l),element:i,nbImplicitHydrogens:n?.length>0?Number(n):void 0})}return t}function Ae(e){let m=P(e),t=[];for(let o of m){let[l,i,n]=o.trim().split(/\s+/);t.push({atomNumber1:Number(l),atomNumber2:Number(i),bondType:n})}return t}function Ne(e,m){if(!e)return[];let t=P(e),o=[];for(let l of t){let[i,n,f]=l.trim().split(/\s+/);f!==void 0&&m?.warn("Charge on multiple atom is not supported"),o.push({atomNumber:Number(n),value:Number(i)})}return o}function Se(e,m){if(!e)return[];let t=P(e),o=[];for(let l of t){let[i,n,f,s]=l.trim().split(/\s+/);if(i===void 0){m?.warn("XYRASTER without atom number is not supported");continue}o.push({atomNumber:Number(i),x:Number(n),y:Number(f),z:s!==void 0?Number(s):0})}return o}function Ce(e,m){if(!e)return[];let t=P(e),o=[];for(let l of t){let[i,n]=l.trim().split(/\s+/);if(!["P","M"].includes(n)){m?.warn(`Stereocenter type ${n} is not supported`);continue}o.push({atomNumber:Number(i),type:n})}return o}function P(e){return e.split(/\r?\n/).map(m=>E(m)).filter(Boolean)}function Te(e,m){let t=["STEREOPAIR","STEREOCENTER","RADICAL","STEREOMOLECULE"];for(let o of t)e.info[o]&&m?.warn(`JCAMP-CS parser do not support: ${o}`)}export{pt as convert,Le as createTree,gt as parseJcampCS,E as removeComment,$ as removeCommentRegExp};
11
+ `)),a==="TITLE"){let d=n;d.children||(d.children=[]),n={spectra:[],ntuples:{},info:{},meta:{},tmp:{}},d.children.push(n),f.push(d),o.push(n),n.title=r}else a==="DATATYPE"?(n.dataType=r,r.match(/^nd|\snd\s/i)&&(n.twoD=!0)):a==="NTUPLES"?r.match(/^nd|\snd\s/i)&&(n.twoD=!0):a==="DATACLASS"?n.dataClass=r:a==="JCAMPDX"?n.jcampDX=E(r):a==="JCAMPCS"?n.jcampCS=E(r):a==="XUNITS"?s.xUnits=r:a==="YUNITS"?s.yUnits=r:a==="FIRSTX"?s.firstX=Number(r):a==="LASTX"?s.lastX=Number(r):a==="FIRSTY"?s.firstY=Number(r):a==="LASTY"?s.lastY=Number(r):a==="NPOINTS"?s.nbPoints=Number(r):a==="XFACTOR"?s.xFactor=Number(r):a==="YFACTOR"?s.yFactor=Number(r):a==="MAXX"?s.maxX=Number(r):a==="MINX"?s.minX=Number(r):a==="MAXY"?s.maxY=Number(r):a==="MINY"?s.minY=Number(r):a==="DELTAX"?s.deltaX=Number(r):a===".OBSERVEFREQUENCY"||a==="$SFO1"?s.observeFrequency||(s.observeFrequency=Number(r)):a===".OBSERVENUCLEUS"?s.xType||(n.xType=r.replaceAll(/[^a-zA-Z0-9]/g,"")):a==="$OFFSET"?(n.shiftOffsetNum=0,s.shiftOffsetVal||(s.shiftOffsetVal=Number(r))):a==="$REFERENCEPOINT"||(a==="VARNAME"?n.ntuples.varname=r.split(R):a==="SYMBOL"?n.ntuples.symbol=r.split(R):a==="VARTYPE"?n.ntuples.vartype=r.split(R):a==="VARFORM"?n.ntuples.varform=r.split(R):a==="VARDIM"?n.ntuples.vardim=O(r.split(R)):a==="UNITS"?n.ntuples.units=r.split(R):a==="FACTOR"?n.ntuples.factor=O(r.split(R)):a==="FIRST"?n.ntuples.first=O(r.split(R)):a==="LAST"?n.ntuples.last=O(r.split(R)):a==="MIN"?n.ntuples.min=O(r.split(R)):a==="MAX"?n.ntuples.max=O(r.split(R)):a===".NUCLEUS"?n.ntuples&&(n.ntuples.nucleus=r.split(R).map(d=>d.replaceAll(/[^a-zA-Z0-9]/g,""))):a==="PAGE"?(s.page=r.trim(),s.pageValue=Number(r.replace(/^.*=/,"")),s.pageSymbol=s.page.replace(/[=].*/,"")):a==="RETENTIONTIME"?s.pageValue=Number(r):re(a)?s[k(a)]=r:a==="SAMPLEDESCRIPTION"?s.sampleDescription=r:a.startsWith("$NUC")?!n.tmp[a]&&!r.includes("off")&&(n.tmp[a]=r.replaceAll(/[<>]/g,"")):a==="END"&&(n=f.pop()));if(n?.info&&n.meta&&a.match(t.keepRecordsRegExp)){let d,g;p.startsWith("$")?(g=t.canonicMetadataLabels?a.slice(1):p.slice(1),d=n.meta):(g=t.canonicDataLabels?a:p,d=n.info),t.dynamicTyping&&(r=be(r)),d[g]?(Array.isArray(d[g])||(d[g]=[d[g]]),d[g].push(r)):d[g]=r}}if(t.logger?.trace({profiling:!0},"Finished parsing"),q(o,l,t),t.logger?.trace({profiling:!0},"Total time"),l.entries=i.children||[],l.flatten=o,t.logger){t.logger.debug("Finished jcamp conversion");for(let c of l.flatten)t.logger.debug(`${c.dataType} - ${c.title}`)}return l}function gt(e,m){let{logger:t,OCL:o}=m;if(!e.info.ATOMLIST||!e.info.BONDLIST){t?.warn("No ATOMLIST or BONDLIST in the JCAMP-CS entry");return}Te(e,t);let l=xe(e.info.ATOMLIST),i=Ae(e.info.BONDLIST),n=Ne(e.info.CHARGE,t),f=Se(e.info.XYRASTER,t),s=Ce(e.info.STEREOCENTER,t),u=ye(o,{atoms:l,bonds:i,charges:n,xyRasters:f,stereocenters:s},t);return{molecule:u,molfile:u.toMolfile()}}function ye(e,m,t){let{atoms:o,bonds:l,charges:i,xyRasters:n,stereocenters:f}=m,s={S:e.Molecule.cBondTypeSingle,D:e.Molecule.cBondTypeDouble,T:e.Molecule.cBondTypeTriple,Q:e.Molecule.cBondTypeQuadruple},u={},c=new e.Molecule(o.length,l.length);for(let p of o){let r=e.Molecule.getAtomicNoFromLabel(p.element);r||(t?.error(`Atomic number of ${p.element} could not be determined`),r=e.Molecule.getAtomicNoFromLabel("X")),u[p.atomNumber]=c.addAtom(r),c.setAtomMapNo(u[p.atomNumber],p.atomNumber,!1)}for(let p of l){if(u[p.atomNumber1]===void 0){t?.error(`A bond goes from atomNumber ${p.atomNumber1} that does not exists`);continue}if(u[p.atomNumber2]===void 0){t?.error(`A bond goes to atomNumber ${p.atomNumber2} that does not exists`);continue}let r=c.addBond(u[p.atomNumber1],u[p.atomNumber2]);c.setBondType(r,s[p.bondType])}for(let p of i){if(u[p.atomNumber]===void 0){t?.error(`A charge goes to atomNumber ${p.atomNumber} that does not exists`);continue}c.setAtomCharge(u[p.atomNumber],p.value)}let b=n.length===0||f.length>0;for(let p of n){if(u[p.atomNumber]===void 0){t?.error(`A XYRASTER goes to atomNumber ${p.atomNumber} that does not exists`);continue}c.setAtomX(u[p.atomNumber],p.x),c.setAtomY(u[p.atomNumber],p.y),c.setAtomZ(u[p.atomNumber],p.z)}c.ensureHelperArrays(e.Molecule.cHelperParities);for(let p of f){let{atomNumber:r,type:a}=p,d=u[r];if(d===void 0){t?.error(`A stereocenter goes to atomNumber ${r} that does not exists`);continue}if(!c.isAtomStereoCenter(d)){t?.warn(`Want to set chirality of atom number ${r} but it is not a stereocenter`);continue}if(c.getAtomParity(d)!==e.Molecule.cAtomParityUnknown){t?.debug(`Atom number ${r} already has a parity defined based on 3D coordinates`);continue}let x=a==="P"?e.Molecule.cAtomParity1:e.Molecule.cAtomParity2;c.setAtomParity(u[r],x,!1)}return c.ensureHelperArrays(e.Molecule.cHelperParities),b&&c.inventCoordinates({keepHydrogens:!0}),c}function xe(e){let m=P(e),t=[];for(let o of m){let[l,i,n]=o.trim().split(/\s+/);t.push({atomNumber:Number(l),element:i,nbImplicitHydrogens:n?.length>0?Number(n):void 0})}return t}function Ae(e){let m=P(e),t=[];for(let o of m){let[l,i,n]=o.trim().split(/\s+/);t.push({atomNumber1:Number(l),atomNumber2:Number(i),bondType:n})}return t}function Ne(e,m){if(!e)return[];let t=P(e),o=[];for(let l of t){let[i,n,f]=l.trim().split(/\s+/);f!==void 0&&m?.warn("Charge on multiple atom is not supported"),o.push({atomNumber:Number(n),value:Number(i)})}return o}function Se(e,m){if(!e)return[];let t=P(e),o=[];for(let l of t){let[i,n,f,s]=l.trim().split(/\s+/);if(i===void 0){m?.warn("XYRASTER without atom number is not supported");continue}o.push({atomNumber:Number(i),x:Number(n),y:Number(f),z:s!==void 0?Number(s):0})}return o}function Ce(e,m){if(!e)return[];let t=P(e),o=[];for(let l of t){let[i,n]=l.trim().split(/\s+/);if(!["P","M"].includes(n)){m?.warn(`Stereocenter type ${n} is not supported`);continue}o.push({atomNumber:Number(i),type:n})}return o}function P(e){return e.split(/\r?\n/).map(m=>E(m)).filter(Boolean)}function Te(e,m){let t=["STEREOPAIR","STEREOCENTER","RADICAL","STEREOMOLECULE"];for(let o of t)e.info[o]&&m?.warn(`JCAMP-CS parser do not support: ${o}`)}export{pt as convert,Le as createTree,gt as parseJcampCS,E as removeComment,$ as removeCommentRegExp};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jcampconverter",
3
- "version": "12.2.2",
3
+ "version": "12.2.4",
4
4
  "description": "Parse and convert JCAMP-DX data",
5
5
  "license": "CC-BY-NC-SA-4.0",
6
6
  "type": "module",
@@ -45,18 +45,18 @@
45
45
  "ml-spectra-processing": "^14.22.0",
46
46
  "rimraf": "^6.1.3",
47
47
  "typescript": "~5.9.3",
48
- "vitest": "^4.0.18"
48
+ "vitest": "^4.1.1"
49
49
  },
50
50
  "dependencies": {
51
51
  "cheminfo-types": "^1.10.0",
52
- "dynamic-typing": "^1.0.1",
52
+ "dynamic-typing": "^2.0.0",
53
53
  "ensure-string": "^2.0.0",
54
54
  "gyromagnetic-ratio": "^2.0.0",
55
55
  "ml-array-median": "^1.1.6",
56
- "openchemlib": "^9.20.0"
56
+ "openchemlib": "^9.22.0"
57
57
  },
58
58
  "volta": {
59
59
  "extends": "../../../package.json"
60
60
  },
61
- "gitHead": "e3b53eca637c956b6cf7ff043f45dfe5737693be"
61
+ "gitHead": "d195e40bc01b2ea8e99bb4782902bc85a7b128b4"
62
62
  }