Skip to content

Instantly share code, notes, and snippets.

@sgsfak
Created February 11, 2014 13:01
Show Gist options
  • Save sgsfak/8934431 to your computer and use it in GitHub Desktop.
Save sgsfak/8934431 to your computer and use it in GitHub Desktop.
Parses an SCP-ECG file and prints the demographics/data acquisition information (in Section 1)
var fs = require('fs')
var DEBUG = true;
var log = console.log;
if (!DEBUG)
log = function() {};
function parse_scp_time(fval) {
var hour = fval.readInt8(0);
var min = fval.readInt8(1);
var sec = fval.readInt8(2);
return hour + ":" + min + ":" + sec;
}
function parse_scp_date(fval) {
var year = fval.readUInt16LE(0);
var month = fval.readInt8(2);
var day = fval.readInt8(3);
return day + "/" + month + "/"+ year;
}
function parse_scp_ecg_demo(b) {
var secHdrLen = 16;
var ptrFldLen = 2 + 4 + 4; // Section Number | Section Length | Index to section
var section0_start = 6;
var section0_data_start = section0_start + secHdrLen;
var ptrFld1_start = section0_data_start + ptrFldLen; // Move over Section0 pointer field
var section1_len = b.readUInt32LE(ptrFld1_start + 2);
var section1_start = b.readUInt32LE(ptrFld1_start + 2 + 4)-1; // It appers to be 1-based not 0-based pointer
var section1_end = section1_start+section1_len;
// var section1_hdr = b.slice(section1_start, section1_start +secHdrLen);
// var section1_data = b.slice(section1_start+secHdrLen, section1_end);
// log('== Section ' + section1_hdr.readUInt16LE(2));
var fstart = section1_start + secHdrLen;
var js = {};
while (fstart < section1_end) {
var tag = b.readUInt8(fstart);
if (tag == 255) {
// log('Found Demographic section terminator!');
break;
}
var flen = b.readUInt16LE(fstart+1);
var val_start = fstart + 3;
var fval= b.slice(val_start, val_start+flen);
var val_str = fval.slice(0, flen-1).toString(); // Strings are null terminated!
var val_int = b.readUInt16LE(val_start);
var val_b = b.readUInt8(val_start);
//log(tag + " (" + flen + ") ==>" + b.readInt8(val_start));
switch (tag) {
case 0: log('Last name: ' + val_str); js.lname = val_str; break;
case 1: log('First name: ' + val_str); js.fname = val_str; break;
case 2: log('Patient ID: ' + val_str); js.patid = val_str; break;
case 3: log('2nd Last name: ' + val_str); break;
case 4: log('Age: ' + val_int); js.age = val_int; break;
case 5: log('DoB: ' + parse_scp_date(fval)); break;
case 6: log('Height: ' + val_int + "cm"); js.height = val_int; break;
case 7: log('Weight: ' + val_int + "kg"); js.weight = val_int; break;
case 8: log('Sex: ' + (val_b==1? "Male" : (val_b==2 ? "Female" : "Other"))); break;
case 11: log('Sys Pressure: ' + val_int + "mmHg"); js.syspres = val_int; break;
case 12: log('Dia Pressure: ' + val_int + "mmHg"); js.diapres = val_int; break;
case 25: log('Date of Acq. : ' + parse_scp_date(fval)); break;
case 26: log('Time of Acq. : ' + parse_scp_time(fval)); break;
default:
//log(tag + " (" + flen + ") ==>" + val_str);
}
fstart = fstart + 3 + flen;
}
return js;
}
var fns = ['ECGSamples/scp_redred/P120N00.scp'];
var args = process.argv.slice(2);
if (args.length > 0)
fns = args;
fns.forEach(function(fn) {
fs.readFile(fn, function (err, data) {
if (err)
throw err;
log("====== " + fn );
var js = parse_scp_ecg_demo(data);
if (!DEBUG) {
console.log(fn +"==> " + JSON.stringify(js));
}
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment