brukerconverter
Advanced tools
Comparing version 0.2.0 to 1.0.0
{ | ||
"name": "brukerconverter", | ||
"version": "0.1.1", | ||
"version": "1.0.0", | ||
"main": "build/brukerconverter.js", | ||
@@ -10,9 +10,2 @@ "homepage": "https://github.com/cheminfo-js/brukerconverter", | ||
"description": "Parse and convert Bruker raw data", | ||
<<<<<<< HEAD | ||
"main": [ | ||
"dist/brukerconverter.js", | ||
"dist/brukerconverter.min.js" | ||
] | ||
======= | ||
>>>>>>> origin/master | ||
"moduleType": [ | ||
@@ -19,0 +12,0 @@ "amd", |
{ | ||
"name": "brukerconverter", | ||
"version": "0.2.0", | ||
"version": "1.0.0", | ||
"description": "Parse and convert Bruker raw data", | ||
@@ -32,5 +32,5 @@ "main": "./src/brukerconverter.js", | ||
"iobuffer": "^2.0.0", | ||
"jcampconverter": "^2.1.0", | ||
"jcampconverter": "^2.3.0", | ||
"jszip": "^2.5.0" | ||
} | ||
} |
@@ -13,2 +13,4 @@ "use strict"; | ||
function readZIP(zipFile, options) { | ||
options = options || {}; | ||
var zip = new JSZip(); | ||
@@ -22,12 +24,16 @@ zip.load(zipFile, options); | ||
'acqu2s': TEXT, | ||
'pdata/1/procs': TEXT, | ||
'pdata/1/proc2s': TEXT, | ||
'pdata/1/1r': BINARY, | ||
'pdata/1/1i': BINARY, | ||
'pdata/1/2rr': BINARY | ||
'procs': TEXT, | ||
'proc2s': TEXT, | ||
'1r': BINARY, | ||
'1i': BINARY, | ||
'2rr': BINARY | ||
}; | ||
var folders = zip.filter(function (relativePath, file) { | ||
if(relativePath.indexOf("ser")>=0||relativePath.indexOf("fid")>=0 | ||
||relativePath.indexOf("1r")>=0||relativePath.indexOf("2rr")>=0){ | ||
return true; | ||
} | ||
var folders = zip.filter(function (relativePath, file) { | ||
if(/^\d+$/.test(relativePath.substr(0, relativePath.length - 1))) | ||
return true | ||
return false; | ||
}); | ||
@@ -39,7 +45,8 @@ | ||
var len = folders[i].name.length; | ||
var currFolder = zip.folder(folders[i].name.substr(0, len - 1)); | ||
var name = folders[i].name; | ||
name = name.substr(0,name.lastIndexOf("/")+1); | ||
var currFolder = zip.folder(name); | ||
var currFiles = currFolder.filter(function (relativePath, file) { | ||
return files[relativePath] ? true : false; | ||
}); | ||
var brukerFiles = {}; | ||
@@ -50,3 +57,3 @@ | ||
var name = currFiles[j].name.substr(idx + 1); | ||
if(files[name] === BINARY || files['pdata/1/' + name] === BINARY) { | ||
if(files[name] === BINARY) { | ||
brukerFiles[name] = new IOBuffer(currFiles[j].asArrayBuffer()); | ||
@@ -57,4 +64,4 @@ } else { | ||
} | ||
spectra[i] = convert(brukerFiles); | ||
//console.log(folders[i].name); | ||
spectra[i] = {"filename":folders[i].name,value:convert(brukerFiles,options)}; | ||
} | ||
@@ -65,15 +72,53 @@ | ||
function convert(brukerFiles) { | ||
function convert(brukerFiles, options) { | ||
options = options || {}; | ||
var start = new Date(); | ||
var result; | ||
if(brukerFiles['ser'] || brukerFiles['2rr']) { | ||
return convert2D(brukerFiles); | ||
result = convert2D(brukerFiles, options); | ||
} else if(brukerFiles['1r'] || brukerFiles['1i'] || brukerFiles['fid']) { | ||
return convert1D(brukerFiles); | ||
result = convert1D(brukerFiles, options); | ||
} else { | ||
throw new RangeError('The current files are invalid'); | ||
} | ||
if (result.twoD && !options.noContours) { | ||
//console.log("Countours"); | ||
add2D(result); | ||
if (result.profiling) result.profiling.push({ | ||
action: 'Finished countour plot calculation', | ||
time: new Date() - start | ||
}); | ||
if (!options.keepSpectra) { | ||
delete result.spectra; | ||
} | ||
} | ||
var spectra = result.spectra; | ||
if (options.xy) { // the spectraData should not be a oneD array but an object with x and y | ||
if (spectra.length > 0) { | ||
for (var i=0; i<spectra.length; i++) { | ||
var spectrum=spectra[i]; | ||
if (spectrum.data.length>0) { | ||
for (var j=0; j<spectrum.data.length; j++) { | ||
var data=spectrum.data[j]; | ||
var newData={x: new Array(data.length/2), y:new Array(data.length/2)}; | ||
for (var k=0; k<data.length; k=k+2) { | ||
newData.x[k/2]=data[k]; | ||
newData.y[k/2]=data[k+1]; | ||
} | ||
spectrum.data[j]=newData; | ||
} | ||
} | ||
} | ||
} | ||
} | ||
return result; | ||
} | ||
function convert1D(files) { | ||
function convert1D(files, options) { | ||
if(files['1r'] || files['1i']) { | ||
var result = parseData(files["procs"]); | ||
var result = parseData(files["procs"], options); | ||
@@ -87,4 +132,4 @@ if(files['1r']) { | ||
} else if(files['fid']) { | ||
result = parseData(files['procs']); | ||
var temp = parseData(files['acqus']); | ||
result = parseData(files['procs'], options); | ||
var temp = parseData(files['acqus'], options); | ||
@@ -98,3 +143,2 @@ var keys = Object.keys(temp.info); | ||
} | ||
setFIDSpectrumData(files['fid'], result) | ||
@@ -105,34 +149,54 @@ } | ||
function convert2D(files) { | ||
function convert2D(files, options) { | ||
var SF,SW_p,offset; | ||
if(files['2rr']) { | ||
var result = parseData(files['procs']); | ||
var temp = parseData(files['proc2s']); | ||
var result = parseData(files['procs'], options); | ||
var temp = parseData(files['proc2s'], options); | ||
result.info.nbSubSpectra = temp.info['$SI'] = parseInt(temp.info['$SI']); | ||
SF = temp.info['$SF'] = parseFloat(temp.info['$SF']); | ||
SW_p = temp.info['$SWP'] = parseFloat(temp.info['$SWP']); | ||
offset = temp.info['$OFFSET'] = parseFloat(temp.info['$OFFSET']); | ||
} else if(files['ser']) { | ||
result = parseData(files['acqus']); | ||
temp = parseData(files['acqu2s']); | ||
result = parseData(files['acqus'], options); | ||
temp = parseData(files['acqu2s'], options); | ||
result.info.nbSubSpectra = temp.info['$SI'] = parseInt(temp.info['$TD']); | ||
result.info['$SI'] = parseInt(result.info['$TD']); | ||
SW_p = temp.info['$SWH'] = parseFloat(temp.info['$SWH']); | ||
result.info["$SWP"]=result.info["$SWH"]; | ||
result.info["$SF"]=parseFloat(temp.info['$SFO1']); | ||
result.info['$OFFSET']=0; | ||
SF = temp.info['$SFO2'] = parseFloat(temp.info['$SFO2']); | ||
offset=0; | ||
result.info['$AXNUC']=result.info['$NUC1']; | ||
temp.info['$AXNUC']=temp.info['$NUC1']; | ||
} | ||
result.info.nbSubSpectra = temp.info['$SI'] = parseInt(temp.info['$SI']); | ||
var SW_p = temp.info['$SWP'] = parseFloat(temp.info['$SWP']); | ||
var SF = temp.info['$SF'] = parseFloat(temp.info['$SF']); | ||
var offset = temp.info['$OFFSET'] = parseFloat(temp.info['$OFFSET']); | ||
result.info.firstY = offset; | ||
result.info.lastY = offset - SW_p / SF; | ||
result.info['$BF2'] = SF; | ||
result.info['$SF01'] = SF; | ||
result.info['$SFO1'] = SF; | ||
var nbSubSpectra = result.info.nbSubSpectra; | ||
var pageValue = result.info.firstY; | ||
var deltaY = (result.info.lastY-result.info.firstY)/(nbSubSpectra-1); | ||
if(files['2rr']) { | ||
setXYSpectrumData(files['2rr'], result, '2rr', true); | ||
result.spectra[0].setYUnits = 'PPM'; | ||
} else if(files['ser']) { | ||
setXYSpectrumData(files['ser'], result, 'ser', true); | ||
result.spectra[0].setYUnits = 'HZ'; | ||
} | ||
var dataType = files['ser'] ? 'TYPE_2DNMR_FID' : 'TYPE_2DNMR_SPECTRUM'; | ||
for(var i = 0; i < result.spectra.length; ++i) { | ||
result.spectra[i].DataType = dataType; | ||
for(var i = 0; i < nbSubSpectra; i++) { | ||
pageValue+=deltaY; | ||
result.spectra[i].pageValue=pageValue; | ||
if(files['2rr']) { | ||
result.spectra[i].setYUnits = 'PPM'; | ||
} else if(files['ser']) { | ||
result.spectra[i].setYUnits = 'HZ'; | ||
} | ||
} | ||
var dataType = files['ser'] ? 'TYPE_2DNMR_FID' : 'TYPE_2DNMR_SPECTRUM'; | ||
result.info['2D_Y_NUCLEUS'] = temp.info['$AXNUC']; | ||
@@ -145,2 +209,4 @@ result.info['2D_X_NUCLEUS'] = result.info['$AXNUC']; | ||
result.twoD = true; | ||
return result; | ||
@@ -154,3 +220,4 @@ } | ||
var SF = parseFloat(spectra.info["$SF"]); | ||
var BF = parseFloat(spectra.info["$BF1"]); | ||
var BF = SF; | ||
//var BF = parseFloat(spectra.info["$BF1"]); | ||
var offset = spectra.shiftOffsetVal;//parseFloat(spectra.info["$OFFSET"]); | ||
@@ -160,3 +227,3 @@ | ||
spectra.info["$BF1"] = BF; | ||
spectra.info["$SF01"] = SF; | ||
spectra.info["$SFO1"] = SF; | ||
spectra.info.brukerReference = BF; | ||
@@ -170,5 +237,2 @@ | ||
//console.log(file); | ||
//console.log(""); | ||
if(endian) | ||
@@ -179,7 +243,7 @@ file.setLittleEndian(); | ||
//spectra.spectra = new Array(nbSubSpectra); | ||
for(var i = 0; i < nbSubSpectra; ++i) { | ||
for(var i = 0; i < nbSubSpectra; i++) { | ||
var toSave = { | ||
dataType : "NMR Spectrum", | ||
dataTable : "(X++(R..R))", | ||
nbPoints : td, | ||
firstX : offset, | ||
@@ -189,3 +253,7 @@ lastX : offset - SW_p / SF, | ||
yUnit : "Arbitrary", | ||
data:[{x:new Array(td),y:new Array(td)}] | ||
data:[new Array(td*2)],//[{x:new Array(td),y:new Array(td)}], | ||
isXYdata:true, | ||
observeFrequency:SF, | ||
title:spectra.info['TITLE'], | ||
deltaX:-(SW_p / SF)/(td-1) | ||
@@ -195,15 +263,23 @@ }; | ||
var x = offset; | ||
var deltaX = toSave.deltaX; | ||
if(real) { | ||
for(var k = 0; k < td - 1; ++k) { | ||
toSave.data[0].x[k] = x; | ||
toSave.data[0].y[k] = file.readInt32(); | ||
x += SF; | ||
for(var k = 0; k < td; ++k) { | ||
toSave.data[0][2*k] = x; | ||
toSave.data[0][2*k+1] = file.readInt32(); | ||
if(toSave.data[0][2*k+1]===null||isNaN(toSave.data[0][2*k+1])){ | ||
toSave.data[0][2*k+1] = 0; | ||
} | ||
x += deltaX; | ||
} | ||
} else { | ||
for(k = td - 1; k > 0; --k) { | ||
toSave.data[0].x[k] = x; | ||
toSave.data[0].y[k] = file.readInt32(); | ||
x += SF; | ||
for(k = td - 1; k >= 0; --k) { | ||
toSave.data[0][2*k] = x; | ||
toSave.data[0][2*k+1] = file.readInt32(); | ||
if(toSave.data[0][2*k+1]===null||isNaN(toSave.data[0][2*k+1])) { | ||
toSave.data[0][2*k+1] = 0; | ||
} | ||
x += deltaX; | ||
} | ||
} | ||
spectra.spectra.push(toSave); | ||
@@ -213,5 +289,7 @@ } | ||
function parseData(file) { | ||
function parseData(file, options) { | ||
var keepRecordsRegExp=/.*/; | ||
if (options.keepRecordsRegExp) keepRecordsRegExp=options.keepRecordsRegExp; | ||
return Converter.convert(file, { | ||
keepRecordsRegExp:/.*/ | ||
keepRecordsRegExp:keepRecordsRegExp | ||
}); | ||
@@ -222,19 +300,18 @@ } | ||
var td = spectra.info['$TD'] = parseInt(spectra.info['$TD']); | ||
var SW_p = spectra.info['$SWP'] = parseFloat(spectra.info['$SWP']); | ||
if(SW_p !== 0) { | ||
spectra.info['$SWH'] = SW_p; | ||
} | ||
var SW_h = spectra.info['$SWH'] = parseFloat(spectra.info['$SWH']); | ||
var SW = spectra.info['$SW'] = parseFloat(spectra.info['$SW']); | ||
var SF = spectra.info['$SF01'] = parseFloat(spectra.info['$SF01']); | ||
var BF = spectra.info['$BF1'] = parseFloat(spectra.info['$BF1']); | ||
var SF = spectra.info['$SFO1'] = parseFloat(spectra.info['$SFO1']); | ||
var BF = parseFloat(spectra.info['$BF1']); | ||
spectra.info['$BF1'] = BF; | ||
spectra.info['$SF'] = parseFloat(spectra.info['$SF']); | ||
if(spectra.info['$SF'] !== 0) { | ||
BF = spectra.info['$SF']; | ||
} | ||
//var DW = 1 / (2 * SW_h); | ||
//var AQ = td * DW; | ||
var AQ = SW; | ||
var DW = AQ/(td-1); | ||
var DW = 1 / (2 * SW_h); | ||
var AQ = td * DW; | ||
//console.log(DW+" "+SW+" "+td); | ||
var endian = parseInt(spectra.info["$BYTORDP"]); | ||
@@ -258,3 +335,7 @@ endian = endian ? 0 : 1; | ||
yUnit : "Arbitrary", | ||
data:[{x:new Array(td),y:new Array(td)}] | ||
data:[new Array(2*td)],//[{x:new Array(td),y:new Array(td)}], | ||
isXYdata:true, | ||
observeFrequency:SF, | ||
title:spectra.info['TITLE'], | ||
deltaX:DW | ||
}; | ||
@@ -266,17 +347,191 @@ spectra.spectra.push(toSave); | ||
var y; | ||
for(i = 0; file.available(8); ++i, x += DW) { | ||
spectra.spectra[0].data[0].y[i] = file.readInt32(); | ||
spectra.spectra[0].data[0].x[i] = x; | ||
spectra.spectra[1].data[0].y[i] = file.readInt32(); | ||
spectra.spectra[1].data[0].x[i] = x; | ||
y = file.readInt32(); | ||
if(y===null || isNaN(y)){ | ||
y=0; | ||
} | ||
spectra.spectra[0].data[0][2*i+1] = y; | ||
spectra.spectra[0].data[0][2*i] = x; | ||
y = file.readInt32(); | ||
if(y===null || isNaN(y)){ | ||
y=0; | ||
} | ||
if(y===null || isNaN(y)){ | ||
y=0; | ||
} | ||
spectra.spectra[1].data[0][2*i+1] = y; | ||
spectra.spectra[1].data[0][2*i] = x; | ||
} | ||
for(; i < td; ++i, x += DW) { | ||
spectra.spectra[0].data[0].y[i] = 0; | ||
spectra.spectra[0].data[0].x[i] = x; | ||
spectra.spectra[1].data[0].y[i] = 0; | ||
spectra.spectra[1].data[0].x[i] = x; | ||
spectra.spectra[0].data[0][2*i+1] = 0; | ||
spectra.spectra[0].data[0][2*i] = x; | ||
spectra.spectra[1].data[0][2*i+1] = 0; | ||
spectra.spectra[1].data[0][2*i] = x; | ||
} | ||
} | ||
/** | ||
* Those functions should disappear if add2D becomes accessible in jcampconvert | ||
* @param spectra | ||
* @returns {{z: Array, minX: *, maxX: *, minY: *, maxY: *, minZ: *, maxZ: *, noise: number}} | ||
*/ | ||
function convertTo3DZ(spectra) { | ||
var noise = 0; | ||
var minZ = spectra[0].data[0][0]; | ||
var maxZ = minZ; | ||
var ySize = spectra.length; | ||
var xSize = spectra[0].data[0].length / 2; | ||
var z = new Array(ySize); | ||
for (var i = 0; i < ySize; i++) { | ||
z[i] = new Array(xSize); | ||
for (var j = 0; j < xSize; j++) { | ||
z[i][j] = spectra[i].data[0][j * 2 + 1]; | ||
if (z[i][j] < minZ) minZ = spectra[i].data[0][j * 2 + 1]; | ||
if (z[i][j] > maxZ) maxZ = spectra[i].data[0][j * 2 + 1]; | ||
if (i !== 0 && j !== 0) { | ||
noise += Math.abs(z[i][j] - z[i][j - 1]) + Math.abs(z[i][j] - z[i - 1][j]); | ||
} | ||
} | ||
} | ||
return { | ||
z: z, | ||
minX: spectra[0].data[0][0], | ||
maxX: spectra[0].data[0][spectra[0].data[0].length - 2], | ||
minY: spectra[0].pageValue, | ||
maxY: spectra[ySize - 1].pageValue, | ||
minZ: minZ, | ||
maxZ: maxZ, | ||
noise: noise / ((ySize - 1) * (xSize - 1) * 2) | ||
}; | ||
} | ||
function add2D(result) { | ||
var zData = convertTo3DZ(result.spectra); | ||
result.contourLines = generateContourLines(zData); | ||
delete zData.z; | ||
result.minMax = zData; | ||
} | ||
function generateContourLines(zData, options) { | ||
//console.time('generateContourLines'); | ||
var noise = zData.noise; | ||
var z = zData.z; | ||
var contourLevels = []; | ||
var nbLevels = 7; | ||
var povarHeight = new Float32Array(4); | ||
var isOver = []; | ||
var nbSubSpectra = z.length; | ||
var nbPovars = z[0].length; | ||
var pAx, pAy, pBx, pBy; | ||
var x0 = zData.minX; | ||
var xN = zData.maxX; | ||
var dx = (xN - x0) / (nbPovars - 1); | ||
var y0 = zData.minY; | ||
var yN = zData.maxY; | ||
var dy = (yN - y0) / (nbSubSpectra - 1); | ||
var minZ = zData.minZ; | ||
var maxZ = zData.maxZ; | ||
//System.out.prvarln('y0 '+y0+' yN '+yN); | ||
// ------------------------- | ||
// Povars attribution | ||
// | ||
// 0----1 | ||
// | / | | ||
// | / | | ||
// 2----3 | ||
// | ||
// ---------------------d------ | ||
var lineZValue; | ||
for (var level = 0; level < nbLevels * 2; level++) { // multiply by 2 for positif and negatif | ||
var contourLevel = {}; | ||
contourLevels.push(contourLevel); | ||
var side = level % 2; | ||
if (side === 0) { | ||
lineZValue = (maxZ - 5 * noise) * Math.exp(level / 2 - nbLevels) + 5 * noise; | ||
} else { | ||
lineZValue = -(maxZ - 5 * noise) * Math.exp(level / 2 - nbLevels) - 5 * noise; | ||
} | ||
var lines = []; | ||
contourLevel.zValue = lineZValue; | ||
contourLevel.lines = lines; | ||
if (lineZValue <= minZ || lineZValue >= maxZ) continue; | ||
for (var iSubSpectra = 0; iSubSpectra < nbSubSpectra - 1; iSubSpectra++) { | ||
for (var povar = 0; povar < nbPovars - 1; povar++) { | ||
povarHeight[0] = z[iSubSpectra][povar]; | ||
povarHeight[1] = z[iSubSpectra][povar + 1]; | ||
povarHeight[2] = z[(iSubSpectra + 1)][povar]; | ||
povarHeight[3] = z[(iSubSpectra + 1)][(povar + 1)]; | ||
for (var i = 0; i < 4; i++) { | ||
isOver[i] = (povarHeight[i] > lineZValue); | ||
} | ||
// Example povar0 is over the plane and povar1 and | ||
// povar2 are below, we find the varersections and add | ||
// the segment | ||
if (isOver[0] !== isOver[1] && isOver[0] !== isOver[2]) { | ||
pAx = povar + (lineZValue - povarHeight[0]) / (povarHeight[1] - povarHeight[0]); | ||
pAy = iSubSpectra; | ||
pBx = povar; | ||
pBy = iSubSpectra + (lineZValue - povarHeight[0]) / (povarHeight[2] - povarHeight[0]); | ||
lines.push(pAx * dx + x0, pAy * dy + y0, pBx * dx + x0, pBy * dy + y0); | ||
} | ||
if (isOver[3] !== isOver[1] && isOver[3] !== isOver[2]) { | ||
pAx = povar + 1; | ||
pAy = iSubSpectra + 1 - (lineZValue - povarHeight[3]) / (povarHeight[1] - povarHeight[3]); | ||
pBx = povar + 1 - (lineZValue - povarHeight[3]) / (povarHeight[2] - povarHeight[3]); | ||
pBy = iSubSpectra + 1; | ||
lines.push(pAx * dx + x0, pAy * dy + y0, pBx * dx + x0, pBy * dy + y0); | ||
} | ||
// test around the diagonal | ||
if (isOver[1] !== isOver[2]) { | ||
pAx = povar + 1 - (lineZValue - povarHeight[1]) / (povarHeight[2] - povarHeight[1]); | ||
pAy = iSubSpectra + (lineZValue - povarHeight[1]) / (povarHeight[2] - povarHeight[1]); | ||
if (isOver[1] !== isOver[0]) { | ||
pBx = povar + 1 - (lineZValue - povarHeight[1]) / (povarHeight[0] - povarHeight[1]); | ||
pBy = iSubSpectra; | ||
lines.push(pAx * dx + x0, pAy * dy + y0, pBx * dx + x0, pBy * dy + y0); | ||
} | ||
if (isOver[2] !== isOver[0]) { | ||
pBx = povar; | ||
pBy = iSubSpectra + 1 - (lineZValue - povarHeight[2]) / (povarHeight[0] - povarHeight[2]); | ||
lines.push(pAx * dx + x0, pAy * dy + y0, pBx * dx + x0, pBy * dy + y0); | ||
} | ||
if (isOver[1] !== isOver[3]) { | ||
pBx = povar + 1; | ||
pBy = iSubSpectra + (lineZValue - povarHeight[1]) / (povarHeight[3] - povarHeight[1]); | ||
lines.push(pAx * dx + x0, pAy * dy + y0, pBx * dx + x0, pBy * dy + y0); | ||
} | ||
if (isOver[2] !== isOver[3]) { | ||
pBx = povar + (lineZValue - povarHeight[2]) / (povarHeight[3] - povarHeight[2]); | ||
pBy = iSubSpectra + 1; | ||
lines.push(pAx * dx + x0, pAy * dy + y0, pBx * dx + x0, pBy * dy + y0); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
// console.timeEnd('generateContourLines'); | ||
return { | ||
minX: zData.minX, | ||
maxX: zData.maxX, | ||
minY: zData.minY, | ||
maxY: zData.maxY, | ||
segments: contourLevels | ||
}; | ||
//return contourLevels; | ||
} | ||
module.exports = { | ||
@@ -283,0 +538,0 @@ convertZip: readZIP, |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
21271
475
1
2
Updatedjcampconverter@^2.3.0